2012-04-22 4 views
1

私はcygwinの上でGCCでASMに以下のコードをコンパイルします。GCCはASMを簡略化したx86 ASMを生成しましたか?マップする方法は?

int scheme_entry() { 
    return 42; 
} 

使用:

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

しかし ':

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

を、私は、以下の 'ASM' が生成し得ます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

+0

@James私はそれが清潔で読みやすいように私はAT&Tの構文を好む。また、ソースオペランドが最初に来るので、より良いフローになります。 – ughoavgfhw

答えて

3

ughoavgfhwで述べたように、GCCはデフォルトでAT & T構文を出力します。これは期待しているようなインテルスタイルの構文とは異なります。この動作は、しかし、設定可能です:

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

をキーパラメータは-masm=intelことで次のようにあなたは、出力のインテル・スタイルにそれを要求することができます。このコマンドラインを使用

次のように、私は(いくつかの不要な行を簡潔にするために切り取って)を取得アセンブリ出力は次のようになります。

scheme_entry: 
    mov eax, 42 
    ret 
+0

ありがとう! – hawkeye

3

GCCはAT & T構文を使用します。相違点の1つは、命令サフィックスを使用してオペランドサイズを指定できることです。コンパイラは常にこれらのサフィックスを使用します。実際にはmov命令の末尾にlという接尾辞があります。これは32ビットのオペランドサイズを意味します。

+0

ああ!だから私はこれを行う必要があることを示唆している:http://stackoverflow.com/questions/199966/how-do-you-use-gcc-to-generate-assembly-code-in-intel-syntax – hawkeye

関連する問題