- •3. Исполнительная среда.
- •3.1. Состав прикладных регистров
- •3.1.1 Резервируемые и игнорируемые регистры и поля
- •3.1.2. Основные регистры.
- •3.1.3. Регистры с плавающей точкой
- •3.1.4. Предикатные регистры
- •3.1.5. Регистры переходов
- •3.1.6. Указатель инструкций.
- •3.1.7. Маркер текущего окна
- •3.1.8. Прикладные регистры
- •3.1.8.1. Регистры ядра (kr0-7 –ar0-7)
- •3.1.8.2. Регистр конфигурации стека регистров (rsc–ar16)
- •3.1.8.3. Указатель вспомогательной памяти rse(bsp–ar17)
- •3.1.8.10. Предыдущее функциональное состояние (pfs–ar64)
- •3.1.8.11. Регистр счетчика цикла (lc–ar65)
- •3.1.8.12. Регистр счетчика эпилога (ec–ar66)
- •3.1.9. Регистры данных мониторинга производительности (pmd)
- •3.1.10 Маска пользователя (um)
- •3.1.11. Регистры идентификации процессора
- •3.2. Память
- •3.2.1. Модель адресации прикладной памяти
- •3.2.2. Адресация блоков и выравнивание
- •3.2.3. Упорядочивание байтов
- •3.3. Обзор кодирования инструкций
- •3.4. Рассмотрение последовательности инструкций
- •3.4.1. Специальные случаи зависимости raw
- •3.4.2. Специальные случаи зависимости waw
- •3.4.3. Специальные случаи зависимости war
- •3.4.4. Поведение процессора при нарушениях зависимости
- •3.5. Неопределенное поведение
3. Исполнительная среда.
Архитектурное состояние состоит из регистров и памяти. Результаты выполнения инструкции становятся архитектурно видимыми согласно набору правил последовательности исполнения. Эта глава описывает состав прикладной архитектуры и правила для исполнительной последовательности. Детали описаны в главе 6 при описании выполнения набора инструкций IA-32.
3.1. Состав прикладных регистров
Прикладным программам доступен следующий список регистров (см. рис.3.1):
General Registers (GRs) – основные регистры представлены регистровым файлом GR0-GR127. При выполнении инструкций IA-32, целочисленные и сегментные регистры IA-32 содержатся в GR8-GR31.
Floating-point Registers (FRs) – регистры с плавающей точкой образуют файл FR0-FR127. При выполнении инструкций IA-32, регистры с плавающей точкой и регистры мультимедиа IA-32 содержатся в FR8-FR31.
Predicate Registers (PRs) – однобитные предикатные регистры PR0-PR63, используются в предикации и ветвлении.
Branch Registers (BRs) – регистры переходов используемые в ветвлении (branching), BR0-BR7.
Instruction Pointer (IP) – указатель инструкции – регистр, который содержит адрес связки текущей выполняемой инструкции, либо байтовый адрес для инструкции IA-32.
Current Frame Marker (CFM) – маркер текущего окна – описывает текущее окно стека основных регистров и FR/PR ротацию.
Application Registers (ARs) – прикладные регистры – набор регистров специального назначения.
Performance Monitor Data Registers (PMD) – Регистры данных для аппаратного мониторинга производительности.
User Mask (UM) – маска пользователя – устанавливает однобитные значения используемые для настройки ловушек, мониторов производительности и наблюдения за использованием регистров с плавающей точкой.
Processor Identifiers (CPUID) – идентификаторы процессора – регистры, которые описывают свойства зависящие от конкретной реализации процессора.
Состав прикладных регистров IA-32, в целом, содержится внутри большого набора прикладных регистровItaniumи доступен инструкциямItanium. Но инструкцииIA-32, не имеют доступа к набору регистрамItanium. Детальнее соотношение регистров описано в разделе 6.2 «Модель состава прикладных регистровIA-32».
3.1.1 Резервируемые и игнорируемые регистры и поля
Регистры, которые не определены, являются либо зарезервированными, либо игнорируемыми. При обращении к зарезервированному региструвызывается ошибка «Запрещенная операция». Чтениеигнорируемого регистравозвращает ноль. Программа может записывать любое значение в игнорируемый регистр, но аппаратура проигнорирует эту запись. В наборах регистров изменяемого размера, регистры, которых нет в конкретном процессоре, являются зарезервированными. Обращение к одному из таких отсутствующих регистров приведет к ошибке «Зарезервированный регистр/поле». Если внутри заданных регистров есть поля, которые не определены, то такие поля являются либо зарезервированными, либо игнорируемыми. При чтениизарезервированных полейаппаратура будет всегда возвращать ноль. Программа всегда должна записывать нули в эти поля. В противном случае, при записи в такое поле не нулевого значения будет вызвана ошибка «Зарезервированный регистр/поле». Зарезервированные поля могут быть использованы в будущем.
При чтении игнорируемых полей аппаратура всегда возвращает 0 (если не отмечено иное). Программа может записывать в такое поле любое значение – аппаратура проигнорирует эту запись. В качестве исключения отметим, что некоторые игнорируемые поля IA-32, могут быть использованы в дальнейшем.
Таблица 3.1. обобщает, как процессор реагирует на обращение к зарезервированным и игнорируемым полям.
Табл.3.1. Реакция зарезервированных и игнорированных регистров и полей
Тип |
Чтение |
Запись | |
Резервирован. |
Регистр |
Вызов ошибки «Запрещенная операция» | |
Поле |
0 |
При ненулевой записи вызывается ошибка «Зарезервированный регистр/поле» | |
Игнорируем. |
Регистр |
0 |
Запись игнорируется |
Поле |
0 (если иное не отмечено) |
Запись игнорируется |
Если регистр имеет неопределенное значение, то его поля являются зарезервированными. Программа всегда должна записывать только указанные значения в такие поля. В противном случае, запись резервированного значения вызовет ошибку «Зарезервированный регистр/поле». Некоторые регистры являются только читаемыми. Запись в такой регистр вызовет ошибку «Запрещенная операция».
|
|
Рис.3.1. Модель прикладных регистров.
Когда поля отмечены как зарезервированные, то это необходимо для совместимости с будущими процессорами, чье программное обеспечение будет обращаться к этим полям с неизвестным пока эффектом. Программное обеспечение должно руководствоваться следующими принципами, когда имеет дело с резервированными полями:
Не зависеть от состояния любых резервированных полей. Маскировать все резервированные поля перед проверкой содержимого.
Не зависеть от состояния любых резервированных полей при сохранении в память или регистр.
Не зависеть от способности сохранения информации записанной в резервированные и игнорируемые поля.
Где возможно, загружайте резервируемые и игнорируемые поля значениями, предварительно считанными из того же регистра, либо загрузите их нулями.