.attribute stack_align, 16 .text .align 1 .globl Leaf .type Leaf, @function Leaf: addi sp,sp,-48 # 修改 stack, 降低以 push 值 sw s0,44(sp) # 把 s0 写进 44(sp), s0 这里代表frame pointeraddi s0,sp,48 # s0 = sp + 48, s0 为 frame pointer sw a0,-36(s0) # 把 a0 - a...
12: 0141 addi sp,sp,16 14: 8082 ret 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 使用-O2 -fno-omit-frame-pointer 优化选项得到的编译结果,函数头部有sw s0,8(sp)和addi s0,sp,16,函数尾部有lw s0,8(sp),但是次序和前面...
addi addi rd, rs1, immediate x[rd] = x[rs1] + sext(immediate) 加立即数(Add Immediate). I-type, RV32I and RV64I. 把符号位扩展的立即数加到寄存器 x[rs1]上,结果写入 x[rd]。忽略算术溢出。 压缩形式:c.li rd, imm; c.addi rd, imm; c.addi16sp imm; c.addi4spn rd, imm ...
addi x10,x0,1 //return 1 addi sp,sp,16 //pop 2 items off stack jalr x0,0(x1) //return to caller L1: addi x10,x10,-1 //n>=1: argument gets(n-1) jal x1,FACT //call fact with(n-1) addi x6,x10,0 //return from jal:move result of fact(n-1) to x6 ld x10,0(sp) ...
栈指针寄存器:sp(x2) 全局指针寄存器:gp(x3) 线程指针寄存器:tp(x4) 参数传递 前8个参数:通过参数寄存器 a0-a7 传递。 超过8个参数:通过栈传递,超出的参数会依次压入栈中。 返回值 返回值:使用寄存器 a0 和 a1 返回。如果返回值超过两个寄存器的大小,则通过栈传递。
15 addi t1, t1, 1 16 sw t1, 0(t0) 17 li t2, 1 18 bgtu t1,t2,service_loop 19 20 csrw mscratch, sp 21 la sp, __irq_stack_top 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ...
ld s0,0(sp) addi sp,sp,16 jr ra .size main, .-main .ident "GCC: (GNU) 8.3.0" RISCV-汇编 RISCV-汇编 s0 - s11 保存寄存器 sp gp(global pointer) tp(thread pointer) fp(frame pointer,获取堆栈中的值) t0-t6 a0-a5(function arguments) s0(save register/frame pointer)-s1(save registe...
to restore any registers unique to the RISC-V implementation. */load_xt0,29*portWORD_SIZE( sp )/* mstatus */addit0,t0,0x08/* Set MIE bit so the first task starts with interrupts enabled - required as returns with ret not eret. */csrrwx0,mstatus,t0/* Interrupts enabled from here...
ld tp, 16(sp) ld t0, 24(sp) addi sp, sp, 32 csrrw x0, mstatus, x0 csrrw x0, mie, x0 mret 上述示例代码是一个通用的中断处理函数,它首先保存了一些重要的寄存器的状态,包括ra (返回地址寄存器)、gp (全局指针寄存器)、tp (线程指针寄存器)和t0 (临时寄存器)等。然后,它执行了中断处理的代...
addi x0,x0,0 ; 0 = 0 + 0,相当于 nop 空指令 RSIC-V 寄存器说明 5. RV32I 指令解读 5.1 算术与逻辑指令 在RV32I 中包括算术指令(add/sub)、数值比较指令(slt)、逻辑指令(and/or/xor)以及移位指令(sll/srl/sra)这几种指令。 这些指令和其他指令集差不多,它们从寄存器读取两个32位的值,并将32...