【问题标题】:Why are ebx, esi and edi unusable when operating with a stackframe?为什么使用堆栈帧操作时 ebx、esi 和 edi 不可用?
【发布时间】:2019-04-23 23:04:09
【问题描述】:

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

【问题讨论】:

  • 它们是通话保留的。重要的是,当您返回调用者时,这些寄存器具有它们在输入时的值。您可以保持原样不动,也可以随意保存/恢复它们。

标签: assembly x86 calling-convention stack-frame


【解决方案1】:

为什么 ebx、esi 和 edi 不可用

这完全取决于平台使用的 ABI 和 calling conventions,不过,碰巧大多数编译器都遵循以下模式:寄存器 eaxecxedx 被认为是跨函数易失的调用,与其他寄存器不同。

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

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

my_fn:
    push ebx
    push esi


    ; code ...

    pop esi
    pop ebx
    ret

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2012-05-04
    • 2010-12-23
    • 2017-04-12
    • 2021-01-08
    相关资源
    最近更新 更多