2012-02-21 234 views
2

在調查崩潰時,我遇到以下代碼片斷,並立即認識到mov指令實際上應該是movq以獲得正確的64位寄存器操作。x86-64 GNU彙編

#elif defined(__x86_64__) 
    unsigned long rbp; 
    __asm__ volatile ("mov %%rbp, %0" : "=r" (rbp)); 
    sp = (void **) rbp; 
#else 

此外此,我也發現,聲稱,rbp寄存器x86-64的是通用和不包含當前幀的地址文檔。我還發現文檔聲稱rbp確實包含當前幀的地址。有人可以澄清嗎?

+0

'rbp'包含基地址,如果你不'使用['-fomit-frame-pointer'(或類似的選項)](http://stackoverflow.com/questions/14666665/trying-to-understand-gcc-option-fomit-frame-pointer)http:/ /stackoverflow.com/questions/579262/what-is-the-purpose-of-the-frame-pointer – 2015-04-16 17:05:00

回答

7

關於你的問題的第一部分(的movq代替mov),彙編器(如,在這種情況下),會認識到你的操作數是64位,並會正確使用movqmov不是一個有效的指令,它是告訴彙編程序「根據操作數使用正確的mov變體」的一種方式。

關於第二部分,它實際上是兩個:它是一個通用寄存器,它可以保存任何值。它也被用作棧幀基址指針。的AMD64 Application programming手冊的「2.4協議棧操作」部分表示:

堆棧是存儲器中的堆棧段,其用於鏈接 程序的一部分。軟件約定通常定義使用 堆棧幀,它由兩個寄存器-一個堆棧框架基座 指針(RBP)和堆棧指針(RSP)棧 -

+0

不,「mov」是完全有效的,並且是英特爾語法中的實際操作碼。在AT&T語法中,當上下文可以指示操作數大小時,後綴也不是必需的,就像在Intel語法中一樣。 [「如果沒有指定後綴,並且指令沒有內存操作數,則GAS會根據目標寄存器操作數(最終操作數)的大小推斷操作數大小。」](https://en.wikibooks.org /維基/ X86_Assembly/GAS_Syntax#Operation_Suffixes) – 2015-04-16 17:14:25