【发布时间】:2021-12-30 11:21:18
【问题描述】:
阅读汇编教程,我看到“功能”序言/尾声包含在:
push bp
mov bp, sp
---
pop bp
但我也看到了一些其他教程,使用pusha 然后popa 来保留寄存器。
那么,为什么除了设置 bp 之外,函数 prologue/epilogue 不执行 pusha/popa 来保存寄存器上下文?
【问题讨论】:
-
pusha 和 popa 可用于满足这些调用约定。但唯一的优势似乎是代码大小:stackoverflow.com/questions/48449166/…
-
序言/尾声只需履行约定即可。例如。 bp 寄存器不一定必须用于访问堆栈帧,您可以使用任何其他寄存器,但 bp 在用于寻址时具有默认为 SS 段的优势。
-
@8HoLoN 编译器知道它编译的每个函数使用哪个寄存器。所以它可以通过只保存它计划使用的那些寄存器来节省大量时间。此外,有些寄存器是调用者保存的,根本不需要保存。这比总是保存所有寄存器要好得多。
-
这个问题只是关于 pusha/popa 还是为什么除了 bp 没有保存任何寄存器?根据调用约定,不必保留其他寄存器。根据功能实现,不会修改其他寄存器。所示的结尾/序言创建了一个标准的堆栈帧来访问堆栈上的参数和局部变量,以便相对于 bp 进行寻址。必须额外/手动完成寄存器的保存和恢复。
-
所以你自己的语言 - 然后你可以创建你自己的规则!您的每个函数都可以有自己的调用约定,也可以没有。
标签: assembly x86-16 bootloader