assembly - 汇编程序中的主程序是否需要堆栈帧?
问题描述
如果主过程有局部变量并改变了堆栈指针,您是否应该像在正常过程中那样费心制作堆栈帧?
解决方案
简单的答案:这取决于
最佳实践答案:可能
懒惰的回答:如果它不崩溃就足够了。(/讽刺)
详细解答:
这真的取决于你用你的功能做什么。堆栈帧链接省略实际上是一些编译器自己做的优化。(据我所知,这可能会省略堆栈框架的创建。)
实际上,除非您的代码需要它们,否则堆栈帧仅用于调试目的(使遍历堆栈更容易)。我要告诉你一个小秘密:只要函数返回时,堆栈处于调用函数时的状态,计算机就不会给出两个段错误。(免除一些期望被调用函数清理堆栈的 ABI。)
所以,真的,你不需要堆栈帧。如果您打算从函数中实际返回,您甚至不需要堆栈帧,只要堆栈指针与您输入时的指针相同。
如果您通过返回退出,那么是的,您需要恢复堆栈指针。如果你通过跟注退出exit
,那么就你如何对待筹码而言,这是非常公平的游戏。(只要您确保中断处理程序不会破坏任何程序数据。)
尽管我确实同意您对原始问题的评论。准确了解您所针对的 ABI 会有所帮助。因为虽然我所说的通常是正确的,但某些 ABI 会变得很奇怪,并且在不知道您针对的是哪个 ABI 的情况下无法给出明确的答案。
推荐阅读
- php - 如何使用 curl 发布请求在 php 中运行 graphql api
- javascript - 精细上传器 s3 中 OPTIONS 的自定义标头
- android - 如何在android中的按钮内放置一个可点击的图标
- ios - UITableViewCell 对齐列以适应内容
- javascript - heroku 上的 node.js 应用程序出现问题
- java - 带有一个 return 语句的 Java 递归
- python - 如何迭代地读取网站和保存 har 数据(我有 1000 个 URL 的 CSV 文件 - 但无法保存具有唯一名称的文件
- android - 更改导航抽屉中的单个图标大小
- c++ - 如何决定 constexpr 是否返回引用
- vhdl - vhdl“表达式不是常数”