【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
相关推荐
蒹葭玉树3 天前
【C++上岸】C++常见面试题目--操作系统篇(第三十期)
c++·面试·risc-v
国科安芯5 天前
面向星载芯片原子钟的RISC-V架构MCU抗辐照特性研究及可靠性分析
单片机·嵌入式硬件·架构·制造·risc-v·pcb工艺·安全性测试
思尔芯S2C8 天前
FPGA原型验证实战:如何应对外设连接问题
fpga开发·risc-v·soc设计·prototyping·原型验证
加强洁西卡8 天前
【RISC-V】从C到可执行文件分析链接重定位的过程
c语言·开发语言·risc-v
硬汉嵌入式8 天前
基于Rust构建的单片机Ariel RTOS,支持Cortex-M、RISC-V 和 Xtensa
单片机·rust·risc-v
MounRiver_Studio8 天前
RISC-V IDE MRS2进阶分享(三):MRS语言服务器
ide·mcu·risc-v·嵌入式开发
加强洁西卡8 天前
【RISC-V】解决链接器加入全局变量优化后操作系统无法启动的问题
risc-v
MounRiver_Studio8 天前
RISC-V IDE MRS2进阶分享(四):CH32H417双核芯片项目开发
ide·mcu·risc-v·嵌入式开发
加强洁西卡8 天前
【RISC-V】区分加载地址、链接地址、运行地址
risc-v
飞凌嵌入式9 天前
1块集成了4核Cortex-A7高性能CPU、1颗RISC-V MCU、多种高速总线、还兼容树莓派的T153低成本开发板
linux·arm开发·嵌入式硬件·risc-v