2012-04-22 56 views
1

当我编译下面的代码到ASM在GCC在Cygwin上:使用GCC生成的ASM简化的x86 ASM?如何映射?

int scheme_entry() { 
    return 42; 
} 

gcc -O3 --omit-frame-pointer -S test1.c 

我碰到下面的 'ASM' 产生:

.file "test1.c" 
    .text 
    .p2align 4,,15 
.globl _scheme_entry 
    .def _scheme_entry; .scl 2; .type 32; .endef 
_scheme_entry: 
    movl $42, %eax 
    ret 

但“ MOVL'命令实际上不是x86 ASM。通过观察以下列表:

http://ref.x86asm.net/geek.html#x0FA0

http://en.wikipedia.org/wiki/X86_instruction_listings

没有MOVL命令,但有

CMOVL 
CMOVLE 
MOVLPS 
MOVLPD 
MOVLHPS 

我的问题是 - 是gcc ASM “简化ASM”?如果是这样 - 我如何将它映射到“真正的ASM”?

+4

AT&T语法应在头拍摄。我不知道为什么有人用它 – James 2012-04-22 01:56:03

+0

@詹姆斯我更喜欢AT&T的语法,因为我觉得它更简洁,更易于阅读。由于源操作数首先出现,因此它也更好地流动。 – ughoavgfhw 2012-04-22 02:22:10

回答

3

正如ughoavgfhw所述,默认情况下,GCC输出AT & T语法,这与您似乎期望的Intel样式语法不同。这种行为,但是,配置:与所述关键参数-masm=intel

gcc -masm=intel -O3 --omit-frame-pointer -S test1.c 

:您可以在如下请求输出Intel的风格。

使用这个命令行中,组件输出I得到(少数不必要的行切出为简洁起见)如下:

scheme_entry: 
    mov eax, 42 
    ret 
+0

真棒谢谢! – hawkeye 2012-04-22 01:52:31

3

GCC使用AT & T语法。其中一个区别是操作数大小可以使用指令后缀来指定,编译器将始终使用这些后缀。这实际上是一个带有l后缀的mov指令,这意味着一个32位操作数大小。

+0

啊!所以你暗示我应该这样做:http://stackoverflow.com/questions/199966/how-do-you-use-gcc-to-generate-assembly-code-in-intel-syntax – hawkeye 2012-04-22 01:48:24