Какие регистры считаются «адресными регистрами» в сборке? Я думал, что ответ будет примерно таким: все сегментные регистры плюс EBP
, ESP
и EIP
, поскольку они содержат «адреса», если можно так сказать. Но, к моему удивлению, правильный ответ на самом деле таков: сегмент регистрируется и EIP
. Я не мог найти никакого объяснения этому, жестко. Почему регистры сегментов и EIP
называются «адресными регистрами»? Почему именно эти регистры, а не какие-то другие регистры? (P.S. Я использую x86 NASM, если это имеет значение)
Это всего лишь вопрос определения. Во всяком случае, я не думаю, что кто-то считает регистры сегментов адресными регистрами. EIP
даже не является непосредственно доступным регистром, но он используется процессором в качестве адреса. Точно так же некоторые инструкции неявно используют ESP
, ESI
, EDI
и EBP
в качестве адресов, но вы можете явно использовать любой из них и остальные GPR, например. [EAX]
.
«адресный регистр» не имеет конкретного технического значения, которое работает через ISA. Не существует общепризнанного правила, которое делает этот выбор классификации правильным, а другие неверными. «адресный регистр» в смысле m68k подразумевает, что он в основном используется для хранения указателей, но вы не можете использовать программный счетчик в качестве указателя данных. (А 32-битный x86 даже не имеет относительной RIP-адресации.) Таким образом, кто бы ни придумывал здесь классификации, он использует другую интерпретацию.
Сегментные регистры явно не являются обычными адресными регистрами. В защищенном режиме они выбирают запись GDT. Однако внутренняя/скрытая база сегментов содержит фактический линейный адрес. (Для FS и GS доступны через wrmsr
to MSR_FS_BASE
/ MSR_GS_BASE
. Для остальных только путем изменения селектора, чтобы инициировать загрузку нового дескриптора.)
По сути, я не думаю, что это очень полезная концепция, если вы делаете это таким образом. Интересный вопрос заключается в том, сколько указателей данных вы можете хранить в регистрах, чтобы любой из них можно было использовать, например. сколько массивов вы можете перебрать одновременно, не исчерпав регистров. «сколько адресных регистров имеет m68k? 8, включая указатель стека». Но это бесполезное определение для сравнения x86 с другими ISA. Особенно с учетом того, что x86 практически повсеместно используется с плоской моделью памяти ss.base=cs.base=ds.base=es.base.
Ну, не 8-битные части регистра в 16-битном режиме, и не 8- или 16-битные части регистра в 32-битном режиме, и не 8-, 16- или 32-битные части регистра в 64-битном режиме. битовый режим.
Для 80x86 нет четкого и авторитетного определения «адресного регистра»; и (если нет четкого и авторитетного определения - например, в руководстве производителя ЦП) «адресный регистр» может быть определен как угодно.
Например, для 80x86 вы можете сказать, что все регистры общего назначения могут использоваться в качестве адреса (например, «mov eax,[eax]
», «mov eax,[ebx]
» или ..), и поэтому все регистры общего назначения являются «адресными регистрами».
В другом примере для 80x86 можно сказать, что сегментные регистры содержат структуру материала (видимое значение, базовый адрес, лимит, тип) и, следовательно, не являются «адресными регистрами», а почти все обычные регистры (EIP
, ESP
, ESI
, EDI
, ...) может содержать смещение только внутри сегмента (который сам по себе не является адресом) и, следовательно, также не является «адресными регистрами»; и что адресных регистров нет вообще.
В x86-64, где базы сегментов фиксированы на 0, проще утверждать, что регистры целых чисел GP являются «регистрами адреса» в этом смысле: линейный адрес = смещение, если только вы не переопределяете базу FS или GS. Но да, интересный момент для защищенного и реального режимов.
@PeterCordes: В качестве другого примера, для 64-битного кода в формате 80x86 можно сказать, что существуют «регистры виртуальных адресов» (GDTR, IDTR, rip
, rsp
) и некоторые «регистры физических адресов» (cr3
, локальный базовый адрес APIC MSR) но никаких «адресных регистров», потому что это не имеет смысла, когда есть 2 (или более) разных типа адресов. ;-)
Как говорится, в вычислениях есть только две сложные проблемы: присвоение имен и инвалидация кеша. По этому аргументу регистры адреса m68k становятся «регистрами виртуального адреса», если в системе есть MMU. (Хотя это немного отличается, потому что MMU не является обязательным для m68k, но длинный режим x86-64 требует включения подкачки.)
Также следует упомянуть, что AVX представила адресацию VSIB, где XMM0..ZMM31 играют роль регистров адресации индекса в инструкциях сбора/разброса, таких как felixcloutier.com/x86/vgatherdpd:vgatherqpd
Несомненно, существует один или несколько наборов инструкций, в которых для обращения к чему-то необходимо использовать определенный регистр или набор регистров. Но это исключение, а не правило.
Для рассматриваемого набора инструкций просто просмотрите документацию и найдите инструкции загрузки/сохранения/чтения/записи/перемещения/и т. д., которые могут обращаться к памяти, просматривать кодировки и отображать список регистров для этой архитектуры, которые могут использоваться для хранения адресов для адресных транзакций (или иногда непосредственное может быть в самой инструкции, которая является адресом, а не находится в регистре).
Поскольку x86 пойдет против некоторых комментариев и скажет, что регистры сегментов, в частности, являются адресными регистрами, поскольку их содержимое специально используется для генерации адреса. Не сам по себе он объединяется с другими битами для создания полного адреса. Но их назначение и содержание используется при генерации адресов. Я бы, конечно, не стал использовать термин «регистр адресов» сам по себе для их описания.
Некоторые архитектуры (например, M68k) имеют выделенные адресные регистры. X86 имеет только регистры общего назначения, хотя в 16-битном режиме только
bx
,si
,di
иbp
могут использоваться для явных операндов памяти (sp
используется для группы неявных операндов памяти). Однако слово «адресные регистры» обычно не используется для описания чего-либо в x86. Откуда взялось утверждение о том, что регистры сегментовebp
,esp
иeip
являются «адресными регистрами»?