2014-07-27 133 views
0

雖然拆卸簡單的C代碼與GCC我碰到:在「mov(%eax),eax」中移動一個寄存器到自己的目的是什麼?

mov (%eax), eax 

我組裝的理解是,當你有()周圍的寄存器,要添加一些數量的內存地址,即0x4(%eax)將意味着4字節高於寄存器%eax

但是,在這裏,()之前沒有編號,所以它似乎是將寄存器中的值複製到自身。

我注意到%eax寄存器通常用於返回變量,並且這行在函數調用後立即出現,所以我的猜測是這條指令實際上是告訴機器在%eax寄存器中爲稱爲函數(即返回值)並將其放入%eax寄存器中以獲取當前函數。

這是正確的嗎?如果沒有,我有什麼錯誤,它究竟在做什麼?

+4

我建議在AT&T語法上使用Intel語法。閱讀IMO要容易得多。 –

+1

這應該是'mov(%eax),%eax'。這只是將地址爲'EAX'的長字複製到'EAX'寄存器中。 – TonyK

+1

@Jonathon:這真的取決於你所提出的。 – TonyK

回答

2

() in & t語法表示內存解除引用,您應該閱讀有關有效的地址語法。等效的C代碼將爲eax=*eax;,含義是使用當前值eax作爲地址加載內存中的4個字節,並用提取的值覆蓋eax

函數調用和返回不影響寄存器的值(當然除了堆棧和指令指針外),沒有調用者或被調用者的概念eax

PS:如果您對& t不滿意,您可以使用set disassembly-flavor intelgdb切換到intel語法模式。

相關問題