【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
相关推荐
爱分享的阿Q2 天前
RISC-V驱动开发合规解析
驱动开发·risc-v
嵌入式小企鹅3 天前
RISC-V爆发、AI编程变天、半导体涨价潮
物联网·学习·ai编程·开发工具·risc-v·芯片·工具链
BackCatK Chen4 天前
突破硅基极限!中国无极芯片技术解析:二维半导体如何实现后摩尔时代换道超车
risc-v·自主可控·后摩尔时代·无极芯片·二维半导体·二硫化钼·中国芯片
国科安芯5 天前
面向商业航天的高可靠电机控制系统:从环境约束到芯片实现
单片机·嵌入式硬件·架构·risc-v·安全性测试
嵌入式小企鹅5 天前
阿里编程模型赶超、半导体涨价蔓延、RISC-V新品密集上线
人工智能·学习·ai·程序员·risc-v·芯片
Kang.lee5 天前
2026.4.5【soc设计经验分享】soc信息安全之jtag鉴权
soc·risc-v·asic
fe7tQnVan5 天前
.NET 11 预览版 1 中的新兴架构演进:RISC-V 与 LoongArch 支持的深度技术解析与生态展望
架构·.net·risc-v
努力的章鱼bro6 天前
操作系统-net
c++·操作系统·dma·risc-v
努力的章鱼bro8 天前
操作系统-FileSystem
c++·操作系统·risc-v·filesystem
OpenAnolis小助手14 天前
玄铁 C950 发布!龙蜥社区加速 RISC-V 云计算落地
云计算·操作系统·龙蜥社区·risc-v