gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:18 26 4
gpt4 key购买 nike

我正在根据 AMD64 SysV ABI 在汇编中使用 cpuid 实现一个函数。我需要在函数本身中使用 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

因为 cpuid 破坏了 eax, ebx, ecx, edx 我不能在不同的 cpuid 执行中使用它们。如 AMD64 SysV ABI 中所述:

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

r11 temporary register

只有一个严格的临时寄存器r11r10似乎有不同的用途(而且它作为循环计数器的用法不是一个,我显然没有通过任何静态链指针)。

问题 some_cpuid_fun 函数实现 AMD64 SysV ABI 是否兼容?如果不是,如何重写它以保持与 ABI 兼容?

最佳答案

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

简而言之,看图 3.4 的最后一列(r10 的用法出处):保留,因此您可以在不保留的情况下使用它恢复它。
用法 列仅告诉您如果需要 在哪里查找参数以及将返回值放在哪里。
如果您不在输入中采用静态链指针,则可以根据需要尽快覆盖 r10

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

供引用:

This subsection discusses usage of each register. Registers %rbp, %rbx and %r12 through %r15 “belong” to the calling function and the called function is required to preserve their values. In other words, a called function must preserve these registers’ values for its caller. Remaining registers “belong” to the called function. 5 If a calling function wants to preserve such a register value across a function call, it must save the value in its local stack frame.

关于linux - 编写 AMD64 SysV 程序集时哪些寄存器用作临时寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57917552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com