编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

2024-05-01

我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装。我需要在函数本身中使用 2 个临时寄存器:第一个用于累积返回值,第二个用作计数器。

我的功能目前如下所示:

;zero argument function
some_cpuid_fun:
  push rbx

  xor r10d, r10d ;counter initial value
  xor r11d, r11d ;return value accumulator initial value
  some_cpuid_fun_loop:
  ;...
  cpuid
  ;update r10d and r11d according to the result


  mov eax, r11d
  pop rbx
  ret

Since cpuid破坏者eax, ebx, ecx, edx我无法在不同的地方使用它们cpuid处决。正如记录在AMD64 SysV ABI https://www.uclibc.org/docs/psABI-x86_64.pdf:

r10    temporary register, used for passing a function’s
       static chain pointer

r11    temporary register

只有一个严格意义上的临时寄存器r11, r10似乎有不同的目的(并且它作为循环计数器的用途不是一个,我显然没有传递任何静态链指针)。

问题: Is the some_cpuid_fun功能实现AMD64 SysV ABI兼容的?如果没有,如何重写它以保持与 ABI 兼容?


在确定了用于参数的所有寄存器(在本例中没有)之后,您只需关心寄存器是否是易失性的(在调用之间不保留)。

简而言之,看看图 3.4 的最后一列(其中r10来自):是not已保存,因此您无需恢复即可使用它。
The Usage列仅告诉您在哪里寻找参数如果预期的话以及返回值放在哪里。
如果您在输入中不采用静态链指针,则可以覆盖r10需要时尽快。

所以是的,使用r10因为临时寄存器是 ABI 兼容的。

以供参考:

本小节讨论每个寄存器的用法。寄存器 %rbp、%rbx 和 %r12 到 %r15 “属于”调用函数,并且被调用函数是 需要保护他们的价值观。换句话说,被调用的函数必须保留 这些寄存器的调用者的值。其余寄存器“属于”被调用的 功能。 5 如果调用函数想要在整个寄存器中保留这样的值 函数调用时,它必须将值保存在其本地堆栈帧中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器? 的相关文章

随机推荐