- 论坛徽章:
- 17
|
回复 6# C_H_L
(1)Linux procedure的stack frame中,当调用一个procedure时,frame pointer发生什么变化?调用完成,返回caller后,frame pointer又发生什么变化?
函数调用时寄存器的管理使用与函数的调用约定相关,是可以变化的。默认情况下参数从右往左开始压栈。其stack 布局如下:
Last argument
...
4(%esp) First argument
(%esp) Return address
(2)为什么64位机器就不需要保存ebp?和32位机器区别?相比32-bit,有什么进步?
64位CPU除了扩展原有的寄存器 (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, RIP)到64位之外还有8个64位的通用寄存器(R8-R15),也就是说可以有理多的计算直接使用寄存器来加速计算性能。和32位最大的区别在于默认使用的寄存器是64位的。
64位CPU不使用ebp,它使用RBP,依然需要保存RBP的。在函数调用返回时编译器生成的代码可能使用LEAVE来代替POP。 |
|