我对此非常陌生并且有一些问题,我将非常感谢您帮助理解它。
程序在调用时必须执行的第一件事是保存前一个 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的值是多少?
答案 0 :(得分:0)
1)将SP复制到FP会删除保存的FP值 - 它应该保存吗?
将堆栈指针复制到帧指针寄存器(Intel上的e / bp)会覆盖先前的值,是的,但您只是在上一步中将该值精确保存在堆栈中,以便在退出时可以恢复。
2)为什么需要推进SP?当推入局部变量时,是不是应该自动递减?
是的,push
可以做到这一点,但这一步通常是使用mov
(在英特尔上)完成的,它不会修改堆栈指针。
3)在不调用任何子程序的情况下启动主函数时,SP,IP和FP的值是多少?
显然,IP指向main
中的第一条指令。堆栈指针指向堆栈上保存的最后一项。帧指针通常指向调用main
的操作系统函数的帧。