- •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.4. Указатель вспомогательной памяти для сохранений памяти (bspstore – ar18)
- •3.1.8.5. Сборный регистр NaT для rse (rnat – ar19)
- •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. Модель прикладных регистров.
Когда поля отмечены как зарезервированные, то это необходимо для совместимости с будущими процессорами, чье программное обеспечение будет обращаться к этим полям с неизвестным пока эффектом. Программное обеспечение должно руководствоваться следующими принципами, когда имеет дело с резервированными полями:
Не зависеть от состояния любых резервированных полей. Маскировать все резервированные поля перед проверкой содержимого.
Не зависеть от состояния любых резервированных полей при сохранении в память или регистр.
Не зависеть от способности сохранения информации записанной в резервированные и игнорируемые поля.
Где возможно, загружайте резервируемые и игнорируемые поля значениями, предварительно считанными из того же регистра, либо загрузите их нулями.

banked