- 論壇徽章:
- 17
|
回復(fù) 6# C_H_L
(1)Linux procedure的stack frame中,當(dāng)調(diào)用一個(gè)procedure時(shí),frame pointer發(fā)生什么變化?調(diào)用完成,返回caller后,frame pointer又發(fā)生什么變化?
函數(shù)調(diào)用時(shí)寄存器的管理使用與函數(shù)的調(diào)用約定相關(guān),是可以變化的。默認(rèn)情況下參數(shù)從右往左開(kāi)始?jí)簵。其stack 布局如下:
Last argument
...
4(%esp) First argument
(%esp) Return address
(2)為什么64位機(jī)器就不需要保存ebp?和32位機(jī)器區(qū)別?相比32-bit,有什么進(jìn)步?
64位CPU除了擴(kuò)展原有的寄存器 (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, RIP)到64位之外還有8個(gè)64位的通用寄存器(R8-R15),也就是說(shuō)可以有理多的計(jì)算直接使用寄存器來(lái)加速計(jì)算性能。和32位最大的區(qū)別在于默認(rèn)使用的寄存器是64位的。
64位CPU不使用ebp,它使用RBP,依然需要保存RBP的。在函數(shù)調(diào)用返回時(shí)編譯器生成的代碼可能使用LEAVE來(lái)代替POP。 |
|