在汇编中创建函数时,我遇到了使用如此少量寄存器的问题 - 这些寄存器中的内容是什么阻止我使用它们?我可以在编码时将其内容复制到参数中并在退出函数之前重置它以不破坏其目的吗?
为什么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
在离开函数之前恢复到它们的旧值。