这是寄存器加载代码列表:
eax
b ebx
c ecx
d edx
S esi
D edi
我恒定值(0到31)
q,r动态分配寄存器(见下文)
g eax,ebx,ecx,edx或记忆中的变量
eax和edx组合成64位整数(使用long longs)
但这是针对intel i386的注册限制。我的问题是我可以在哪里找到intel x86_64系统的寄存器限制,例如:
? %R10
? %R8
? %rdx
等等。
答案 0 :(得分:11)
机器特定约束在gcc manual中有一个部分 - 在config/i386/constraints.md中找到了丑陋的细节。
某些约束对x86-64有不同的含义,例如,q
是%eax
,%ebx
,%ecx
,%edx
在32位模式下;在64位模式下,它是任何通用整数寄存器 - 与r
约束基本相同。像a
这样的特定寄存器名称现在引用%rax
,d
到%rdx
等。
但%r8
.. %r15
没有特殊限制或名称。有关内联汇编和约束使用here的优秀(x86-64特定)教程。
答案 1 :(得分:9)
GCC没有为r10
,r8
但是,您可能希望使用名为Local Reg Vars
的功能例如,
#define syscall4( number, _1, _2, _3, _4 ) \
({ \
int64_t ret; \
register int64_t r10 asm("r10") = _4; \
__asm__ volatile \
( \
"syscall\n\t" \
: "=a"( ret ) \
: "a"( number ), \
"D"( _1 ), \
"S"( _2 ), \
"d"( _3 ), \
"r"( r10 ) \
: "memory", "rcx", "r11" \
); \
ret; \
})