GCC内联汇编:在intel x86_64上注册约束

Jin*_*hen 15 assembly gcc x86-64 inline-assembly

这是寄存器加载代码列表:

a eax
b ebx
c ecx
d edx
S esi
D edi
I常数值(0到31)
q,r动态分配寄存器(见下文)
g eax,ebx,ecx,edx或内存中
的变量a eax和edx合并为64位整数(使用long longs)

但这是intel i386的注册限制.我的问题是我可以在哪里找到intel x86_64系统的寄存器限制,例如:

?%r10
?%r8
?%的RDX

等等.

Bre*_*ale 12

机器特定约束在gcc手册中有一个部分- 在config/i386/constraints.md中找到了丑陋的细节.

一些约束具有用于x86-64的不同的含义,例如,q%eax,%ebx,%ecx,%edx在32位模式; 在64位模式下,它是任何通用整数寄存器 - 与r约束基本相同.如特定的寄存器的名字a,现在是指%rax,d%rdx

有,但是,没有特殊的限制或名称%r8.. %r15.有内联汇编和约束使用优(x86-64的具体)的教程在这里.


you*_*ufu 10

GCC并没有提供这样的限制对寄存器喜欢r10,r8

但是,您可能希望使用名为Local Reg Vars的功能

例如,

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;
}
Run Code Online (Sandbox Code Playgroud)