- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 Uni 学习计算机体系结构和汇编编程类(class)。前段时间我们学习了如何在 ASM 中编写函数并从 C 中调用它们。但是有一件事我不明白——在每个 ASM 函数的开头,讲师总是进行两条指令;
pushl %ebp
movl %esp, %ebp
我不明白他为什么这样做,以及它在调用时对函数有什么影响。在我的 Intel Mac 上,为 IA32 编写程序集时,无论是包含这些指令还是直接跳过它似乎都没有任何区别。
有人能告诉我调用这些指令时实际发生了什么,以及为什么总是在 ASM 函数的开头调用它们吗?最好在 GNU ASM 中,尽管 Intel ASM 也可以。
最佳答案
这是正确堆栈展开所必需的约定的一部分。 %ebp 基指针指向调用者的栈帧。调用约定是通过将调用者的基指针压入堆栈来保存它。请参阅 Agner Fog 综合调用约定文档中的第 9 章异常处理和堆栈展开
http://www.agner.org/optimize/calling_conventions.pdf .
如果你想使用一个调试器,比如gdb
来调试你的程序,并且你想让它显示一个backtrace
,那么你需要遵循那个调用约定。
http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_42.html
A backtrace is a summary of how your program got where it is. It shows one line per frame, for many frames, starting with the currently executing frame (frame zero), followed by its caller (frame one), and on up the stack.
关于c - 为什么 pushl %ebp 和 movl %esp, %ebp 在每个 ASM 函数的开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22844456/
C++ ATT组装 我试图了解以下两条指令的行为: pushl %esp 和: popl %esp 请注意,他们将计算出的值存储回 %esp . 我正在独立考虑这些说明,而不是按顺序考虑。我知道存储在
除非我抄错了,上面的代码是同学在老师的帮助/更正下在类里面写在黑板上的: int array[100], sum, i; void ini() { for(i = 0; i 0(0xsum) =
我试图编译这个源代码时遇到了这个恼人的错误,但我不知道为什么会发生这些错误。我已经搜索过了,但没有找到任何有用的东西。 源文件 #include #include #include #inclu
我是汇编编程的新手,正在研究 Programming Ground Up在带有 GNU 汇编器 v2.20.1 的 Ubuntu x86_64 桌面上。 我已经能够组装/链接执行我的代码,直到我开始使
我正在 Uni 学习计算机体系结构和汇编编程类(class)。前段时间我们学习了如何在 ASM 中编写函数并从 C 中调用它们。但是有一件事我不明白——在每个 ASM 函数的开头,讲师总是进行两条指令
我正在尝试将以下内容从 AT&T 程序集转换为 Intel 程序集: pushl 2000 现在编译为: ff 35 d0 07 00 00 pushl 0x7d0 但是无论我尝试什么,
我是一名优秀的程序员,十分优秀!