2011-04-11 52 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