我写了一小段代码并用gcc -S
编译它以查看ASM输出:
...
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $16, %esp
movl $0, -4(%ebp)
...
现在我希望在Linux上调用objdump -D
(反汇编)导致一个等效的结构,但它看起来像:
80483b5: 89 e5 mov %esp,%ebp
80483b7: 83 ec 10 sub $0x10,%esp
80483ba: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp)
为什么我会mov
/ sub
而不是movl
/ subl
?
答案 0 :(得分:2)
输出是等效的。 b
/ l
/等。在指令结束之前,只是一种告诉读者被操纵数据大小的方法。基础x86架构没有这样的内部区分,因为可以从操作数推断出大小。大小是AT& T语法'idiom'/ sugar,似乎未在gcc
工具链和objdump
binutils
中使用。
答案 1 :(得分:0)
此外,gcc -S
的输出已取消链接,因此来自objdump.exe
的链接不是可执行文件。