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

Đor*_*vić 3 x86 assembly calling-convention stack-frame

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

Gov*_*mar 5

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

但是,这完全取决于平台使用的ABI和调用约定,因此,大多数编译器都遵循寄存器的模式eaxecx并且edx与其他寄存器不同,它在函数调用之间被认为是易失的。

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

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

my_fn:
    push ebx
    push esi


    ; code ...

    pop esi
    pop ebx
    ret
Run Code Online (Sandbox Code Playgroud)

假设; code ...零件没有使堆栈不平衡,esi并且ebx在离开函数之前已恢复为原来的值。