我正在开发一个 C++ RISC-V 模拟器,它模拟 rv32i ISA。我已安装工具链并正确生成文件。
我执行了这个命令:
riscv32-unknown-elf-gcc testing_program.c -march=rv32i
并阅读反汇编:
riscv32-unknown-elf-objdump -d a.out > program.dump
问题是,反汇编文件似乎只有 rv32i 指令(这是正确的),但是当我在具有反汇编功能的模拟器上使用 a.out 时,反汇编会抛出许多无法识别的指令。
程序很简单:
int main(){
int a = 1;
a = 1 + 2;
}
没有库,也没有包含,仅用于测试。
我不打算放反汇编文件,因为太长了,但它看起来像这样:
a.out: formato del fichero elf32-littleriscv
Desensamblado de la sección .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
正如“riscv32-unknown-elf-objdump”告诉您的那样,文件“a.out”是一个ELF文件。这种格式不仅仅包括二进制机器代码,这就是您在模拟器中看到的内容。
注意:“a.out”是链接的可执行文件的历史默认名称。您可能希望在构建时使用带有
-o
选项的真实姓名。
使用“riscv32-unknown-elf-objcopy”仅提取机器代码,如下所示(未经测试,因为我没有安装该工具链):
riscv32-unknown-elf-objcopy -O binary a.out a.bin
请查阅其文档以了解更多详细信息。