You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译RV32i裸机C程序后,自研模拟器出现指令识别异常求助

RV32i模拟器反汇编识别未知指令问题排查

我正在开发一款基于C++的RV32i指令集RISC-V模拟器,工具链已正确安装。使用命令:

riscv32-unknown-elf-gcc testing_program.c -march=rv32i

编译无外部库依赖的简单测试程序后,通过riscv32-unknown-elf-objdump -d a.out > program.dump查看反汇编,结果显示所有指令均为合法RV32i指令,但将a.out放入自研模拟器时,模拟器的反汇编功能却识别出大量未知指令。部分反汇编示例如下:

a.out:     文件格式:elf32-littleriscv

反汇编.text节:

00010094 <exit>:
   10094:   ff010113            addi    sp,sp,-16
   10098:   00000593            li      a1,0
   1009c:   00812423            sw      s0,8(sp)
   100a0:   00112623            sw      ra,12(sp)
   100a4:   00050413            mv      s0,a0
   100a8:   289000ef            jal     10b30 <__call_exitprocs>
   100ac:   d481a783            lw      a5,-696(gp) # 12558 <__stdio_exit_handler>
   100b0:   00078463            beqz    a5,100b8 <exit+0x24>
   100b4:   000780e7            jalr    a5
   100b8:   00040513            mv      a0,s0
   100bc:   595010ef            jal     11e50 <_exit>

000100c0 <register_fini>:
   100c0:   00000793            li      a5,0
   100c4:   00078863            beqz    a5,100d4 <register_fini+0x14>
   100c8:   00012537            lui     a0,0x12
   100cc:   d1850513            addi    a0,a0,-744 # 11d18 <__libc_fini_array>
   100d0:   3950006f            j       10c64 <atexit>
   100d4:   00008067            ret

000100d8 <_start>:
   100d8:   00002197            auipc   gp,0x2
   100dc:   73818193            addi    gp,gp,1848 # 12810 <__global_pointer$>
   100e0:   d4818513            addi    a0,gp,-696 # 12558 <__stdio_exit_handler>
   100e4:   07018613            addi    a2,gp,112 # 12880 <__BSS_END__>
   100e8:   40a60633            sub     a2,a2,a0
   100ec:   00000593            li      a1,0

问题排查方向

  • 字节序处理错误:RV32i采用小端字节序,若模拟器读取4字节指令时按大端解析,会完全打乱指令编码。比如原指令ff010113按大端读取会变成130101ff,这显然不是合法RV32i指令。检查模拟器读取ELF文件.text节内容的逻辑,确保按小端字节序解析每个指令。

  • 默认链接标准库启动代码:GCC默认会链接crt0等启动文件,生成的ELF包含_start、exit等标准库函数代码。可以尝试编译时添加-nostdlib -static参数,生成仅包含用户代码的ELF文件,排除启动代码干扰:

    riscv32-unknown-elf-gcc testing_program.c -march=rv32i -nostdlib -static
    
  • 指令解析逻辑错误:检查模拟器中RV32i指令编码规则的实现:

    • 确认opcode提取逻辑正确(从指令低7位提取),比如auipc的opcode是0x17、jal是0x6f、lui是0x37。
    • 验证各类指令(R/I/S/U/J型)的立即数、寄存器字段解析是否符合RV32i规范。

内容的提问来源于stack exchange,提问作者Iker Rodríguez Hernández

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:02:16