Канонические адреса формируются посредством знака, расширяющего значительную часть (нижние 48 бит) виртуального адреса; самый старший бит рассматривается как знак.
Размышляя об этом сейчас (не готов смотреть его - но это тоже не надо, чтобы ответить на ваш вопрос) - есть два мыслимые поведения для 32-битных адресов в 64-разрядном режиме:
- Процессор обрабатывает его, как использование 32-битного регистра/операнда, то есть нулевое расширение до 64 бит/неявно обрабатывать высокие 32-разрядные как нули
В этом случае любой 32-битный адрес является каноническим, поскольку любой 64-битный адрес 0x00000000xxxxxxxx
является каноническим.
- рассматривает продуктивный CPU это как «32bit значительного» и подписаться распространяется на 64 из наиболее значащих битого адреса 32-битного
В этом случае, а также, любого 32bit адрес является каноническим, потому что тогда диапазон 32bit бы карты от 0xffffffff80000000
... 0x000000007fffffff
- снова, все из которых являются каноническими.
Поскольку результат (32-разрядные адреса, всегда неявно имеющие каноническую форму), то же самое, не имеет значения, что на самом деле делает ЦП - 32-битные адреса являются каноническими, периодами.
Спасибо. В этом есть смысл. Кроме того, я более тщательно изучил руководства Intel и в томе 1, стр. 3-12, я обнаружил, что 32-разрядный адрес имеет нулевое расширение, чтобы сформировать 64-разрядный адрес. Просто поставьте его здесь, если кто-то задается вопросом об эффективных вычислениях адресов. – shigoel