Регистры сборки в 64-битной архитектуре

Следуя ответу о размерах регистров сборки:

  • Во-первых, какие размеры eax, ax, ah и их аналоги в 64-битной архитектуре? Как получить доступ к одному байту регистра и как получить доступ ко всем восьми байтам 64-битного регистра?

    Я хотел бы обратить внимание на процессоры x86-64 (x64) и Itanium.

  • Во-вторых, как правильно использовать четыре регистра для хранения первых четырех параметров в вызовах функций в новое соглашение о вызовах?


person Reflection    schedule 17.12.2013    source источник
comment
хмм 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


Ответы (1)


Со старыми именами все регистры остаются того же размера, как когда 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

См. Как называются регистры новых процессоров 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