使用堆栈框架时,为什么ebx,esi和edi无法使用?

问题描述 投票:2回答:1

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

assembly x86 calling-convention stackframe
1个回答
4
投票

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

这完全取决于平台使用的ABI和calling conventions,但是,大多数编译器都符合寄存器eaxecxedx在函数调用中被认为是易失性的模式,这与其他寄存器不同。

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

是的,事实上,在x86代码中,恢复寄存器是一种非常常见的习惯用法,这些寄存器应该在函数调用之间保留,如下所示:

my_fn:
    push ebx
    push esi


    ; code ...

    pop esi
    pop ebx
    ret

假设; code ...部分没有使堆栈失衡,esiebx在离开函数之前恢复到它们的旧值。

© www.soinside.com 2019 - 2024. All rights reserved.