代码如下:
add_test: add a0, a0, a1 nop ret .global branch_test branch_test: li a0, 1 li a1, 2 call add_test nop ret原因:原本寄存器ra存储的是父函数branch_test的返回地址,call add_test的时候把ra寄存器改成了存储子函数的返回地址,即下一条指令(nop指令)的地址,但父函数走完call后走nop走ret,因为ra寄存器的值,又回到了nop,然后ret......陷入死循环。
解决方法:
1、增加一个临时寄存器x18专门存放父函数的返回地址
add_test: add a0, a0, a1 nop ret .global branch_test branch_test: mv x18, ra li a0, 1 li a1, 2 call add_test nop mv ra, x18 ret2、在内存中开辟一个栈存储父函数的返回地址
add_test: add a0, a0, a1 nop ret .global branch_test branch_test: addi sp, sp, -8 sd ra, (sp) li a0, 1 li a1, 2 call add_test nop ld ra, (sp) addi sp, sp, 8 ret