首页 > 解决方案 > 汇编程序中的主程序是否需要堆栈帧?

问题描述

如果主过程有局部变量并改变了堆栈指针,您是否应该像在正常过程中那样费心制作堆栈帧?

标签: assemblyx86

解决方案


简单的答案:这取决于

最佳实践答案:可能

懒惰的回答:如果它不崩溃就足够了。(/讽刺)

详细解答:

这真的取决于你用你的功能做什么。堆栈帧链接省略实际上是一些编译器自己做的优化。(据我所知,这可能会省略堆栈框架的创建。)

实际上,除非您的代码需要它们,否则堆栈帧仅用于调试目的(使遍历堆栈更容易)。我要告诉你一个小秘密:只要函数返回时,堆栈处于调用函数时的状态,计算机就不会给出两个段错误。(免除一些期望被调用函数清理堆栈的 ABI。)

所以,真的,你不需要堆栈帧。如果您打算从函数中实际返回,您甚至不需要堆栈帧,只要堆栈指针与您输入时的指针相同。

如果您通过返回退出,那么是的,您需要恢复堆栈指针。如果你通过跟注退出exit,那么就你如何对待筹码而言,这是非常公平的游戏。(只要您确保中断处理程序不会破坏任何程序数据。)

尽管我确实同意您对原始问题的评论。准确了解您所针对的 ABI 会有所帮助。因为虽然我所说的通常是正确的,但某些 ABI 会变得很奇怪,并且在不知道您针对的是哪个 ABI 的情况下无法给出明确的答案。


推荐阅读