代码如下:
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
ret
2、在内存中开辟一个栈存储父函数的返回地址
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