Каноническая адресация

В 64-битном режиме адрес считается в канонической форме, если адресные биты 63 до самого значительного реализованного бита микроархитектурой установлены либо на все, либо на все нули.

Архитектура Intel 64 определяет 64-битный линейный адрес. Реализации могут поддерживать меньше. Первая реализация процессоров IA-32 с архитектурой Intel 64 поддерживает 48-битный линейный адрес. Это означает, что канонический адрес должен иметь биты с 63 по 48, установленные на нули или единицы (в зависимости от того, является ли бит 47 нулем или одним).

Хотя реализации не могут использовать все 64 бита линейного адреса, они должны проверять биты 63 через самый значительный реализованный бит, чтобы узнать, находится ли адрес в канонической форме. Если ссылка на линейную память не находится в канонической форме, реализация должна генерировать исключение. В большинстве случаев генерируется исключение общей защиты (#GP). Однако в случае явных или подразумеваемых ссылок на стек генерируется ошибка стека (#SS).

Инструкции, которые подразумевают ссылки на стек, по умолчанию используют регистр сегментов SS. К ним относятся PUSH / POPrelated инструкции и инструкции с использованием RSP / RBP в качестве базовых регистров. В этих случаях каноническая ошибка #SS.

Если инструкция использует базовые регистры RSP / RBP и использует префикс переопределения сегмента для указания сегмента без SS, каноническая ошибка генерирует #GP (вместо #SS). В 64-битном режиме в этой ситуации применимы только FS и GS-переопределения. Другие префикс переопределения сегмента (CS, DS, ES и SS) игнорируются. Обратите внимание, что это также означает, что переопределение SS-сегмента, примененное к ссылке на регистр «не стека», игнорируется. Такая последовательность все еще производит #GP для канонической ошибки (а не #SS).

ОСНОВНЫЕ РЕГИСТРЫ ВЫПОЛНЕНИЯ ПРОГРАММЫ

Архитектура IA-32 предоставляет 16 базовых регистров выполнения программ для использования в общем системном и прикладном программировании (см. Рис. 3-4). Эти регистры могут быть сгруппированы следующим образом:

• Регистры общего назначения. Эти восемь регистров доступны для хранения операндов и указателей.

• Регистры сегментов. Эти регистры содержат до шести сегментных селекторов.

• Регистр EFLAGS (статус программы и управление). Отчет регистра EFLAGS о статусе программы

выполняется и позволяет ограничить (уровень прикладной программы) управление процессором.

• Регистр EIP (указатель инструкции). Регистр EIP содержит 32-битный указатель на следующую команду, которая должна быть выполнена.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: