gcc给出了奇怪的英特尔语法

gcc给出了奇怪的英特尔语法,gcc,assembly,disassembly,Gcc,Assembly,Disassembly,我一直试图通过使用编译器在不同的优化级别生成各种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 functi

我一直试图通过使用编译器在不同的优化级别生成各种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语法的原因)

有人能解释一下为什么会发生这种情况吗?如何解决这个问题?

GNU汇编程序(gas)有一个单独的选项来控制%前缀。文档似乎表明GCC没有这样的选项,但我的GCC(Debian 4.3.2-1.1版)没有生成%前缀