【发布时间】:2011-01-11 13:54:11
【问题描述】:
我一直试图通过使用编译器生成不同优化级别的各种 C 程序的汇编程序来更好地了解幕后发生的事情。有件事困扰了我一段时间。
当我如下编译t.c时,
gcc -S t.c
我得到了 AT&T 语法中的程序集,如下所示。
function:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %eax
addl 8(%ebp), %eax
popl %ebp
ret
.size function, .-function
当我使用 masm 参数进行如下编译时:-
gcc -S t.c -masm=intel
我得到以下输出。
function:
push %ebp
mov %ebp, %esp
mov %eax, DWORD PTR [%ebp+12]
add %eax, DWORD PTR [%ebp+8]
pop %ebp
ret
.size function, .-function
语法发生了变化,但寄存器符号之前仍然有“%”(这就是为什么我一开始不喜欢 AT&T 语法的原因)。
有人能解释一下为什么会这样吗?我该如何解决这个问题?
【问题讨论】:
标签: gcc assembly disassembly