2009-11-18 1 views
40

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

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

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

+0

Ребята Как я могу сказать, что регистры коррелируют с параметрами при выполнении системного вызова. Я читал и документировал и не нашел ясного ответа. – Recursion

+0

Обратите внимание, что старые верхние 8-битные регистры (ah, bh и т. Д.) Больше не работают для всех кодов операций. например 'inc ah' недопустим в x64, потому что этот код операции был повторно использован для одного из новых 64-битных регистров. – Johan

+1

@Johan: также обратите внимание, что с префиксом REX регистровые коды для ah bh ch dh становятся новыми байтовыми регистрами sil dil bpl spl –

ответ

57

Старые 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.

Для получения более подробной информации см. wikipedia page и MSDN.

Независимо от того, поддерживаются ли они в ключевое слово asm для конкретного компилятора C, я не мог сказать. Что немного сборки я (и это становится примерно один день в год) делается в сборке, а не С.

+0

что стоит «R» для? –

+24

@ int80, понятия не имею. Возможно, 'e' означает расширенный и' r' означает _really_ extended :-) – paxdiablo

+1

Я знаю, что «e» означает расширенный (от 16 бит). но r? но ваш ответ просто логический%) –

8

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 доступны также

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

79

MSDN documentation содержит информацию о регистрах x64.

x64 распространяется 8 общего назначения регистры 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 
+0

Это ясно, но более низкий 8-битный режим кажется недействительным для 'r8' ~' r15' на моем процессоре intel x86-64, хотя он работает и для других 8 регистров общего назначения. Кроме того, поддержка 'rax' ~' rdx' для доступа к 8 битам в режиме «высокий» означает доступ к самым значительным 8 битам 16-разрядного режима с использованием 'ah' ~' dh'. –

+0

@EricWang: Вы пытались использовать 'mov ah, r8b' или что-то еще? Вы не можете использовать регистр high-8 с префиксом REX. 'REX mov ah, 0' является' mov spl, 0' и т. Д. (Кодировки для 'AH/CH/DH/BH' означают' spl/bpl/sil/dil', когда есть префикс REX (в указанном порядке в машинный код) –

4

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

В процессора вручную "Intel 64 и IA-32 Архитектуры Software Developer Руководство Том 1: Базовая архитектура", например, version 253665-053US:

  • поиск «регистры»
  • первый матч индекс «3.4 ОСНОВНЫХ ВЫПОЛНЕНИЯ ПРОГРАММЫ РЕЕСТР»
  • два пункт ниже «3.4.1.1 общепромышленных регистров в режиме 64-Bit»

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

, если 64-битный размер операнда задается: RAX, RBX, RCX, RD X, 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 - 256-битный SIMD Регистрация Поддержка (YMM)

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

Хороший эмпирический подход заключается в запуске info all-registers в GDB: How to print register values in gdb?

Смежные вопросы