Сборочные регистры в 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?
Что касается соглашения о вызовах, в конкретной системе существует только одно соглашение 1.
- 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. Вы также должны прочитать это
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?