Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
3.4. Математический сопроцессор (FPU x87) 121
Регистры данных r0− r
ПорядокЗнак
r
0
r
1
r
2
r
3
r
4
r
5
r
6
r
7
79 78 64 63 0
7
Мантисса
Слово состояния sw
15 0
Слово тегов
tw
15
Управляющее слово cw
15 0
Указатель на последнюю команду fip
47 0
Указатель на последний операнд fdp
47 0
Код операции fop
90
Рис. 3.8. Регистры FPU
Шестнадцатибитный регистр (слово) теговtw(Tag Word, также используется
сокращение
twr
— Tag Word Register) хранит состояние регистров данных. Каждо-
му регистру r0− r7соответствует два бита слова тегов (рис. 3.9):
а) 00 — в соответствующем регистре корректное ненулевое значение;
б) 01 — в регистре ноль;
в) 10
— в регистре специальное значение: некорректное значение (
nan
или значе­ние, не соответствующее формату вещественного числа с расширенной точно­стью), бесконечность или денормализованное число;
г) 11 — регистр пуст.
0 2 4 6 8 10 12 14
tag(7)
15 14
tag(6)
13 12
tag(5)
11 10
tag(4)
98
tag(3)
76
tag(2)
54
tag(1)
32
tag(0)
10
Рис. 3.9. Слово тегов FPU
Если регистр
riпомечен в слове тегов как пустой, его значение при этом может
быть каким угодно — попытка чтения из него приведёт к ошибке стека.
Флаги математического сопроцессора разбиты на два шестнадцатибитных реги-
стра (рис. 3.10) — управляющие флаги составляют управляющее слово
cw
(Control
122 Глава 3. Архитектура команд семейства x86
Word, также
cwr
), флаги состояния сгруппированы в слово состояния —sw(Status
Word, также swr).
Слово состояния sw
C3
B
14
15
15 12
top
13 11
C2
10
RC
11 10
SF
ES
C0
C1
6
7
8
9
Управляющее слово cw
PC
98
76
PE
5
PM
5
UE
4
UM
4
OE
3
OM
3
ZE
2
ZM
2
DE
1
DM
1
IE
0
IM
0
Рис. 3.10. Слово состояния и управляющее слово FPU
Управляющее слово содержит шесть масок исключений (
IMPM
), поле
управления точностью PC и поле управления округлением RC.
Слово состояния отображает текущее состояние сопроцессора после выполне-
ния последней команды. Младший байт слова состояния включает семь флагов, показывающих корректность операций (
IESF
) и флагES, показывающий, что
сбой не только был, но и привёл к прерыванию. Старший байт включает флаги
C0C3
, хранящие признаки последней операции FPU (в частности, устаревшие команды сравнения чисел помещают в них результат сравнения), а также трёхбит­ный текущий номер вершины стека
top
. Последний битBв настоящее время не
используется.
Таким образом, стек сопроцессора организован с помощью восьми регистров данных ля чение кольцевого буфера следует зическими
r0− r7, соответствующих восьми полей слова тегов
top
слова состояния. Вершина стека
st(1)
получает следующий регистр
st(0)
находится в регистре
r
top+1
r0. На рис. 3.11 показаны соотношения между фи-
riи логическими
st(i)
именами регистров данных сопроцессора при
tag(0)tag(7)
и так далее. За
и по-
r
, обозна-
top
r7по принципу
различных значениях номера вершины стека top.
Положение дна стека определяется словом тегов tw (первый пустой регистр).
После инициализации стек пуст. После завершения вычислений (перед выходом из функции или ассемблерной вставки) его также необходимо оставить пустым. Если функция возвращает вещественное значение через стек сопроцессора, в стеке не должно остаться ничего, кроме возвращаемого значения.
Для вычислений хотя бы один операнд должен быть загружен в стек сопроцес­сора.
Два 48-битных регистра указателей (на последнюю команду — FPU Instruction Pointer, операнд Data (Operand) Pointer,
fip
, в некоторых источниках также
fdp
, также
ipr[52
] и последний загруженный
dpr
), а также десятибитный регистр
3.4. Математический сопроцессор (FPU x87) 123
r
st(0)
0
r
st(1)
1
r
st(2)
2
r
st(3)
3
r
st(4)
4
r
st(5)
5
r
st(6)
6
r
st(7)
7
top =0
r
st(1)
0
r
st(2)
1
r
st(3)
2
r
st(4)
3
r
st(5)
4
r
st(6)
5
r
st(7)
6
r
st(0)
7
top =7
r
st(5)
0
r
st(6)
1
r
st(7)
2
r
st(0)
3
r
st(1)
4
r
st(2)
5
r
st(3)
6
r
st(4)
7
top =3
r
st(6)
0
r
st(7)
1
r
st(0)
2
r
st(1)
3
r
st(2)
4
r
st(3)
5
r
st(4)
6
r
st(5)
7
top =2
а) б) в) г)
Рис. 3.11. Стек FPU
кода операции последней неуправляющей команды (FPU Opcode Register, используются в обработке исключений для определения места сбоя.
3.4.2. Исключения FPU
— Не боись! На всякую инструкцию есть своя обструкция! Стихи. Сам придумал!
А. В. Жвалевский, И. Е. Мытько.
Порри Гаттер и Каменный Философ
fop
)
Во время работы сопроцессора возможны ситуации, когда по какой-то причине невозможно корректно выполнить требуемые вычисления. Подобные ситуации называются исключительными ситуациями, или просто исключениями FPU.
Рассмотрим исключения FPU подробнее. Любое из них приводит к общему исключению недействительной операции (#I).
— недействительная операция (Invalid operation). Может быть стековой
#I ошибкой #IS или недопустимой арифметической операцией #IA.
Стековая ошибка
#IS
— стековая ошибка (Stack Fault) — попытка записи в полностью заполнен-
ный стек или чтения из пустой ячейки стека FPU.
124 Глава 3. Архитектура команд семейства x86
Недопустимые арифметические операции
Недействительной арифметической операцией
(#IA)
считается операция, про­водимая над некорректными аргументами. В этом случае может также возникнуть одна из следующих пяти ситуаций.
#D
денормализованный операнд (Denormalized operand) — выполнение арифметической операции над денормализованным числом или загрузка тако­го числа в стек FPU.
#Z — деление на ноль (Zero Divide) — деление на ноль.
переполнение порядка (Overflow) — порядок результата выходит за максимально допустимое значение.
Для команд выгрузки из стека
f*st
переполнение возможно в том случае, если
размер порядка приёмника недостаточен.
антипереполнение, или исчезновение порядка (Underflow) — порядок
#U
результата выходит за минимально допустимое значение (денормализованный результат).
Для команд выгрузки из стека
f*st
антипереполнение возможно в том случае, если выгружаемое значение слишком близко к нулю и не может быть корректно представлено в формате приёмника.
неточный результат (Precision) — результат невозможно точно предста-
вить в формате назначения (например,
Команды вычисления трансцендентных функций (
1
,√2).
3
fsin,fcos,fsincos,fptan
fpatan, f2xm1, fyl2x, fyl2xp1) всегда приводят к неточному результату.
Маски исключений
Если в языках высокого уровня термин «исключение» подразумевает прерыва­ние нормального хода программы и переход к обработчику, то FPU на некоторые (арифметические) исключения может реагировать двояко: помещать на место результата специальное значение (вещественную неопределённость) или иницииро­вать прерывание вычислений.
Поведением FPU управляют шесть масок исключений (
IMPM
), располо-
женных в первых шести битах управляющего словаcw. На тех же местах в слове состояния sw располагаются соответствующие флаги IEPE.
Если бит маски установлен в единицу, то соответствующее исключительная ситуация не вызывает прерывания выполнения программы (то есть того, что обычно и называется в языке высокого уровня исключением). Такое исключение называется замаскированным.
Стековую ошибку замаскировать невозможно.
,
3.4. Математический сопроцессор (FPU x87) 125
Флаги FPU
Математический сопроцессор имеет собственный регистр флагов — слово со­стоянияsw. Аналогично
flags
, биты слова состояния сопроцессора представляют
те или иные характеристики последней операции сопроцессора [16, 78].
На рис. 3.10 показано расположение семи флагов ошибок разных видов, флага суммарной ошибки и флагов
C0C3
, куда, в частности, помещают результат уста­ревшие команды сравнения. Команды вещественной арифметики не выставляют флаги
C0C3
аналогично командам сравнения, но могут использовать эти биты
иначе.
Первые семь битов слова состояния соответствуют исключениям FPU. Каждой исключительной ситуации соответствует свой флаг ошибки, который устанавлива­ется в единицу при возникновении этой исключительной ситуации.
IE (бит 0) — флаг недействительной операции.
Устанавливается в единицу при выполнении недопустимой стековой (в этом случае устанавливается также флагSF) или арифметической операции. В послед­нем случае могут быть установлены также флаги DE, ZE, OE, UE или PE.
DE (бит 1) — флаг денормализованного операнда.
ZE (бит 2) — флаг деления на ноль.
ОE (бит 3) — флаг переполнения порядка.
UE (бит 4) — флаг антипереполнения, или исчезновения порядка.
РE (бит 5) — флаг неточного результата.
SF (бит 6) — флаг стековой ошибки.
Также по результатам операции выставляется флаг суммарной ошибки, кото­рому не соответствует ни одно из исключений.
ES (бит 7)
— флаг суммарной ошибки (Error Summary Status). Он равен еди-
нице, если возникает хотя бы одно незамаскированное исключение.
В некоторых источниках говорится, чтоESравен единице в том случае, когда
27
в разрядах 0...6 есть хотя бы одна единица [ какое-то исключение замаскировано,
ES
]. Это в общем случае неверно. Если
не дублирует состояние соответствую-
щего флага.
В частности, в C++ деление на ноль не должно приводить к прерыванию работы программы, поэтому соответствующее исключение при настройке сопроцессора стартовым кодом маскируется.
Соответственно, при попытке деления единицы на ноль, как можно убедиться при помощи отладчика, результат принимает специальное значение (
+
, если делителем был+0, или
inf = −∞
, если единица делилась на−0),
inf
, то есть
устанавливается флаг ZE, но флаг ES не устанавливается.
126 Глава 3. Архитектура команд семейства x86
3.5. Флаги
Мечтой увенчанный язык Плохой товарищ, где нет чисел, К числа жезлу наш ум привык.
В. Хлебников. Двух юных слышу разговор...
Во время выполнения многих команд формируется не только результат в виде числа, но и те или иные признаки результата (в частности, корректен ли он) — флаги состояния. Флаг занимает один бит и считается установленным, когда он равен 1, и сброшенным, когда равен 0.
В частности, как было сказано в разделе 2.5, при сложении и вычитании целых беззнаковых чисел ограниченной разрядности может образоваться бит переноса/за­ёма из старшего разряда, который сохраняется процессором в особой ячейке —
CF
флаге переноса флаг переполнения OF . Как CF, так и OF являются флагами состояния.
Аналогично флагам состояния, однобитовые переменные, не отражающие при­знаков результата последней операции, но влияющие на выполнение некоторых команд, называются управляющими флагами. Некоторые флаги состояния или управляющие флаги доступны только операционной системе и, соответственно, называются системными.
Флаги и некоторые системные переменные часто объединяются в специаль­ный регистр — регистр флагов. Процессоры семейства x86 исторически имеют два регистра флагов — собственно регистр флагов основного набора и слово состояния FPUsw, связанное с командами математиче­ского сопроцессора FPU.
. При сложении и вычитании знаковых чисел формируется
flags
, связанный с командами
3.5.1. Флаги основного процессора
Я посвящён. Я принял взгляд извне. Так зеркало, уснувшее на дне, В себя приемлет отблеск ледяной...
С. А. Калугин. Rosarium. Венок сонетов. Сонет 9
Процессоры семейства x86 объединяют ячейку
CF
и подобные ей биты, пока-
зывающие те или иные свойства последней целочисленной арифметической опера­ции — флаги состояния — в специальный регистр флагов flags(таблица 3.1).
Кроме флагов состояния, регистр флагов включает один бит, не отражающий выполнение последней операции, но влияющий на выполнение некоторых команд (управляющий флаг направления
DF
), а также несколько битов, недоступных
прикладным программам (системные флаги) [18,78,85]. Часть битов зарезервиро-
3.5. Флаги 127
вана и не используется сейчас как флаги (зарезервированный бит может иметь как произвольное, так и фиксированное значение).
Доступные прикладным программам флаги состояния в основном сосредоточе­ны в младших восьми разрядах
flags
, поэтому многие команды сохранения/восста­новления регистра флагов оперируют только с младшим байтом. Старшие восемь бит содержат один флаг состоянияOF, управляющий флаг стемных. В тридцатидвухбитном регистре
eflags
в старших шестнадцати битах
DF
и несколько си-
добавлено ещё шесть системных флагов; старшие тридцать два бита шестидесяти­четырёхбитного rflags не используются.
Регистр флагов flags
Таблица 3.1
flags
0 CF Carry Flag
1 1 Зарезервирован
2 PF Parity Flag Флаг чётности Состояние
3 0 Зарезервирован
4 AF Auxiliary Carry Flag Флаг вспомогательного переноса Состояние
5 0 Зарезервирован
6 ZF Zero Flag Флаг нуля Состояние
7 SF Sign Flag Флаг знака Состояние
8 TF Trap Flag Флаг трассировки Системный
9 IF Interrupt Enable Flag Флаг разрешения прерываний Системный
10 DF Direction Flag Флаг направления Управляющий
11 OF Overflow Flag Флаг знакового переполнения Состояние
12–13 IOPL I/O Privilege Level Уровень приоритета ввода-вывода Системный
14 NT Nested Task Флаг вложенности задач Системный
15 0 Зарезервирован
16 RF Resume Flag Флаг возобновления Системный
17 VM Virtual-8086 Mode Режим виртуального процессора 8086 Системный
18 AC Alignment Check Проверка выравнивания Системный
19 VIF Virtual Interrupt Flag Виртуальный флаг разрешения прерывания Системный
20 VIP Virtual Interrupt Pending Ожидающее виртуальное прерывание Системный
21 ID ID Flag Проверка на доступность инструкции
22–31 Зарезервированы
Флаг переноса (беззнакового переполнения)
eflags
CPUID
Состояние
Системный
Регистр
flags
не может быть явно указан как операнд команды, но является неявным результатом большинства арифметических команд и неявным операндом условных команд.
128 Глава 3. Архитектура команд семейства x86
Флаги состояния
Флаги состояния отображают результаты целочисленных арифметических опе-
раций (сложения и вычитания; ограниченно умножения и поразрядных логических операций и пр.); этими флагами являются биты 0, 2, 4, 6,7и11регистра flags.
CF (бит 0)
Флаг переноса (Carry Flag = CF), также флаг беззнакового переполне­ния. Устанавливается, если происходит перенос из старшего разряда результата за пределы разрядной сетки при сложении или заём в старший разряд из несуществу­ющего (выходящего за пределы операнда, воображаемого) разряда при вычитании, таким образом, этот флаг показывает переполнение при выполнении беззнаковых арифметических операций.
ФлагCFчасто используется и для других целей, тогда его значение не связано с беззнаковым переполнением. Так, этот бит используется командами сдвига — именно в него выдвигается «лишний» бит, командами извлечения бита — для хранения извлечённого значения и многими другими.
PF (бит 2)
Флаг чётности (Parity Flag = PF). Устанавливается, если младший
байт результата команды содержит чётное число единиц, иначе — сбрасывается.
Флаг чётности использовался для подсчёта контрольных сумм.
AF (бит 4)
Флаг вспомогательного переноса (Auxiliary Carry Flag = AF), также используется название «флаг коррекции» (Adjust Flag = AF). Устанавливается, если арифметическая операция производит перенос (заём) из младшей тетрады младшего байта, т. е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной (BCD — Binary-Coded Decimal) арифметики, которая оперирует исключительно младшими байтами.
ZF (бит 6)
Флаг нуля (Zero Flag = ZF). Устанавливается, если результат опера­ции — нуль, иначе — сбрасывается.
SF (бит 7)
Флаг знака (Sign Flag = SF). Всегда равен значению старшего бита результата. Этот бит интерпретируется как знаковый в некоторых арифметических операциях (0/1 — число положительное/отрицательное).
OF (бит 11)
Флаг знакового переполнения (Overflow Flag = OF). Устанавливает­ся, если при знаковой интерпретации результат операции не помещается в операнд (слишком большое положительное или слишком маленькое для отрицательных знаковых чисел); иначе — сбрасывается. При сложении этот флаг устанавливается в 1, если происходит перенос в старший бит и нет переноса из старшего бита (то
3.5. Флаги 129
есть сумма положительных чисел даёт результат, интерпретируемый как отрица­тельный), или имеется перенос из старшего бита, но отсутствует перенос в него (сумма отрицательных чисел положительна); в противном случае, флаг
OF
уста­навливается в 0. При вычитании он устанавливается в 1, когда возникает заём из старшего бита, но заём в старший бит отсутствует, либо имеется заём в старший бит, но отсутствует заём из него.
Флаг переполнения сигнализирует о потере старшего бита результата в связи с переполнением разрядной сетки при работе со знаковыми числами. Таким обра­зом, если при вычитании
OF =1
, то старший (знаковый) бит результата, а также
флаг SF, равен не истинному знаку результата, а его инверсии.
Знаковые и беззнаковые команды
Флаги состояния используются командами целочисленной арифметики, использующимися для вычислений трёх типов — зна­ковых, беззнаковых и (в тридцатидвухбитном режиме) двоично-десятичных BCD, командами битовых сдвигов а также командами условного перехода (ветвления) и условного присваивания.
Устанавливаются флаги состояния по результатам выполнения последней команды. Влияние различных команд на флаги различается, и этот момент жела­тельно уточнять в документации.
В частности, при выполнении операций сложения или вычитания все флаги состояния получают определённые значения. Индикатором переполнения в этом случае является:
– для знаковой арифметики — флаг OF , – для беззнаковой арифметики — флаг CF. – для BCD-арифметики — флаг AF .
Так как беззнаковые и представленные в дополнительном коде знаковые числа складываются с помощью одного и того же сумматора и одной командой, этот сумматор на всякий случай формирует при сложении и вычитании и
OF,иCF
и остальные флаги состояния. Выбор для анализа того флага, который соответ­ствует реальному типу операндов — ответственность программиста.
3.5.2. Флаги FPU
Я повторяю, говорят иное, Я странствую, как остаюсь в покое, Забыта цель и потому права.
С. А. Калугин. Rosarium. Венок сонетов. Сонет 14
,
Математический сопроцессор FPU включает собственный регистр флагов — слово состоянияsw(раздел 3.4.2). Старший байтswможет быть загружен в млад­ший байт флагов основного процессора. Чаще всего для этого используются коман-
130 Глава 3. Архитектура команд семейства x86
ды
fnstsw %ax
(выгрузкаswвax)и
sahf
(загрузкаah— старшего байтаax—
в flags).
В таблице 3.2 представлено краткое описание структуры слова состояния FPU
sw
(слева), а также соответствие старшего байтаswи младшего байта регистра
флагов основного процессора flags (справа).
Загрузка состояния FPU в регистр флагов
Таблица 3.2
sw
0 IE Недействительная операция
1 DE Денормализованный операнд
2 ZE Деление на ноль
3 ОЕ Переполнение
4 UE Антипереполнение
5 РЕ Неточный результат
6 SF Стековая ошибка 7 ES Бит суммарной ошибки flags, fnstsw + sahf
8 C0 0 CF Carry Flag
9 C1 игнорируется
10 C2 2 PF Parity Flag
11 игнорируется
TOP Указатель вершины стека сопроцессора
12 4 AF Auxiliary Carry Flag
13
14 C3 6 ZF Zero Flag
15 В Дублирует ES 7 SF Sign Flag
игнорируется
Некоторые устаревшие команды сравнения вещественных чисел помещают признак отрицательности в битC0слова состоянияsw, признак несравнимости — вC2, признак нуля — вC3(более современные команды сравнения помещают результаты напрямую в биты го байтаswво
flags C0
CF,PF,ZF
регистра
flags
). При загрузке старше-
помещается во флаг беззнакового переполнения
CF
признак нуляC3— в аналогичный ему по смыслуZF,аC2— во флаг чётности
PF
. Другие флаги младшего байта
flags
получают фактически неопределённое
значение.
Не имеющие аналогов среди флагов CPU признаки исключительных ситуаций FPU (младший байт sw) не загружаются в регистр flags.
Биты
C0,C1,C2,C3
слова состоянияswиспользуются не только командами сравнения, но и арифметическими командами. В отличие от команд основного набора, арифметические команды FPU помещают в эти биты не сведения об отри­цательном или нулевом результате, а другие признаки.
,
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]