当我在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'?
答案 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