Как указать ограничения регистра для регистра Intel x86_64 от r8 до r15 во встроенной сборке GCC?

Здесь список кодов регистрации регистра:

a eax
b ebx
c ecx
d edx
S esi
D edi
I постоянное значение (от 0 до 31)
q, r динамически распределенный регистр (см. ниже)
g eax, ebx, ecx, edx или переменная в памяти
Eax и edx объединены в 64-битное целое (используйте длинные длинные)

Но это ограничения для регистра для i386. Мой вопрос в том, где я могу найти ограничения на регистрацию системы intel x86_64, например:

? % R10
? % R8
? % rdx

и т.д.

Ответ 1

Ограничения, связанные с машиной, имеют раздел в gcc manual - уродливые детали найдены в config/i386/constraints.md.

Некоторые ограничения имеют разные значения для x86-64, например, q - это %eax, %ebx, %ecx, %edx в 32-битном режиме; в 64-битном режиме это любой целочисленный регистр общего назначения - и, по сути, тот же, что и ограничение r. Конкретные имена регистров типа a теперь относятся к %rax, d к %rdx и т.д.

Однако нет специальных ограничений или имен для %r8.. %r15. Там отличный (x86-64) учебник по встроенной сборке и ограничению использования здесь.

Ответ 2

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;                                    \
})