
- •А) Структура данных fstenv в 16- и 32-разрядном защищенном режиме
- •Примерная схема взаимодействия cpu и npu, при решении на них произвольной смеси команд
- •6.4. Базовые арифметические команды
- •6.5. Команды сравнения
- •6.6. Трансцендентные команды
- •6.7. Команды загрузки констант
- •6.8. Команды управления мсп
6.5. Команды сравнения
Команды сравнения можно разделить на две группы. К первой группе относятся команды, которые по результатам сравнения устанавливают биты С0, С2 и С3 в регистре SW МСП. Результат сравнения интерпретируется в соответствии с табл. 6.
Таблица 6
Флаги сравнения FPU
Сравнение |
С3 |
С2 |
С0 |
Разряды регистра SW |
14 |
10 |
8 |
ST(0) > источника |
0 |
0 |
0 |
ST(0) < источника |
0 |
0 |
1 |
ST(0) = источнику |
1 |
0 |
0 |
Несравнимы |
1 |
1 |
1 |
Чтобы организовать по результатам такого сравнения какой-либо условный переход, программисту приходится предпринимать ряд действий. Программист должен переслать SW в регистр АХ целочисленного процессора (командой FSTSW ax), а затем производить анализ (командой test ax, n) соответствующих бит регистра АХ. Например, это можно сделать так (порядок проверок имеет значение!!):
FSTSW ax
wait
test ax, 400h jnz m1
test ax, 4500h jz m3
test ax, 100h jnz m3
test ax, 4000h jnz m4 |
; переход, если «несравнимы»
; переход, если «больше»
; переход, если «меньше»
; переход, если «равно» |
Команды сравнения, относящиеся ко второй группе, появились, начиная с Pentium II. Они лишены вышеуказанного недостатка, поскольку по результатам сравнения сразу устанавливаются флаги в регистре флагов EF целочисленного процессора в соответствии с табл. 7.
По этим флагам можно сразу выполнять условные переходы. В табл. 8 показана система команд сравнения МСП.
Таблица 7
Флаги после команд FUCOM
Сравнение |
С3 |
С2 |
С0 |
Регистр состояния FP CPU |
ZF |
PF |
CF |
ST(0) > источника |
0 |
0 |
0 |
ST(0) < источника |
0 |
0 |
1 |
ST(0) = источнику |
1 |
0 |
0 |
несравнимы |
1 |
1 |
1 |
Таблица 8
Система команд сравнения МСП
КОМАНДЫ СРАВНЕНИЯ |
|
Команда |
Описание |
FCOM m32fp
FCOM m64fp
FCOM ST(i)
FCOM
FCOMP m32fp
FCOMP m64fp
FCOMP ST(i)
FCOMP
FCOMPP |
Сравнить ST(0) с источником, установить биты С в SW
Сравнить с источником, установит биты С в SW после чего TOP TOP + 1
Сравнить ST(0) и ST(1), установить биты С в SW, после чего пометить ST(0) и ST(1) как EMPTY и TOP TOP + 2 |
Продолжение табл. 8
КОМАНДЫ СРАВНЕНИЯ |
|
Команда |
Описание |
FUCOM ST(i)
FUCOM
FUCOMP ST(i)
FUCOMP
FUCOMPP |
Аналогичны соответствующим командам FCOM, только при несравнимых операндах (например, один и операндов нечисло) не генерируется особый случай недействительной операции. |
FICOM m16int
FICOM m32int
FICOMP m16int
FICOMP m32int
|
Сравнить ST(0) с источником, установит биты С в SW
Сравнить ST(0) c источником, установить биты С в SW, после чего TOP TOP + 1
|
FCOMI ST(0), ST(i)
FCOMIP ST(0),ST(i)
FUCOMI ST(0),ST(i)
FUCOMIP ST(0),ST(i) |
Сравнить и установить флаги zf, pf, cf
Аналогична FCOMI, но не генерируется особый случай недействительной операции.
Аналогична FCOMIP, но не генерируется особый случай недействительной операции. |
FTST |
Сравнивает ST(0) c 0.0 и устанавливает биты С в SW |
FXAM |
«Экзаменует» число в ST(0) и по результатам устанавливает биты С в SW в соответствии с приводимой ниже таблицей. |
В табл. 9 показана установка битов С для команды FXAM.
Таблица 9
Результаты действия команды FXAM
Класс |
С3 |
С2 |
С0 |
неподдерживаемый формат |
0 |
0 |
0 |
нечисло |
0 |
0 |
1 |
нормализованное число |
0 |
1 |
0 |
бесконечность |
0 |
1 |
1 |
нуль |
1 |
0 |
0 |
пустой (EMPTY) |
1 |
0 |
1 |
денормализованное число |
1 |
1 |
0 |