Assembly 如何在GCC内联程序集中的英特尔x86_64寄存器r8到r15上指定寄存器约束?
以下是寄存器加载代码列表: eaxAssembly 如何在GCC内联程序集中的英特尔x86_64寄存器r8到r15上指定寄存器约束?,assembly,gcc,x86-64,inline-assembly,cpu-registers,Assembly,Gcc,X86 64,Inline Assembly,Cpu Registers,以下是寄存器加载代码列表: eax b ebx c ecx d edx S esi 电子数据交换 I常量值(0到31) q、 r动态分配寄存器(见下文) g eax、ebx、ecx、edx或内存中的变量 合并为64位整数的eax和edx(使用长长度) 但这是英特尔i386的注册限制。我的问题是在哪里可以找到intel x86_64系统的寄存器约束,如: ?%r10 ? %r8 ? %黑索今 依此类推。特定于机器的约束在中有一节-丑陋的细节在中找到 对于x86-64,一些约束具有不同的含义,例
b ebx
c ecx
d edx
S esi
电子数据交换
I常量值(0到31)
q、 r动态分配寄存器(见下文)
g eax、ebx、ecx、edx或内存中的变量
合并为64位整数的eax和edx(使用长长度) 但这是英特尔i386的注册限制。我的问题是在哪里可以找到intel x86_64系统的寄存器约束,如: ?%r10
? %r8
? %黑索今
依此类推。特定于机器的约束在中有一节-丑陋的细节在中找到 对于x86-64,一些约束具有不同的含义,例如,
q
是%eax
,%ebx
,%ecx
,%edx
在32位模式下;在64位模式下,它是任何通用整数寄存器,本质上与r
约束相同。特定寄存器名称,如a
现在指的是%rax
,d
指的是%rdx
,等等
但是,
%r8
没有特殊约束或名称<代码>%r15。有一个关于内联汇编和约束使用的优秀(x86-64特定)教程。GCC没有为寄存器提供此类约束,如r10
,r8
。但是,您可以使用名为的功能。在使用此功能之前,请仔细阅读文档,尤其是警告段落
例如:
static inline __attribute__((always_inline))
long syscall4(long n, long a1, long a2, long a3, long a4) {
long ret;
register long r10 __asm__("r10") = a4;
__asm__ __volatile__ (
"syscall\n\t"
: "=a"(ret)
: "a"(n),
"D"(a1),
"S"(a2),
"d"(a3),
"r"(r10)
: "memory",
"rcx",
"r11"
);
return ret;
}
另请参见。非常感谢。我在谷歌上搜索了很长时间,但什么也没有得到。我甚至找不到什么东西指出它不存在。我对你的答案投了反对票,因为它实际上没有回答OPs的问题,而是将答案推迟到外部资源。堆栈溢出答案必须是自包含的。请扩展您的答案,以涵盖您链接的资源的相关部分。您至少可以提到
注册。。。asm
局部变量是强制“r”
选择所需寄存器的方法,如其他答案所示。这也是您在一些非x86 ISA上所做的,这些ISA通常没有任何特定的寄存器约束。@BrettHale Peter说的。只要你的回答没有真正解释如何实现OP的愿望,我的反对票就不会消失。