2012-02-24 99 views
0

是什麼下面的代碼做...x86彙編代碼的基本

0x080489b0 <+0>: push %ebp 
    0x080489b1 <+1>: mov %esp,%ebp 
    0x080489b3 <+3>: sub $0x14,%esp 
    0x080489b6 <+6>: push %ebx 

據我所知,這個設置堆棧中的前兩行,然後按下%ESP下降14實質上增加堆棧放在第三行,最後將一個%ebx壓入堆棧(儘管它是空的),這也增加了堆棧,並將%esp推下一個點。

我對這些步驟中的任何一個都有錯嗎?謝謝你的幫助!

回答

1

你基本正確。第三條指令(sub $ 0x14,%esp)實際上意味着將堆棧增長0x14 = 20個字節,可能出於對齊原因。第四行意味着將%ebx的4字節內容壓入堆棧,作爲副作用從%esp中減去4。原因是%ebx是一個被調用者保存的寄存器:如果一個函數修改了%ebx的內容,它應該將%ebx推入堆棧,然後修改%ebx,然後將%ebx從堆棧中彈出呼叫者從不會注意到%ebx中的更改。 x86上的其他被調用保存寄存器是%esi和%edi。

+0

好吧,我意識到我忘了0x14是十六進制,所以它增長了堆棧20個字節。我認爲堆棧會越來越大,但不是很確定,因爲我看不出它會對任何事情有什麼幫助,所以回到我看來,我想:P謝謝! – yiati 2012-02-24 04:28:52

1

不完全。 sub $0x14, %esp從堆棧指針中減去十六進制的0x14(十進制20),這相當於5個雙字所用的空間。

+0

哦,是的,我總是忘記將十六進制轉換成十進制:P,所以堆疊會由此擴展5個雙字。謝謝! – yiati 2012-02-24 04:26:42

+0

它可能爲以下設置空間:5個「本地」dword或一個「本地」變量來保存20字節的字符串。 – Gunner 2012-02-25 00:44:22