1.1 通用整数寄存器 RISC-V 架构提供32个通用寄存器x0-x31,其中x0 有些特殊,x0 寄存器被设置为硬件连线的常数0,读恒为0,写无效,这个寄存器在一些地方很有作用,因为程序运行中常数0的使用频率非常高,所以专门用一个寄存器来存放常数0,并没有浪费寄存器数量,并且使得编译器工作更加简便,这一点也是RISC-V架构优雅...
callee-saved 寄存器都会本着“谁污染,谁治理”的策略被保护起来,所以callee-saved register是safe的,也就是在 call后寄存器的值不会改变。。 而caller-saved 的寄存器有可能被污染(在 caller 并不保存的情况下),其实核心特性是unsafe,也就是“调用前后并能保证寄存器中的值不发生变化”,所以这种寄存器也被称为临时...
ra(x1):这是返回地址寄存器,它存储了函数调用后的返回地址。sp(x2):栈指针寄存器,它指向当前栈顶的位置。gp(x3):全局指针寄存器,它被用于访问全局变量。tp(x4):线程指针寄存器,用于线程本地存储。t0-t6(x5-x7, x28-x31):这些是临时寄存器,调用者需要负责保存它们。s0-s11(x8-x9, x18-x27...
ADD指令与RISC-V指令集讲解(2)I-Type整数寄存器-立即数指令中提到的ADDI指令的操作原理类似,唯一区别是原本是12位立即数的位置,拆分为了7位的funct7和5位的rs2。 ADD指令格式为ADD rd,rs1,rs2。x[rd] = x[rs1] + x[rs2] 如图2所示,ADD指令的funct7为000_0000,funct3为000。该指令是将rs1 + rs2...
是指在RISC-V架构中,寄存器是用来存储和处理数据的重要组成部分。RISC-V是一种开源指令集架构,具有简洁、灵活和可扩展的特点。 寄存器在RISC-V中分为整数寄存器和浮点寄存器两类。整数寄存器...
2.U-Type整数寄存器-立即数指令 这里介绍的两条U-type指令中的AUIPC不再是操作通用寄存器(x0-x31),而是对程序计数器(program counter,PC)进行操作。 图5是LUI和AUIPC的机器码格式,将其与I-type的机器码进行比较,可以看到该类型没有rs1和funct3,取而代之的是一个20位的立即数(I-type中12位立即数的位置包含...
main函数使用jal指令,跳转到函数a,并且设置了ra寄存器(这是jal指令的操作)。 接着在函数a()内,首先把ra寄存器的值存储到栈上,然后开始执行其他操作。 在函数a()将要返回的时候,从栈上取出ra的值,并设置到ra寄存器内,于是ret指令就能返回到main函数了。
你们现在对于这个表达应该都很熟悉了,这个表里面是RISC-V寄存器。寄存器是CPU或者处理器上,预先定义的可以用来存储数据的位置。寄存器之所以重要是因为汇编代码并不是在内存上执行,而是在寄存器上执行,也就是说,当我们在做add,sub时,我们是对寄存器进行操作。所以你们通常看到的汇编代码中的模式是,我们通过load将数据存...
1.2 寄存器寻址 指令中给出寄存器,操作数放在寄存器中,通常直接使用寄存器名表示它所保存的数据,即寄存器寻址。比如RISC-V的R-type指令: # 加操作, a1 = s0 + s1,这里a1 s0 s1都是寄存器寻址,对于RV32I可寻址范围为32个通用寄存器adda1, s1, s0