在汇编中制作函数时,使用这么少的寄存器会遇到问题-这些寄存器内部有什么阻止我使用它们的?我可以在编码时将其内容复制到参数中并在退出功能之前重置它以不破坏其用途吗?
最佳答案
为什么ebx,esi和edi无法使用
但是,这完全取决于平台使用的ABI和calling conventions,因此大多数编译器都遵循这样的模式,其中寄存器eax
,ecx
和edx
被认为在函数调用之间是易失的,与其他寄存器。
我可以在编码时将其内容复制到参数中并在退出功能之前重置它以不破坏其用途吗?
是的,事实上,这是x86代码中一个非常常见的习惯用法,用于还原应该在函数调用之间保留的寄存器,如下所示:
my_fn:
push ebx
push esi
; code ...
pop esi
pop ebx
ret
假设
; code ...
部分没有使堆栈不平衡,则esi
和ebx
在离开函数之前将恢复为它们的旧值。