现在我正在尝试理解RISC-RISC,但是我对机器代码和程序集有一个不清楚的观点。
我编写了这样的C代码:
int main() {
return 42;
}然后,我通过以下命令生成了.s文件:
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -S 42.c
产出如下:
.file "42.c"
.option nopic
.text
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16
sd s0,8(sp)
addi s0,sp,16
li a5,42
mv a0,a5
ld s0,8(sp)
addi sp,sp,16
jr ra
.size main, .-main
.ident "GCC: (g5964b5cd727) 11.1.0"
.section .note.GNU-stack,"",@progbits现在,我按照命令跑来生产一个精灵。
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -nostdlib -o 42 42.s
因此,生成一个二进制文件。我试着用objdump这样的方式读到:
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-objdump -d 42
输出结果是这样的:
42: file format elf64-littleriscv
Disassembly of section .text:
00000000000100b0 <main>:
100b0: 1141 addi sp,sp,-16
100b2: e422 sd s0,8(sp)
100b4: 0800 addi s0,sp,16
100b6: 02a00793 li a5,42
100ba: 853e mv a0,a5
100bc: 6422 ld s0,8(sp)
100be: 0141 addi sp,sp,16
100c0: 8082 ret我不明白objdump输出中机器代码的含义。例如,第一个指令addi根据.....0010011被翻译成此页 (虽然这不是一个正式的规范)。然而,抛出的十六进制是1141。1141只能表示2个字节,但指令应该是32位,4字节.
我想我遗漏了一些要点,但是我应该如何读取riscv的objdump输出呢?
发布于 2022-03-02 10:08:13
通过这样使用16位,您可以告诉objdump显示压缩( -M no-aliases )指令。
riscv64-unknown-elf-objdump -d -M no-aliases在这种情况下,以c.开头的指令是压缩指令。
不幸的是,这也将禁用一些其他别名,使asm不太好阅读,如果你习惯了。您只需查看十六进制中的字节数(2比4),看看它是否是压缩指令。
https://stackoverflow.com/questions/71296538
复制相似问题