Как называются новые регистры процессоров X86_64?

Где я могу найти имена новых регистров для сборки на этой архитектуре?

Я имею в виду регистры в X86, такие как EAX, ESP, EBX и т. Д. Но я хотел бы, чтобы они были в 64-битных.

Я не думаю, что они такие же, как когда я разбираю свой C-код, я получаю R вместо E.

4 ответа

Решение

Старые 32-битные регистры были расширены до 64 бит, r регистры (rax, rbx, rsp и так далее).

Кроме того, есть несколько дополнительных регистров общего назначения. r8 через r15 к которому также можно получить доступ как (например) r8d, r8w а также r8b (нижнее 32-битное двойное слово, 16-битное слово и 8-битный байт соответственно).

Старший байт старых 16-битных регистров по-прежнему доступен во многих случаях, так как ah, bh и так далее, но, похоже, это не относится к r8 через r15 регистры. Есть несколько новых кодировок команд, особенно те , которые используют REX префикс, который не может получить доступ к этим старшим байтам, но другие все еще могут свободно использовать их.

Кроме того, есть несколько новых регистров SSE, xmm8 хоть xmm15,

eip а также flags регистры также были расширены до rip а также rflags,

Смотрите страницу википедии и MSDN для более подробной информации.

Поддерживаются ли они в asm Ключевое слово для конкретного компилятора Си, я не могу сказать. То небольшое собрание, которое я делаю (и оно становится около одного дня в году), делается на сборке, а не на C.

Документация MSDN содержит информацию о регистрах x64.

x64 расширяет возможности 64-разрядных регистров x64 до 64-битных и добавляет 8 новых 64-битных регистров. 64-битные регистры имеют имена, начинающиеся с "r", поэтому, например, 64-битное расширение eax называется rax. Новые регистры называются с r8 по r15.

Младшие 32 бита, 16 битов и 8 битов каждого регистра непосредственно адресуются в операндах. Это включает в себя регистры, такие как esi, младшие 8 бит которых ранее не были адресуемыми. В следующей таблице указаны имена языков ассемблера для нижних частей 64-разрядных регистров.

64-bit register | Lower 32 bits | Lower 16 bits | Lower 8 bits
==============================================================
rax             | eax           | ax            | al
rbx             | ebx           | bx            | bl
rcx             | ecx           | cx            | cl
rdx             | edx           | dx            | dl
rsi             | esi           | si            | sil
rdi             | edi           | di            | dil
rbp             | ebp           | bp            | bpl
rsp             | esp           | sp            | spl
r8              | r8d           | r8w           | r8b
r9              | r9d           | r9w           | r9b
r10             | r10d          | r10w          | r10b
r11             | r11d          | r11w          | r11b
r12             | r12d          | r12w          | r12b
r13             | r13d          | r13w          | r13b
r14             | r14d          | r14w          | r14b
r15             | r15d          | r15w          | r15b

X64 расширяет 32-битные регистры общего назначения следующим образом:

EAX -> RAX
EBX -> RBX
ECX -> RCX
EDX -> RDX
ESI -> RSI
EDI -> RDI
ESP -> RSP
EBP -> RBP

X64 также добавляет следующие 64-битные регистры общего назначения:

R8, R9, R10, R11, R12, R13, R14, R15

Кроме того, SSE является частью спецификации X64, поэтому доступны также векторные регистры xmm0-xmm15

Вы можете найти некоторую основную информацию об архитектуре в Википедии / X86-64 или перейти на сайт Intel.

Где я могу найти имена новых регистров для сборки на этой архитектуре.

В руководстве по процессору "Руководство разработчика программного обеспечения для архитектуры Intel 64 и IA-32, том 1: Базовая архитектура", например, версия 253665-053US:

  • поиск "регистров"
  • первое совпадение - индекс "РЕГИСТР ИСПОЛНЕНИЯ ОСНОВНОЙ ПРОГРАММЫ 3.4"
  • два пункта ниже "3.4.1.1 Регистры общего назначения в 64-битном режиме"

В этом разделе:

если указан размер 64-битного операнда: доступны RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8-R15. R8D-R 15D/R8-R15 представляют восемь новых регистров общего назначения.

Напоминание: 64-битный режим является "нормальным" режимом в x86-64. Другой основной режим - это "режим совместимости", который имитирует IA32.

Если вы продолжаете искать "регистр" в оглавлении, вы также найдете разделы о регистрах "дробления чисел" для чисел с плавающей запятой и SIMD, разбросанные в руководстве:

  • 8.1.2 - Регистры данных x87 FPU (STx)
  • 9.9.2 - Регистры MMX
  • 10.2.2 - Регистры XMM
  • 14.1.1 - Поддержка SIMD-регистра в 256-битной ширине (YMM)

Есть еще много контрольных регистров, которые имеют различные побочные эффекты и, как правило, не могут быть записаны, если вы не хотите этих эффектов (и часто требуется кольцо 0). Они кратко изложены в "Томе 3: Руководство по системному программированию - 2.1.6 Системные регистры", который больше предназначен для разработчиков ОС.

Хороший эмпирический подход - бежать info all-registers в GDB: Как напечатать значения регистров в GDB?

Другие вопросы по тегам