1

当我在 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”?

4

2 回答 2

3

GCC 使用 AT&T 语法。区别之一是可以使用指令后缀指定操作数大小,并且编译器将始终使用这些后缀。这实际上是一条mov带后缀的指令l,表示 32 位操作数大小。

于 2012-04-22T01:44:00.213 回答
3

正如 ughoavgfhw 所提到的,GCC 默认输出 AT&T 语法,这与您似乎期望的 Intel 风格的语法不同。但是,此行为是可配置的:您可以请求它输出 Intel 样式,如下所示:

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

关键参数是-masm=intel.

使用这个命令行,我得到的汇编输出(为了简洁而删掉了一些不必要的行)如下:

scheme_entry:
    mov eax, 42
    ret
于 2012-04-22T01:50:01.743 回答