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

После ответа о размерах регистров сборки:

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

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

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

1 ответ

Решение

Со старым именем все регистры остаются одинакового размера. Для доступа к 64-битным регистрам вы используете новое имя с префиксом R, например rax, rbx...

Имена регистров не меняются, поэтому вы просто используете байтовые регистры (al, bl, cl, dl, ah, bh, ch, dh) для LSB и MSB для ax, bx, cx, dx, как раньше.

Также есть 8 новых регистров, которые называются r8-r15. Вы можете получить доступ к их LSB, добавив суффикс b (или же l если вы используете AMD). Например, r8b, r9b... Вы также можете использовать младший бит esi, edi, esp, ebp с именами sil, dil, spl, bpl с новым префиксом REX, но вы не можете использовать его одновременно с ах, чч, ч или дх.

Аналогично, нижнее слово или двойное слово в новых регистрах может быть доступно через суффикс w или же d,

x86_64 регистры

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


Что касается соглашения о вызовах, в конкретной системе существует только одно соглашение 1.

  • В Windows:

    • RCX, RDX, R8, R9 для первых четырех целочисленных или указательных аргументов
    • XMM0, XMM1, XMM2, XMM3 для аргументов с плавающей запятой

    1 Начиная с MSVC 2013, существует также новое расширенное соглашение для Windows под названием __vectorcall,

  • В Linux и других системах, следующих за System V AMD64 ABI, в регистры можно передавать больше аргументов, что может ускорить вызов функций.
    • Первые шесть целочисленных или указательных аргументов передаются в регистрах RDI, RSI, RDX, RCX, R8 и R9
    • Аргументы с плавающей точкой передаются в XMM0 через XMM7

x86_64 соглашения о вызовах

Это большинство основ x86_64. Вы также должны прочитать это


OTOH Itanium - это совершенно другая архитектура, которая никак не связана с x86_64. Это чисто 64-битная архитектура, поэтому все обычные регистры 64-битные, 32-битная или более мелкая версия недоступна. В нем много регистров:

  • 128 целочисленных регистров общего назначения от r0 до r127, каждый из которых содержит 64 бита значения и бит прерывания. Мы узнаем больше о ловушке чуть позже.
  • 128 регистров с плавающей запятой от f0 до f127.
  • 64 предикатных регистра от p0 до p63.
  • 8 отраслевых регистров от b0 до b7.
  • Указатель инструкций, который механизм отладки Windows почему-то называет iip. (Дополнительное "я" для "безумный"?)
  • 128 регистров специального назначения, не все из которых имеют значения. Они называются "регистрами приложений" (ar) по некоторым причинам. Я буду освещать выбранный регистр по мере их возникновения во время обсуждения.
  • Другие разные регистры мы не рассмотрим в этой серии.

https://blogs.msdn.microsoft.com/oldnewthing/20150727-00/?p=90821

Подробнее о том, в чем разница между x64 и IA-64?

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