Assembly 如何在GCC内联程序集中的英特尔x86_64寄存器r8到r15上指定寄存器约束?

Assembly 如何在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,一些约束具有不同的含义,例

以下是寄存器加载代码列表:

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,一些约束具有不同的含义,例如,
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的愿望,我的反对票就不会消失。