我正在使用实现一个功能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(使用前将#替换为@)