为什么在使用Stackframe时ebx,esi和edi无法使用?

时间:2019-04-23 23:04:09

标签: assembly x86 calling-convention stackframe

在汇编中创建函数时,使用这么少的寄存器会遇到问题-这些寄存器内部有什么阻止我使用它们的?我可以在编码时将其内容复制到参数中并在退出功能之前重置它以确保其用途吗?

1 个答案:

答案 0 :(得分:4)

  

为什么ebx,esi和edi无法使用

尽管这完全取决于平台使用的ABI和calling conventions,但是碰巧大多数编译器都遵循寄存器eaxecx和{{ 1}}在函数调用中被认为是易失的,与其他寄存器不同。

  

我可以在编码时将其内容复制到参数中并在退出功能之前重置它以不破坏其用途吗?

是的,实际上,这是x86代码中一个非常常见的习惯用法,用于还原应该在函数调用之间保留的寄存器,如下所示:

edx

假设my_fn: push ebx push esi ; code ... pop esi pop ebx ret 部分没有使堆栈不平衡,则; code ...esi在离开函数之前会恢复到原来的值。