1

В 64-разрядном режиме размер адреса по умолчанию составляет 64 бит. Если присутствует префикс переопределения размера адреса (67h), размер адреса составляет 32 бита.Префикс переадресации адреса в 64-битном режиме

Я знаю, что канонические 64-битные адреса имеют биты 63 через самый значительный реализованный бит либо все 0 или все 1s. Является ли 32-разрядный адрес (полученный путем префикса 67h инструкцией в 64-битном режиме), который должен быть в канонической форме? Если да, как определяется эта каноническая форма?

ответ

3

Канонические адреса формируются посредством знака, расширяющего значительную часть (нижние 48 бит) виртуального адреса; самый старший бит рассматривается как знак.

Размышляя об этом сейчас (не готов смотреть его - но это тоже не надо, чтобы ответить на ваш вопрос) - есть два мыслимые поведения для 32-битных адресов в 64-разрядном режиме:

  1. Процессор обрабатывает его, как использование 32-битного регистра/операнда, то есть нулевое расширение до 64 бит/неявно обрабатывать высокие 32-разрядные как нули
    В этом случае любой 32-битный адрес является каноническим, поскольку любой 64-битный адрес 0x00000000xxxxxxxx является каноническим.
  2. рассматривает продуктивный CPU это как «32bit значительного» и подписаться распространяется на 64 из наиболее значащих битого адреса 32-битного
    В этом случае, а также, любого 32bit адрес является каноническим, потому что тогда диапазон 32bit бы карты от 0xffffffff80000000 ... 0x000000007fffffff - снова, все из которых являются каноническими.

Поскольку результат (32-разрядные адреса, всегда неявно имеющие каноническую форму), то же самое, не имеет значения, что на самом деле делает ЦП - 32-битные адреса являются каноническими, периодами.

+2

Спасибо. В этом есть смысл. Кроме того, я более тщательно изучил руководства Intel и в томе 1, стр. 3-12, я обнаружил, что 32-разрядный адрес имеет нулевое расширение, чтобы сформировать 64-разрядный адрес. Просто поставьте его здесь, если кто-то задается вопросом об эффективных вычислениях адресов. – shigoel