调用函数前,调用者需要保存这些寄存器的值。 被调用者保存(Callee-saved):保存寄存器(s0-s11)和返回地址寄存器(ra)。被调用函数需要保存和恢复这些寄存器的值。 # 调用者函数 caller_function: # 保存调用者保存寄存器 addi sp, sp, -16 sd ra, 8(sp) sd t0, 0(sp) # 设置参数并调用被调用者函数 li a0...
x8-x9,x18-x27寄存器:别名s0-s11,其中s0可用作栈帧指针(FP) x10-x17寄存器:别名a0-a7,在函数调用中传递参数和返回值 系统寄存器 用于系统控制和状态的寄存器,对处理器进行不同的功能配置。其指令编码的Bit[31:20]为csr字段,其中,[11:10]表示读写属性,[9:8]表示允许访问该系统寄存器的处理器模式,[7:0]用...
寄存器 通用寄存器 32个通用寄存器,x0 ~ x31代表。 x0 是 零值寄存器:读出来的值永远为 0 ,写入的值将会被丢弃。 1个返回地址寄存器:x1/ra 4 个指标寄存器: x2/sp x3/gp x4/tp x8/fp/s0:说明 fp 和 s0 是一个寄存器;如果用来作 fp ,就不能用作 s0 ; 12 个保存寄存器: s0 ~ s11 7 个临时存...
这里是别名的分类:zero, ra, sp, gp, tp, t0-t6, s0-s11, fp(s0), a0-a7。这里的别名在...
12个整数寄存器s0-s11,12个浮点寄存器fs0-fs11在调用过程是必须保持的,所以如果被调用者需要使用则必须由被调用者保存。 实际上上面的8和9.,t和s寄存器的可变volatile和保持preserved是对被调用者来说的,也就是对被调用者申明,告诉被调用者, t这些寄存器是可变的,那么被调用者可以随便使用,此时调用者则必须考虑...
12个整数寄存器s0-s11和12个浮点寄存器fs0-fs11在子程序退出时,需要保持其值与子程序调用前一样,因此如果被调用者(子程序)需要使用这些寄存器,则被调用者(子程序)必须先保存它们,然后在结束调用(子程序返回)前恢复其原值。
而RISC-V指令集,也是基于RISC原理建立的开放指令集架构(ISA)。两者区别可能在于,ARM标准授权方式只能根据自身需求,调整产品频率和功耗,不可以更改原有设计,以至于ARM架构文档冗长,指令数目复杂;RISC-V规避了这个缺点,架构文档页数仅有200多页,指令数目少,自由定制,操作方便。
这里会清除sp、gp、tp、t1-t6、s0-s11、a3-a7。注意保存设备数地址的a1、a2不会清除。 5.清除bss段 如果要想c语言执行起来,必须要做的事情有两个,一个是设置sp栈地址,另外就是清除bss段。 6.设置sp栈指针 这里栈的指针的地址也很有意思,设置的bss结尾,由于栈是向上增加的,所以预留栈的空间大小为2000。
寄存器是处理器中最常用的处理单元,RISC-V指令的操作数除了立即数就是寄存器。 RISC-V指令集包含了多种不同类型的寄存器,用于不同目的和功能: 对于rv32imafd架构而言,包含如下寄存器: 通用寄存器:32个通用整数寄存器,分别标记为x0-x31,如果是fd扩展,还有32 个独立的浮点寄存器,分别标记为f0-f31 ...