【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
相关推荐
高新打工人1 天前
RISC-V(五):xceptions, Traps, and Interrupts介绍
risc-v
m0_747124533 天前
RISC-V 基础知识扫盲
risc-v
W_LuYi1855 天前
手撸极简zkEVM验证器:RISC-V电路实践
java·risc-v
大唐游子14 天前
MIT 6.1810 开发环境搭建(Xv6)
risc-v
nvd1114 天前
绝地求生:如何在 2026 年把 OpenAI Codex 强行交叉编译到 RISC-V 架构
架构·risc-v
Eloudy15 天前
可在开源 RISC-V 上的裸机操作系统
开源·risc-v
hai31524754316 天前
RISC-V核E203核前向旁路的架构性顽疾
驱动开发·架构·硬件架构·硬件工程·risc-v
时光飞逝的日子16 天前
基于 RISC-V 架构的边缘 AI 推理引擎优化设计
risc-v·模型量化·推理引擎·边缘 ai·向量扩展·低功耗优化
国科安芯17 天前
基于RISC-V架构的商业航天级MCU国产化技术路径与产业生态研究
网络·分布式·单片机·嵌入式硬件·架构·risc-v·安全性测试
国科安芯17 天前
AS32S601商业航天级抗辐照MCU芯片:架构设计与技术特性研究
单片机·嵌入式硬件·算法·安全·架构·risc-v