Расчет адреса x86-64 в 64-битном режиме с 32-битным размером адреса

Я читал руководство Intel по вычислению адресов в 64-битном режиме. Предположим, у нас 64-битный режим, размер адреса по умолчанию - 64 бит. Предположим также, что рассматриваемой инструкции предшествует префикс переопределения размера адреса, поэтому размер адреса становится 32-битным.

Теперь представьте, что инструкция кодирует операнд памяти с адресом, указанным в регистре с номером 0 (rax / eax / ax ...).

Теперь то, что я не совсем понимаю, смотрит ли ЦП только на значение eax и внутренне расширяет его с помощью нуля, чтобы сформировать «собственный» 64-битный адрес, или он смотрит на все значение rax и усекает его до допустимого 32-битного диапазона (например, , rax содержит что-то вроде 5Gb, и CPU сокращает его до максимального 32-битного адреса).


person igntec    schedule 17.05.2015    source источник
comment
Вы говорите одно и то же? Также 3 ГБ умещается в 32 бита.   -  person Jester    schedule 17.05.2015
comment
Извините, я исправил 3 ГБ на 5 ГБ. Я имею в виду, если старшая часть rax не равна нулю, это повлияет на расчет адреса?   -  person igntec    schedule 17.05.2015
comment
Нет, не будет. Кстати, вы можете легко это проверить.   -  person Jester    schedule 17.05.2015
comment
А что, если база (например 3 ГБ) + индекс (например 2 ГБ) больше, чем максимальный 32-битный адрес? Вычисления выполняются с 32-битной шириной, поэтому результатом будет максимально допустимый 32-битный адрес. Это правильно?   -  person igntec    schedule 17.05.2015
comment
Я не понимаю этого вопроса.   -  person Jester    schedule 17.05.2015


Ответы (1)


Когда на 64-битных процессорах используется 32-битная адресация, результат вычисления адреса усекается до 32-битного, а затем с нуля расширяется до 64-битного. Обратите внимание, что 32-битная адресация определяется как использование 32-битных регистров, поэтому, если RAX содержит 140000000h (5 ГБ), вместо этого используется значение EAX (40000000h). Хотя на практике это не имеет большого значения.

Из Руководства разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 1: Базовая архитектура:

Все вычисления 16-битных и 32-битных адресов расширяются нулями в режиме IA-32e для формирования 64-битных адресов. Вычисления адресов сначала усекаются до эффективного размера адреса текущего режима (64-битный режим или режим совместимости), который перекрывается любым префиксом размера адреса. Затем результат расширяется нулями до полной 64-битной ширины адреса. Из-за этого 16-битные и 32-битные приложения, работающие в режиме совместимости, могут получить доступ только к низким 4 ГБ эффективных адресов 64-битного режима. Точно так же 32-битный адрес, сгенерированный в 64-битном режиме, может получить доступ только к младшим 4 ГБ эффективных адресов 64-битного режима.

person Ross Ridge    schedule 17.05.2015