1

我写了一小段代码并编译它gcc -S以查看 ASM 输出:

...
movl    %esp, %ebp
.cfi_def_cfa_register 5
subl    $16, %esp
movl    $0, -4(%ebp)
...

现在我希望在 Linux 上调用objdump -D(disassemble) 会导致一个等效的结构,但它看起来像:

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

4

2 回答 2

2

输出是等效的。/ b/l等。附加在指令末尾只是一种告诉读者正在操作的数据大小的方法。底层 x86 架构没有这种内部区分,因为大小可以从操作数中推断出来。大小是 AT&T 语法 'idiom'/sugar ,似乎在整个gcc工具链和objdump.binutils

于 2012-12-17T11:09:36.720 回答
0

此外,来自的输出未链接,因此在来自已链接的输出时gcc -S不是可执行文件。objdump.exe

于 2013-09-02T18:12:47.020 回答