a0-a7(x10-x17):这些寄存器用于传递函数参数。前8个参数通过这些寄存器传递,而多余的参数则通过栈来传递。ra(x1):这是返回地址寄存器,它存储了函数调用后的返回地址。sp(x2):栈指针寄存器,它指向当前栈顶的位置。gp(x3):全局指针寄存器,它被用于访问全局变量。tp(x4):线程指针寄存器,用于
例如“add a0,a1,a2”,其中 add 就是指令助记符,表示各种指令,add 是加法指令;a0 是目标寄存器,目标寄存器可以是任何通用寄存器;a1,a2 是源操作数 1 与源操作数 2,源操作数 1 可以是任何通用寄存器,源操作数 2 可以是任何通用寄存器和立即数。立即数就是写指令中的常数,比如 0、1、100、1024 等。 加法...
callee-saved 寄存器都会本着“谁污染,谁治理”的策略被保护起来,所以callee-saved register是safe的,也就是在 call后寄存器的值不会改变。。 而caller-saved 的寄存器有可能被污染(在 caller 并不保存的情况下),其实核心特性是unsafe,也就是“调用前后并能保证寄存器中的值不发生变化”,所以这种寄存器也被称为临时...
这里的目的地可能是内存中的某个地址,也可能是另一个寄存器。这就是通常使用寄存器的方法。 寄存器是用来进行任何运算和数据读取的最快的方式,这就是为什么使用它们很重要,也是为什么我们更喜欢使用寄存器而不是内存。当我们调用函数时,你可以看到这里有a0 - a7寄存器。通常我们在谈到寄存器的时候,我们会用它们的ABI...
参数寄存器:a0-a7(x10-x17) 返回地址寄存器:ra(x1) 注意:不是返回值,call函数的时候的下一条指令 栈指针寄存器:sp(x2) 全局指针寄存器:gp(x3) 线程指针寄存器:tp(x4) 参数传递 前8个参数:通过参数寄存器 a0-a7 传递。 超过8个参数:通过栈传递,超出的参数会依次压入栈中。
ori 指令是拿 a0 寄存器和立即数 0 进行或操作,由于立即数是 0,所以总是返回 a0 原本的数据;or 指令是拿 a0 和 a1 寄存器进行或操作,再把结果写入到 a0 寄存器。 VSCode 里,按下“F5”调试一下,如下所示: 上图中是执行完 ori a0,a0,0 指令之后,执行 jr ra 指令之前的状态。如果 a0 寄存器中的值确...
PC=0x80000168,识别到一个CSR指令,该指令需要使用源数据寄存器a0,此时上一条指令已经将其更新为8。 该CSR指令需要更新MSTATUS寄存器。 在下一周期,MSTATUS寄存器成功被更新为新值,表明功能达到预期。 由于目的数据寄存器的索引值是0,因此不需要写回。rf_wen为低。 下一步,我们将探索仿真一个真实的应用程序,看看...
1个返回地址寄存器:x1/ra 4 个指标寄存器: x2/sp x3/gp x4/tp x8/fp/s0:说明 fp 和 s0 是一个寄存器;如果用来作 fp ,就不能用作 s0 ; 12 个保存寄存器: s0 ~ s11 7 个临时存储寄存器: t0 ~ t6 8 个函数参数寄存器: a0 ~ a7 函数调用中是否需要保留寄存器的原来值? PC寄存器 RISC-V 汇编 ...
addi t0, a0,1234 1.2 寄存器寻址 指令中给出寄存器,操作数放在寄存器中,通常直接使用寄存器名表示它所保存的数据,即寄存器寻址。比如RISC-V的R-type指令: # 加操作, a1 = s0 + s1,这里a1 s0 s1都是寄存器寻址,对于RV32I可寻址范围为32个通用寄存器adda1, s1, s0 ...