1

我对此很陌生,并且有一些问题希望您能帮助理解它。

调用过程时必须做的第一件事是保存前一个 FP(因此它可以在过程退出时恢复)。然后它将 SP 复制到 FP 以创建新的 FP,并推进 SP 为局部变量保留空间。这段代码称为过程序言。在过程退出时,必须再次清理堆栈,这称为过程结语。已提供 Intel ENTER 和 LEAVE 指令以及 Motorola LINK 和 UNLINK 指令,以有效地完成大部分程序 prolog 和 epilog 工作。

上述文字引用自砸叠纸,我发现以下问题很难理解:

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

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

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

2)为什么需要提前SP?推入局部变量时不应该自动递减吗?

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

4

1 回答 1

0

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

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

2)为什么需要提前SP?推入局部变量时不应该自动递减吗?

是的,push是这样,但此步骤通常使用mov(在 Intel 上)完成,它不会修改堆栈指针。

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

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

于 2014-12-02T16:00:50.523 回答