GCC 生成的 ASM 简化了 x86 ASM?如何映射?
Posted
技术标签:
【中文标题】GCC 生成的 ASM 简化了 x86 ASM?如何映射?【英文标题】:GCC Generated ASM simplified x86 ASM? How to map? 【发布时间】:2012-04-22 01:40:44 【问题描述】:当我在 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”?
【问题讨论】:
AT&T 语法应该被击中。我不知道为什么有人用它 @James 我更喜欢 AT&T 语法,因为我发现它更简洁、更易于阅读。由于源操作数在前,它的流动性也更好。 【参考方案1】:正如 ughoavgfhw 所提到的,GCC 默认输出 AT&T 语法,这与您似乎期望的 Intel 风格的语法不同。但是,此行为是可配置的:您可以请求它输出 Intel 样式,如下所示:
gcc -masm=intel -O3 --omit-frame-pointer -S test1.c
关键参数为-masm=intel
。
使用这个命令行,我得到的汇编输出(为了简洁,删掉了一些不必要的行)如下:
scheme_entry:
mov eax, 42
ret
【讨论】:
【参考方案2】:GCC 使用 AT&T 语法。区别之一是可以使用指令后缀指定操作数大小,并且编译器将始终使用这些后缀。这实际上是一条带有l
后缀的mov
指令,表示32 位操作数大小。
【讨论】:
啊!所以你暗示我应该这样做:***.com/questions/199966/…以上是关于GCC 生成的 ASM 简化了 x86 ASM?如何映射?的主要内容,如果未能解决你的问题,请参考以下文章