2017-08-15 151 views
2

我無法找到答案。從我讀過的%ebp有32位,將%esp移動到%ebp,你仍然會有32位,然後減去70到32,我不明白其餘的。我對此很陌生,所以我不是很精通。請給出詳細的解釋。謝謝!查找有多少字節將esp和程序堆棧上存儲的返回地址分開

下面是我遇到的問題。

在這個指令序列的末尾,多少個字節將esp和程序堆棧上存儲的返回地址分開?假設我們使用標準的32位x86調用約定來調用這個函數。

804847c functioname: 
804847c: push %ebp 
804847d: mov %esp,%ebp 
804847f: sub $0x70,%esp 
8048482: movl $0x0,0x4(%esp) 
804848a: movl $0x8048580,(%esp) 
+0

此指令子$ 0x70,%esp中的$ 0x70值被符號擴展爲32位,所以它也有32位,就像'esp'和'ebp'一樣。 (儘管內部0x70值在指令中只編碼了8位,但這不是它的使用方式,這只是在這種特殊情況下的存儲優化)。使用的比特數限制了可以在那些比特中編碼的不同值的數量,即8比特可以被解釋爲從0到255,或從-128到+127,或者作爲八個1比特標誌(開/關)的值。在你的問題中,這並不重要,因爲所有涉及的值都是32b。 – Ped7g

回答

1

sub $0x70,%esp:在堆棧上保留0x70個字節。

movl $0x0,0x4(%esp):放置一個零32位值作爲參數。

movl $0x8048580,(%esp):發表地址。下一個ret會跳到它。

通過標準調用約定,名爲cdecl,參數被放置在堆棧上,後面跟着被調用者應該返回的地址。

+1

這看起來不對。 _ESP_已經向下調整了0x70(112字節)。 'sub'指令後,_EBP_的臨時副本位於_ESP_ + 0x70,返回地址位於_ESP_ + 0x74。 0x04(%esp)和(%esp)實際上指向使用'sub $ 0x70,%esp'指令在堆棧上創建的局部變量區域 –

+2

在我看來,實際問題的答案是_ESP_和返回地址是0x70 + 0x04(推送_EBP_時爲4個字節)。它是十進制的116或十六進制的0x74。 –

+1

應該指出'movl'指令 - 我們不知道它們打算用於什麼。他們實際納入問題實際上並沒有改變_ESP_和返回地址之間的差異。他們實際上只是一條紅鯡魚。這聽起來像一個家庭作業的作業,導師很可能會混淆學生最後2條指令。 –