程序序言解释

时间:2013-01-29 09:52:17

标签: assembly stack stack-overflow subroutine

我对此非常陌生并且有一些问题,我将非常感谢您帮助理解它。

  

程序在调用时必须执行的第一件事是保存前一个   FP(因此可以在程序退出时恢复)。然后它将SP复制到   FP创建新的FP,并推进SP为预留空间   局部变量。此代码称为过程序言。上   程序退出,必须再次清理堆栈,称为   程序epilog。英特尔ENTER和LEAVE指令和   摩托罗拉LINK和UNLINK指令已被提供最多   程序prolog和epilog有效地工作。

上面的文字引用了粉碎堆栈文件,我发现很难理解以下问题:

  

“调用时程序必须执行的第一件事是保存前一个   FP(因此可以在程序退出时恢复)。然后它将SP复制到   FP创建新的FP“

1)将SP复制到FP会删除保存的FP值 - 它应该保存吗?

  

“然后它将SP复制到FP中以创建新FP,并将SP前进到   保留局部变量的空间。“

2)为什么需要推进SP?当推入局部变量时,是不是应该自动递减?

3)在不调用任何子程序的情况下启动主函数时,SP,IP和FP的值是多少?

1 个答案:

答案 0 :(得分:0)

  

1)将SP复制到FP会删除保存的FP值 - 它应该保存吗?

将堆栈指针复制到帧指针寄存器(Intel上的e / bp)会覆盖先前的值,是的,但您只是在上一步中将该值精确保存在堆栈中,以便在退出时可以恢复。

  

2)为什么需要推进SP?当推入局部变量时,是不是应该自动递减?

是的,push可以做到这一点,但这一步通常是使用mov(在英特尔上)完成的,它不会修改堆栈指针。

  

3)在不调用任何子程序的情况下启动主函数时,SP,IP和FP的值是多少?

显然,IP指向main中的第一条指令。堆栈指针指向堆栈上保存的最后一项。帧指针通常指向调用main的操作系统函数的帧。