2011-04-11 54 views
2

我想知道这ASM风格的g ++使用(AT & T或英特尔)。我正在完成一项任务,要求我提供各种ASM指令的定义。我看到了下面:哪个ASM风格确实G ++使用

movl %esp, %ebp 
where %esp = stack pointer and %ebp = base pointer 

Intel style说,上述等同于:

movl destination, source 

但它没有意义的基指针移动到堆栈指针,让我不知道如果g ++使用T ASM风格。

这是我用来生产ASM(和平台信息)命令:

g++ -S src -o out.bin 
OS: Fedora Linux 14, 2.6.35.10-74.fc14.i686 
Compiler: gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 

我的问题:反正是有明确判断哪些风格的g ++是生产?有没有开关?

请纠正我在哪里,我错了。提前致谢!

回答

3

G ++目标GNU汇编gas,除非使用.intel_syntax directive其使用AT & T语法(运算SRCDEST)。

+0

嗨!感谢百万人的回复。我将GNU的手册页看作(man as),并没有看到对所使用的ASM语法的任何引用。你会碰巧有一个我可以遵循的链接。我的教授是准确性的坚持者,我希望有一份支持我工作的官方文件。再次感谢! – certifiedNoob 2011-04-11 05:30:35

+0

@certifiedNoob:我添加了一个权威性链接到GNU手动(在sourceware.org,从gcc.gnu.org链接)。 – 2011-04-11 05:32:38

+0

非常感谢!起初我没有看到它。再次感谢! – certifiedNoob 2011-04-11 05:34:47

2

它肯定会产生AT & T语法,和你看到的是正确的。请注意,在基本指针本身保存在堆栈上之后,堆栈指针将移动到基指针中。这是x86上由gcc发出的标准堆栈框架样板。

另外请注意,您ret之前,栈帧通过leave恢复,这相当于

movl %ebp,%esp 
popl %ebp 
+0

你是正确的,第一个行是一个“pushl%ebp的”后跟我原本列出的代码。感谢您的澄清! – certifiedNoob 2011-04-11 05:38:16

+0

+1正好是我自己问题的答案。谢谢。我试图首次遵循汇编代码的逻辑。我用g ++来产生一个非常简单的程序的输出,'leave'困扰着我。 – ptpaterson 2011-06-23 20:17:21