- •6. Модель прикладного выполнения в системной среде Intel® Itanium™
- •6.1. Режимы набора инструкций
- •6.1.1. Выполнение набора инструкций в среде Intel Itanium.
- •6.1.2. Выполнение набора инструкций ia-32
- •6.1.3. Переключения наборов инструкций
- •6.1.3.1. Инструкция jmpe
- •6.1.3.2. Инструкция перехода к ia
- •6.1.4. Переключения режимов работы ia-32
- •6.2. Модель состояния прикладных регистров ia-32
- •6.2.1. Регистры общего назначения ia-32
- •6.2.2. Указатель инструкций ia-32
- •6.2.3. Сегментные регистры ia-32
- •6.2.3.1. Сегменты данных и кода
- •6.2.3.2. Сегментный дескриптор и целостность среды
- •6.2.3.2.1. Защищенный режим.
- •6.2.3.2.2 Режим vm86
- •6.2.3.2.2 Реальный режим
- •6.2.3.3. Проверки целостности среды ia-32 во время выполнения
- •6.2.4. Прикладной ia-32 регистр eflag
- •6.2.5.2. Специальные случаи
- •6.2.5.3. Регистры управления с плавающей точкой ia-32.
- •6.3. Обзор моделей памяти
- •6.3.1. Упорядочивание памяти
- •6.3.2. Сегментация ia-32
- •6.3.3. Самомодифицирующийся код
- •6.3.4. Взаимодействия упорядочивания памяти.
- •6.4. Использование кодом ia-32, регистров Itanium
- •6.4.1. Механизм стека регистров
- •6.4.3. Влияние NaT/NaTVal на инструкции ia-32
6.2.4. Прикладной ia-32 регистр eflag
Регистр EFLAG (AR24) состоит из двух основных компонентов – арифметических флагов пользователя (CF, PF, AF, ZF, SF, OF и ID) и системных управляющих флагов (TF, IF, IOPL, NT, RF, VM, AC, VIF, VIP). Нет арифметических или системных флагов связанных с выполнением инструкций Itanium. Когда программа типа Itanium загружает этот прикладной регистр (AR24), тогда, если в зарезервированных битах будет записано не нулевое значение, то будет вызвана ошибка «Зарезервированный регистр/поле». См. раздел 10.3.2 «Регистр EFLAG системы IA-32» во втором томе.
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Резервировано (=0) |
id |
vip |
vif |
ac |
vm |
rf |
0 |
nt |
io |
pl |
of |
df |
if |
tf |
sf |
zf |
0 |
af |
0 |
pf |
1 |
cf |
|||||||||
63 |
62 |
61 |
60 |
59 |
58 |
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
49 |
48 |
47 |
46 |
45 |
44 |
43 |
42 |
41 |
40 |
39 |
38 |
37 |
36 |
35 |
34 |
33 |
32 |
Резервировано (установить в 0) |
|||||||||||||||||||||||||||||||
Рис.6.7. IA-32 регистр EFLAG (AR24).
Арифметические флаги используются набором инструкций IA-32 для отображения состояния операций IA-32, управления строковыми операциями IA-32 и управления условиями переходов для инструкций IA-32. Эти флаги игнорируются Itanium инструкциями. Флаги ID, OF, DF, SF, ZF, AF, PF и CF описаны в Intel Architecture Software Developer's Manual.
Табл. 6.5. Поля IA-32 регистра EFLAGS
EFLAGA |
Биты |
Описание |
cf |
0 |
IA-32 флаг переноса. Подробнее см. в IASDMB |
|
1 |
Игнорируется. – Запись игнорируется, чтение возвращает 0 и для IA-32, и для Itanium инструкций. |
|
3,5, 15 |
Игнорируется. – Запись игнорируется, чтение возвращает 0 и для IA-32, и для Itanium инструкций. Программа должна установить эти биты в 0. |
pf |
2 |
IA-32 флаг паритета. Подробнее см. в IASDMB |
af |
4 |
IA-32 флаг дополнительного переноса. Подробнее см. в IASDMB |
zf |
6 |
IA-32 флаг нулевого результата. Подробнее см. в IASDMB |
sf |
7 |
IA-32 флаг знака. Подробнее см. в IASDMB |
tf |
8 |
См. раздел 10.3.2 «Регистр EFLAG системы IA-32» во втором томе. |
if |
9 |
|
df |
10 |
IA-32 флаг направления. Подробнее см. в IASDMB |
of |
11 |
IA-32 флаг переполнения. Подробнее см. в IASDMB |
iopl |
13:12 |
См. раздел 10.3.2 «Регистр EFLAG системы IA-32» во втором томе. |
nt |
14 |
|
rf |
16 |
|
vm |
17 |
|
ac |
18 |
|
vif |
19 |
|
vip |
20 |
|
id |
21 |
|
|
63:22 |
Резервировано, должно быть установлено в 0 |
При входе в набор инструкций IA-32 все биты могут быть прочитаны последующими инструкциями IA-32, после выхода из набора инструкций IA-32 эти биты показывают результаты всех предшествующих инструкций IA-32. Ни один из битов EFLAG не изменяет поведение Itanium инструкций при выполнении.
IASDM – это Intel Architecture Software Developer's Manual.
6.2.5. IA-32 регистры с плавающей точкой
Стек IA-32 регистров с плавающей точкой, числовые средства управления и среды с плавающей точкой, отображаются в Itanium регистрах с плавающей точкой FR8-FR15, а имена прикладных регистров размещены так, как показано в табл. 6.6.
Табл. 6.6. Отображение IA-32 регистров с плавающей точкой
Itanium регистр |
IA-32 регистр |
Размер (бит) |
Описание |
FR8 |
ST[(TOS+N)==0] |
80 |
Стек цифровых регистров IA-32. Обращения к FR8-FR15 с помощью Itanium инструкций игнорируют IA-32 настройку TOS. Обращения IA-32 используют настройку TOS для получения регистра N. |
FR9 |
ST[(TOS+N)==1] |
||
FR10 |
ST[(TOS+N)==2] |
||
FR11 |
ST[(TOS+N)==3] |
||
FR12 |
ST[(TOS+N)==4] |
||
FR13 |
ST[(TOS+N)==5] |
||
FR14 |
ST[(TOS+N)==6] |
||
FR15 |
ST[(TOS+N)==7] |
||
FCR (AR21) |
FCW, MXCSR |
64 |
IA-32 управляющее слово FPU и SSE управляющий регистр |
FSR (AR28) |
FSW, FTW, MXCSR |
64 |
Слова тегов и состояния FPU IA-32 и SSE состояние |
FIR (AR29) |
FOP, FCS, FIP |
64 |
Указатель инструкций FPU IA-32 |
FDR (AR30) |
FDS, FEA |
48 |
Указатель данных FPU IA-32 |
6.2.5.1. IA-32 стек регистров с плавающей точкой
IA-32 регистры с плавающей точкой определены следующим образом:
Стек числовых регистров IA-32 отображается в FR8-FR15, используя 80-битный IEEE формат с плавающей точкой Intel 8087.
При обращениях набора инструкций IA-32, регистры с плавающей точкой логически отображаются в FR8-FR15, а IA-32 указатель верхушки стека (TOS) содержится в поле FCR.top. FR8 представляет физический регистр после настройки TOS и не обязательно будет вершиной стека логических регистров с плавающей точкой.
При обращениях набора инструкций Itanium, номера регистров с плавающей точкой являются физическими, а не функциями числового указателя TOS, например, обращение к FR8 всегда возвращает значение физического регистра FR8, не зависимо от значения TOS. Программы типа Itanium не могут обязательно полагать, что FR8 содержит IA-32 логический регистр ST(0). Настоятельно рекомендуется, чтобы использовались обычные соглашения о вызовах IA-32, которые передают значения с плавающей точкой через память.
