2012-09-28 86 views
1

我學習了32位機器,我知道子$ 12,%esp與彈出%eax和mov $ 0,%eax時的三次相同。

但我不知道爲什麼我們使用add $ 18,%rsp啓動過程調用或sub $ 18,%rsp在x86-64機器上啓動過程調用。

爲什麼編譯器將此規則用於過程調用?參數規則?

0x0000000000400df3 <main+191>: mov $0x402227,%edi 
0x0000000000400df8 <main+196>: callq 0x400ab8 <[email protected]> 
0x0000000000400dfd <main+201>: callq 0x4014c0 <read_line> 
0x0000000000400e02 <main+206>: mov %rax,%rdi 
0x0000000000400e05 <main+209>: callq 0x401139 <phase_3> 

----------------------------------------------------------------------- 
example: 

0x0000000000401139 <example+0>: sub $0x18,%rsp 
0x000000000040113d <example+4>: lea 0x8(%rsp),%rcx 
0x0000000000401142 <example+9>: lea 0xc(%rsp),%rdx 
0x0000000000401147 <example+14>:  mov $0x40248a,%esi 
0x000000000040114c <example+19>:  mov $0x0,%eax 
0x0000000000401151 <example+24>:  callq 0x400ac8 <[email protected]> 
0x0000000000401156 <example+29>:  cmp $0x1,%eax 
+0

你的功能是什麼樣的? –

+3

由於0x18和18之間的差異,你的問題值得讚賞。:) –

+0

啊哈!我錯誤0x18 = 24大聲笑 – Silvester

回答

3

「我知道sub $12, %esp三個時間pop %eaxmov $0, %eax相同。」你錯了。 sub $12, %esp不會改變eax,既不會彈出也不會移入0。

使用諸如sub $12, %esp之類的主要/直接原因是在堆棧上保留一些空間。這可以用於爲子例程的局部變量提供一些空間。如果出於性能或其他原因需要堆棧指針,也可以用它來對齊堆棧指針。

add $18, %rsp做相反的事情,它釋放先前在堆棧上分配的空間。這可以用來釋放由局部變量佔用的空間或先前傳遞給另一個子例程並且不再需要的參數。

+0

爲什麼我們不使用sub $ 16,%rsp?不是x86-64虛擬內存哪個字是8字節? – Silvester

+0

您沒有向我們展示代碼,那麼我們如何知道它爲什麼是18或其他什麼,它是正確的? –

+0

我的意思是rsp增長8?使用加減$ 18有什麼好處? – Silvester

相關問題