2017-06-12 31 views
0

我正在做一些組裝練習,並提出了一個我無法解決的問題。他們告訴我%esp = 0x08c28f6a。 然後他們告訴我我有一個功能:呼叫功能後%esp會發生什麼?

funct:movw 0(%esp),%bx;

....

RET

0x80482ae:調用本功能;

0x80484a4:XXXXXXX;

我不明白在函數調用後%esp和%bx的值是什麼,而0(%esp)的含義對我來說並不清楚。我知道當函數被調用時,下一條指令的地址被壓入堆棧。但是,哪些內容轉移到%bx?

+0

'MOVW 0(%ESP),%bx'由_ESP_(堆棧指針)開在尖的2字節的值,並將其移動到16位寄存器_BX_。當你用32位代碼調用一個函數時,_ESP_減4,並且調用之後指令的指令指針(返回地址)被寫入該內存。 'call funct'是一個5字節的指令。調用後的指令爲0x80482ae + 5 = 0x80482b3在這種情況下,_ESP_顯然是從0x08c28f6a開始的,所以當調用funct時_ESP_比調用前低4(0x08c28f6a-4 = 0x8C28F66)。 –

+0

因此,在傳輸被控制爲函數'funct'後,內存地址0(%esp)的2個字節將成爲返回地址(0x82b3)的低2字節,然後被移動到寄存器_BX_ –

+0

作爲對' movw%esp,%bx'無效。 ESP是一個32位寄存器,_BX_是16位。這是不允許的。如果它是'movl%esp,%ebx',則當前堆棧指針(ESP)將被複制到_EBX_。在這種情況下,將值0x8C28F66放在_EBX_ –

回答

0

函數的返回地址。 代碼將esp指向的值(由0偏移)移動到ebx。這是返回地址。它允許PIC代碼在x86中工作,並用於生成函數地址,例如

call ebx+2000 ;; call printf 

ESP的值不是通過讀取它改性

+0

好吧,我想我知道了,但是,0(%esp)是堆棧頂部的值? (函數的返回值?)以及如果指令是movw%esp,%bx? – bernas