2012-04-22 59 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