【RISC-V】branch_test调用add_test陷入死循环的原因

代码如下:

复制代码
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
相关推荐
蓝速科技5 天前
蓝速科技 RISC-V 鸿蒙信创终端全场景落地方案
科技·harmonyos·risc-v
国科安芯5 天前
ASC4T245S分组双向控制架构深度解析:独立DIR/OE控制、QFN16封装与混合方向总线桥接
单片机·嵌入式硬件·物联网·fpga开发·架构·risc-v
蓝速科技6 天前
蓝速科技 RISC-V 鸿蒙信创工控终端深度评测
科技·harmonyos·risc-v
tianyuanwo23 天前
深入解析 RISC-V 虚拟化中的 UEFI 固件配置:从 XML 到 NVRAM 的生命周期管理
xml·linux·risc-v
国科安芯25 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
高新打工人1 个月前
RISC-V(五):xceptions, Traps, and Interrupts介绍
risc-v
m0_747124531 个月前
RISC-V 基础知识扫盲
risc-v
W_LuYi1851 个月前
手撸极简zkEVM验证器:RISC-V电路实践
java·risc-v
大唐游子1 个月前
MIT 6.1810 开发环境搭建(Xv6)
risc-v
nvd111 个月前
绝地求生:如何在 2026 年把 OpenAI Codex 强行交叉编译到 RISC-V 架构
架构·risc-v