Со старыми именами все регистры остаются того же размера, как когда x86-16 был расширен до x86-32. Для доступа к 64-битным регистрам вы используете новые имена с R-префиксом, например rax, rbx ...
Имена регистров не меняются, поэтому вы просто используете байтовые регистры (al, bl, cl, dl, ah, bh, ch, dh) для LSB и MSB для ax, bx, cx, dx, как раньше.
Также есть 8 новых регистров, называемых r8-r15. Вы можете получить доступ к их младшим битам, добавив суффикс b
(или l
, если вы используете AMD). Например, r8b, r9b ... Вы также можете использовать LSB для esi, edi, esp, ebp с именами sil, dil, spl, bpl с новым REX prefix, но вы не можете использовать его одновременно с ah, bh, ch или dh.
Точно так же к младшему слову или двойному слову нового регистра можно получить доступ через суффикс w
или d
.
![регистры x86_64](https://i.stack.imgur.com/N0KnG.png)
См. Как называются регистры новых процессоров X86_64?
Что касается соглашения о вызовах, в конкретной системе существует только одно соглашение 1.
в Windows:
- RCX, RDX, R8, R9 for the first four integer or pointer arguments
- XMM0, XMM1, XMM2, XMM3 для аргументов с плавающей запятой
1 Начиная с MSVC 2013 существует также новое расширенное соглашение в Windows под названием _ 5_, поэтому" политика единого соглашения "больше не верна.
В Linux и других системах, следующих за System V AMD64 ABI, в регистры можно передать больше аргументов, и есть 128 -байт красной зоны под стеком, что может ускорить вызов функций.
- The first six integer or pointer arguments are passed in registers RDI, RSI, RDX, RCX, R8, and R9
- Аргументы с плавающей запятой передаются от XMM0 до XMM7.
Для получения дополнительной информации прочтите x86-64 и соглашения о вызовах x86-64
Также существует соглашение, используемое в Плане 9, где
- Все регистры сохраняются для вызывающих абонентов
- Все параметры передаются в стек
- Возвращаемые значения также возвращаются в стеке в пространстве, зарезервированном под аргументами (по стеку; более высокие адреса на amd64).
Фактически, Plan 9 всегда был чудаком. Например, он заставляет регистр быть равным 0 в архитектурах RISC без аппаратного нулевого регистра. Имена регистров x86 на нем также согласованы в 16-, 32- и 64-разрядных архитектурах x86 с размером операнда, обозначенным мнемоническим суффиксом. Это означает, что ax может быть 16-, 32- или 64-битным регистром в зависимости от суффикса инструкции. Если вам интересно, прочтите
OTOH Itanium - это совершенно другая архитектура и не имеет отношения к x86-64 вообще. Это чистая 64-битная архитектура, поэтому все обычные регистры 64-битные, 32-битная или меньшая версия недоступна. В нем много регистров:
- 128 целочисленных регистров общего назначения с r0 по r127, каждый из которых содержит 64 бита значений и бит прерывания. Подробнее о ловушке мы узнаем позже.
- 128 регистров с плавающей запятой от f0 до f127.
- 64 предикатных регистра с p0 по p63.
- 8 регистров ветвления с b0 по b7.
- Указатель инструкции, который механизм отладки Windows почему-то называет iip. (Дополнительное «i» означает «безумный»?)
- 128 специальных регистров, не всем из которых даны значения. Почему-то они называются «регистрами приложений» (ar). Я буду освещать выбранный реестр по мере их возникновения в ходе обсуждения.
- Другие разные регистры мы не будем рассматривать в этой серии.
Процессор Itanium, часть 1: разогрев
Подробнее см. В чем разница между x64 и IA-64?
person
phuclv
schedule
17.12.2013
eax == 32bits
ax == 16bits
ah|al == 8bits
, это всегда так, x64 добавляет новые регистры, еще в 16-битные дни у нас было толькоax & al & ah
, а затем, когда появилась 32-битная адресация, она была добавлена таким образом, который на самом деле не повлиял на то, как вы обращаетесь к 16-битной или 8-битные регистры, новые регистры в x64 (64-битные перекрывающиеся регистры, eax, перекрывающие ax и т. Д.) Начинаются сr
, поэтомуrax
rbx
и так далее. Дополнительную информацию см. здесь. - person James   schedule 17.12.2013