【问题标题】:x86 Assembler - Which registers to push?x86 汇编器 - 要推送哪些寄存器?
【发布时间】:2014-06-13 03:51:48
【问题描述】:

x86 汇编程序例程通常以以下序言开始:

push        ebp                ; Save ebp
mov         ebp, esp           ; Set stack frame pointer
sub         esp, localbytes    ; Allocate space for locals
push        <registers>        ; Save registers

我见过函数 push 有 1 到 4 个寄存器。

除了推送ebp(这是必需的)之外,是什么决定了你是否推送ediesi和/或ebx

你应该总是推动他们吗?我找不到为我解决此问题的参考。

【问题讨论】:

  • 虽然有一个 x86 ABI 和一个 64 位 ABI,(使用你最喜欢的搜索引擎)它讲述了易失性和非易失性寄存器和调用约定;您没有义务保存任何寄存器。虽然,如果您要与操作系统或其他库进行交互,那么您必须遵守该操作系统的 ABI。您正在使用 Assembly,您拥有完全的控制权!
  • 一些编译器(例如 Microsoft)有一个无帧指针选项,它可以释放 EBP 以用于其他目的。不过,它仍然需要保存(如果使用)。
  • "什么决定了你是否推送.." 你的使用决定了你想要或需要推送哪些。你推送你​​修改的那些,并在你完成它们之后想要它们的原始值。
  • @Gunner:同意 - ABI 在这里很重要,它会告诉您可以更改的内容。但是“你没有义务保存任何寄存器”我认为你的意思是“除非你和他们一起玩”:-)

标签: assembly x86


【解决方案1】:

推送不修改的寄存器是没有意义的。除此之外,您可以选择保留哪些寄存器。采用一些约定,以便调用代码和被调用代码都知道它负责什么。

【讨论】:

  • 如果你push了你没有修改的寄存器,然后恢复它们,有什么坏处吗?除了额外的工作,它会导致崩溃吗?
  • 推送寄存器会消耗时间和堆栈空间。它本身不会导致崩溃,但它会使用系统资源,如果它们被耗尽,可能会导致崩溃。在堆栈和执行时间都没有特别严格限制的 PC 环境中,这可能不太重要。在具有严格约束的环境(例如嵌入式微控制器)中,情况可能会有所不同。
  • > 除此之外,您可以选择保留哪些寄存器。不,不是。 ABI 说明您必须保留哪些寄存器。如果您修改(例如)ESI 而不保留/恢复它,那么调用您的函数可能会崩溃,因为他们希望 ESI 的内容不会被他们调用的函数所触及。如果你拥有函数调用的双方(调用者和被调用者),那么你可以保留你想要的任何寄存器,但重新定义 ABI 应该是非常罕见的。
【解决方案2】:

您看到的是caller vs callee save registers。基本思想是,如果要将值存储在被调用者保存的寄存器中,则需要将其当前值保存在某处,以便在函数调用结束时恢复它。

【讨论】:

    【解决方案3】:

    此 Wikipedia 部分可能会有所帮助: http://en.wikipedia.org/wiki/X86_calling_conventions#Register_preservation

    一般来说,您会保留所有寄存器,除非您明确告知您不必保留。如果在 32 位代码中并被调用,则不必保留 EAX、ECX 或 EDX,但必须保留其他所有内容。在 64 位代码中有更多的寄存器,所以你也必须保留它们。

    在您的示例中,您必须推送 EBP,因为您更改了它。在编写程序集以使用 EBP 来索引参数时,这是很常见的。参数被压入堆栈,然后是返回地址。因此,要获取您的参数,您必须访问堆栈。如果 ESP 正在发生变化,那么记住您的参数相对于 ESP 的位置是一个巨大的痛苦。所以我们使用 EBP 保存一个“书签”。

    但是,如果您不需要这样做,那就不要这样做!例如 - Microsoft 使用的 __fastcall 调用约定将传递 ECX 中的第一个参数。我有简单的代码,它从不将任何东西推送到堆栈,只使用 EAX 和 ECX。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多