其指令编码的Bit[31:20]为csr字段,其中,[11:10]表示读写属性,[9:8]表示允许访问该系统寄存器的处理器模式,[7:0]用于索引系统寄存器。 RV基础指令集 RV的指令集是最小最基础的指令集,依靠这些基础指令可以实现其他复杂指令的功能。 RV指令编码格式 RV的指令大致可分为6类: R类型:寄存器与寄存器间的算术指令 ...
1.RISC-V 调用约束 / 寄存器 RegisterABI NameDescription / 中文描述Saver x0 zero Zero constant / 常数 0 — x1 ra Return address / 返回地址 Caller x2 sp Stack pointer / 栈指针 — x3 gp Global pointer / 全局指针 — x4 tp Thread pointer / 线程指针 Callee x5-x7 t0-t2 Temporaries / 临时...
保存寄存器:s0-s11(x8, x9, x18-x27) 参数寄存器:a0-a7(x10-x17) 返回地址寄存器:ra(x1) 注意:不是返回值,call函数的时候的下一条指令 栈指针寄存器:sp(x2) 全局指针寄存器:gp(x3) 线程指针寄存器:tp(x4) 参数传递 前8个参数:通过参数寄存器 a0-a7 传递。 超过8个参数:通过栈传递,超出的参数会依次压...
1.1 通用整数寄存器 RISC-V 架构提供32个通用寄存器x0-x31,其中x0 有些特殊,x0 寄存器被设置为硬件连线的常数0,读恒为0,写无效,这个寄存器在一些地方很有作用,因为程序运行中常数0的使用频率非常高,所以专门用一个寄存器来存放常数0,并没有浪费寄存器数量,并且使得编译器工作更加简便,这一点也是RISC-V架构优雅...
rs1:源寄存器1 rs2:源寄存器2 rd:目标寄存器(RSIC-V 一个指令可以提供三个寄存器操作) 六种指令格式作用如下: 4.寄存器 在RISC-V 的规范里面定义了32 个通用寄存器。其中31个是常规寄存器,1个恒为0值的x0寄存器。 0值寄存器是为了满足汇编语言程序员和编译器编写者的使用需要,他们可以使用x0寄存器作为操作数...
9. 初始化线程指针寄存器tp,tp寄存器保存init_task的值; 10. 在mmu使能之后,再一次初始化sp寄存器; 11. 调用soc_early_init函数,进行系统的早期初始化;这些函数在__soc_early_init_table中,也就是说函数被SOC_EARLY_INIT_DECLARE声明之后的函数,在链接时,都会添加到__soc_early_init_table表中。
RISC-V通用寄存器 RISC-V有x0 x31共32个通用寄存器,每个通用寄存器都有各自的用途,例如x2是作为sp栈指针、a0~a1用来保存函数参数或返回值。x0寄存器被硬编码为了0,就是个0值寄存器。 ABI名称相当于这些通用寄存器的别名,在RISC-V汇编当中,都使用ABI名称来代表这些寄存器。
csrrw tp, CSR_SCRATCH, tp bnez tp, _save_context _restore_kernel_tpsp: /* 把CSR_SCRATCH寄存器的值更新到tp寄存器中 注:第一次执行次语句时,tp寄存器的值被更新为init_task变量的地址*/ csrr tp, CSR_SCRATCH /* 把sp寄存器的值保存到内核线程init_task.thread_info.kernel_sp中 */ REG_S sp, ...
大多数的 RISC-V 伪指令依赖于 x0。因此, 把一个寄存器硬编码为 0 便于将许多常用指令——如跳转(jump)、返回(return)、等于 0 时转移(branch on equal to zero)——作为伪指令,进而简化 RISC-V 指令集。 图3.5 为经典的 C 程序 Hello World,编译器产生的汇编指令如图 3.6,其中使用了图 3.2 的调用...