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

时间:2013-06-18 02:08:29

标签: gcc assembly x86-64 inline-assembly

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

  

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

等等。

2 个答案:

答案 0 :(得分:11)

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

某些约束对x86-64有不同的含义,例如,q%eax%ebx%ecx%edx在32位模式下;在64位模式下,它是任何通用整数寄存器 - 与r约束基本相同。像a这样的特定寄存器名称现在引用%raxd%rdx等。

%r8 .. %r15没有特殊限制或名称。有关内联汇编和约束使用here的优秀(x86-64特定)教程。

答案 1 :(得分:9)

GCC没有为r10r8

等寄存器提供此类限制

但是,您可能希望使用名为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;                                    \
})