【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
相关推荐
sinovoip1 天前
香蕉派开源社区联合进迭进空重磅打造: BPI‑SM10(K3-Com260) 和 K3 Pico‑ITX 计算机将于5月11日全球发货
人工智能·开源·risc-v
嵌入式小企鹅2 天前
RISC-V车规专委会成立、AI模型集中开源、半导体产能加速爬坡
人工智能·学习·ai·程序员·算力·risc-v·半导体
国科安芯2 天前
空间激光通信系统中抗辐射 MCU 芯片应用研究
单片机·嵌入式硬件·架构·risc-v·安全性测试
极创信息3 天前
信创领域五种主流CPU架构(X86 / ARM / RISC-V / MIPS / LoongArch)
java·arm开发·数据库·spring boot·mysql·软件工程·risc-v
嵌入式小企鹅4 天前
CPU需求变化、RISC-V安全方案、DeepSeek V4适配、太空算力动态
人工智能·驱动开发·华为·开源·算力·risc-v
国科安芯5 天前
商业航天与航空安全场景下抗辐射 MCU 选型、应用实践及发展趋势
单片机·嵌入式硬件·无人机·cocos2d·risc-v
国科安芯5 天前
空间辐射环境下抗辐射 MCU 可靠性机理及航空安全应用研究综述
单片机·嵌入式硬件·macos·无人机·cocos2d·risc-v
国科安芯6 天前
航空安全关键系统抗辐射 MCU 加固技术、工程实现与典型应用
单片机·嵌入式硬件·无人机·cocos2d·risc-v
Captain_Data6 天前
AI 12小时设计CPU完整解析:从219字到RISC-V内核的技术突破
人工智能·python·ai·大模型·芯片设计·risc-v
圆山猫8 天前
[RISCV] 用 Rust 写一个 RISC-V BootROM:从 QEMU 到真实硬件(2)
rust·risc-v