Как указать ограничения регистра для регистра 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; \
})