GCC Generated ASM简化了x86 ASM?如何映射?

时间:2012-04-22 01:40:45

标签: gcc assembly x86

当我在cygwin的GCC中将以下代码编译为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'?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如ughoavgfhw所述,GCC默认输出AT& T语法,这与您似乎期待的英特尔式语法不同。但是,这种行为是可配置的:您可以按如下方式请求它输出Intel风格:

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

,关键参数为-masm=intel

使用此命令行,我得到的程序集输出(为简洁而删除了一些不必要的行)如下:

scheme_entry:
    mov eax, 42
    ret