下图来自riscv spec,附带PC寄存器(程序计数器,用来存储指向下一条指令的地址),寄存器的长度XLEN与架构有关(对于rv32:XLEN=32,对于rv64:XLEN=64)。 对于这些通用寄存器,除了x0外(x0 寄存器的值读恒为0,写无效),其它寄存器都本质上是等价的。但在实际使用过程中,我们约定了这些寄存器的用法,即ABI规范,见下表,...
数据地址为:寄存器址 + 偏移量,RISC-V支持寄存器相对寻址。 # x[rd] = sext(M[x[rs1] + sext(offset)][31:0]),数据地址为x[rs1] + sext(offset) lw rd, offset(rs1) 寄存器间接寻址(可采用寄存器相对寻址模拟实现) 寄存器存放的是数据的地址而非数据本身,RISC-V并不支持寄存器间接寻址,而是采用另...
x2寄存器:别名sp,栈指针寄存器,指向栈的地址 x3寄存器:别名gp,全局寄存器,用于链接器优化 x4寄存器:别名tp,线程寄存器,保存指向进程控制块的指针 x5-x7,x28-x31寄存器:别名t0-t6,临时寄存器 x8-x9,x18-x27寄存器:别名s0-s11,其中s0可用作栈帧指针(FP) x10-x17寄存器:别名a0-a7,在函数调用中传递参数和返回值 ...
一般地址要求根据data size对齐 另外RV64I中新增的跟地址相关的指令包括ld/sd,跟RV32I中的LOAD/STORE类似。所以可以认为RISC-V包括两种寻址模式,一种是PC相关寻址(jal、BRANCH),一种是寄存器寻址(jalr、LOAD/STORE)。不过实际上寄存器寻址可以再分成PC和绝对地址两种,这是通过结合auipc和lui指令来实现,如下面的汇编...
gp,globalpointer,全局指针寄存器,RISC-V 32个寄存器之一,为了优化±2KB内全局变量的访问。 gp寄存器在启动代码中加载为__global_pointer$的地址,并且之后不能被改变。 linker时使用__global_pointer$来比较全局变量的地址,如果在范围内,就替换掉 absolute/pc-relative寻址,变为gp-relative寻址,使得代码效率更高。该...
比如j跳转指令,RISC-V没有单独的j跳转指令,只有jal跳转链接指令,跳转之前总是要把下一条指令的地址拷贝到寄存器,但是如果用x0作为jal的操作寄存器,即把下一条指令的地址拷贝到x0,那么效果就等价于j跳转指令了,因为写入x0的任何值都是会...
id_ex:译码到执行之间的模块,用于将是否写寄存器的信号和寄存器数据打一拍后送到执行模块。 ex:执行模块,纯组合逻辑电路,根据具体的指令进行相应的操作,比如add指令就执行加法操作等。此外,如果是lw等访存指令的话,则会进行读内存操作,读内存也是采用异步读方式。最后将是否需要写寄存器、写寄存器地址,写寄存器数据信...
RISC-V支持两类存储器访问操作,分别是读(Load)和写(Store),这两个操作都需要源寄存器1的数据作为基地址,与指令编码中的立即数作为偏移量,共同计算得出访存操作的真实目的地址。如果是Store操作,则需要源操作数2作为待写入存储器的数据;如果是Load操作,则从存储器中读出来的数据将保存到目的寄存器中。
全局寄存器 x3/gp x3寄存器是RISC-V架构中的通用寄存器之一,通常用于存储全局指针(global pointer)。在RISC-V中,全局指针是一个特殊的指针,指向全局变量和静态数据区(static data region)的起始地址。 全局变量是在程序启动时就已经被分配好的变量,它们通常存储在静态数据区中,其内存地址在编译时就已经确定。全局指针...
RISC-V 指令格式为三操作数或者两操作数,操作数只能为立即数或寄存器; B类型分支跳转指令是在S类型基础上将立即数进行了旋转,J类型跳转指令是在U类型基础上将立即数进行了旋转,所以也可以认为RISC-V仅有4种指令类型; B型分支指令和J型跳转指令的地址需要左移1位(相当于乘以2),以获得更大的跳转范围。意味着:B型...