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 構文を使用します。違いの 1 つは、命令サフィックスを使用してオペランド サイズを指定できることです。コンパイラは常にこれらのサフィックスを使用します。これは実際には、32 ビットのオペランド サイズを意味する接尾辞が付いたmov命令です。l

于 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 に答える