FIST ¦ ¦ ¦ ¦ ¦ ¦
адресат ¦ Да ¦ Да ¦ Да ¦ ¦ ¦ Нет
FBLD ¦ ¦ ¦ ¦ ¦ ¦
источник ¦ ¦ ¦ ¦ Да ¦ ¦ Нет
FBSTP ¦ ¦ ¦ ¦ ¦ ¦
адресат ¦ ¦ ¦ ¦ Да ¦ ¦ Нет
ДДДДДДДДДБДДДДДДБДДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДДДДДДДДД
Некоторые сомнения возникают по поводу того, как NPX обраща-
ется к своим операндам. Небольшой пример поможет развеять туман,
поэтому давайте посмотрим на работу трех кодов операций NPX.
FLD ; Загрузить 1-ый аргумент из памяти
FLD ; Загрузить 2-ой аргумент из памяти
FADD ; кодируется как FADD ST(1),ST
FSTP ; сохранить результат в памяти
- 10-13 -
Эта операция использует FLD для считывания двух операндов па-
мяти в стек регистра NPX, складывает их, применяя "классическую"
форму FADD, и затем сохраняет результат с помощью FSTP. Помните,
что в то время как основные арифметические команды (FADD, FSUB,
FMUL и FDIV) кодируются сами по себе, MASM генерирует классичес-
кую операцию снятия со стека, используя вершину стека ST, в ка-
честве источника и следующий элемент стека ST(1) в качестве адре-
сата.
Работа четырех предыдущих команд представлена графически на
рисунке 10-7. Мы разделили две части команды FADD таким образом,
чтобы Вы могли лучше видеть эффекты снятия со стека. Гладя на
операцию, Вы можете увидеть, что NPX концептуально завершает
арифметическую ее часть - сохраняя результата в ST(1) - затем
снимает со стека, перенося результат в вершину стека, ST или
ST(0).
Одна и та же команда
ЪДДДДДДДДДДДДДДДДДДДДДДД¬
FADDP FADDP FSTP сохра-
FLD помещает в стек: (ST(1)= выталкивает няет и вы-
Mem-1 Mem-21 Mem-1 + Mem-2 Mem-2 талкивает SUM
ЪДДДДДДДДДД¬ЪДДДДДДДДДД¬ЪДДДДДДДДДД¬ЪДДДДДДДДДД¬ЪДДДДДДДДДД¬
ST(0)¦ Mem-1 ¦¦ Mem-2 ¦¦ Mem-2 ¦¦ SUM ¦¦Предыдущее¦
ГДДДДДДДДДДґГДДДДДДДДДДґГДДДДДДДДДДґГДДДДДДДДДДґГДДДДДДДДДДґ
ST(1)¦Предыдуще妦 Mem-1 ¦¦ SUM ¦¦Предыдуще妦 ¦
ГДДДДДДДДДДґГДДДДДДДДДДґГДДДДДДДДДДґГДДДДДДДДДДґГДДДДДДДДДДґ
ST(2)¦ ¦¦Предыдуще妦Предыдуще妦 ¦¦ ¦
АДДДДДДДДДДЩАДДДДДДДДДДЩАДДДДДДДДДДЩАДДДДДДДДДДЩАДДДДДДДДДДЩ
Рис.10-7. Пример работы со стеком NPX
В конце нашего примера стек принимает свой первоначальный
вид. Так ли это? Да, это так, если в стеке было место для допол-
нительных аргументов. Однако, если в нем не было достаточно места
для размещения новых данных, NPX объявляет о недопустимой ситуа-
ции в работе ввиду переполнения стека. (Мы рассмотрим чрезвычай-
ные ситуации в дальнейшем.) Следовательно, до того, как мы сможем
выполнить даже нашу очень простую задачу, необходимо убедиться в
том, что NPX может принимать данные. Для достижения этого сущест-
вует два способа.
Команды FINIT и FFREE
Простейшим способом подготовки NPX к работе является исполь-
зование команды FINIT. Это первая команда, которую нужно напра-
вить NPX всякий раз как только начинает выполняться новая прог-
рамма. FINIT инициализирует NPX таким образом, как если бы
произошел сброс всей системы, что означает очистку всех регистров
и ситуаций, а также обеспечивает свободное место для работы прог-
раммиста.
Другую возможность убедиться в том, что NPX освободил регист-
ры, предоставляет команда FFREE. Она отмечает необходимый регистр
как пустой и позволяет программисту использовать его для последу-
ющих вычислений. Обратите внимание, что нет необходимости очищать
регистры на вершине стека. Если нижняя часть стека, ST(7), имеет
достаточно свободного места, верхние регистры при добавлении но-
вого значения опустятся вниз.
- 10-14 -
Управление NPX
Помимо восьми регистров данных NPX имеет четыре других ре-
гистра, доступных программисту. Из рисунка 10-1 видно, что это
слово состояния, слово управления, а также указатели операндов и
команд. NPX также имеет регистр, называемый словом признака, но
он используется только внутри NPX. (Слово признака отмечает ре-
гистры как пустые, нулевые и не-число.) Два указателя, операнда и
команды полезны только в процессе внешней обработки особой ситу-
ации, которую мы рассмотрим далее. Остались слова управления и
состояния. Для эффективного использования NPX нам необходимо по-
нять работу этих регистров.
Слово управления NPX
Сначала мы рассмотрим регистр слова управления. Это 16-бито-
вое слово определяет то, как NPX трактует различные ситуационные
ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
¦ 15¦ 14¦ 13¦ 12¦ 11¦ 10¦ 9¦ 8¦ 7¦ 6¦ 5¦ 4¦ 3¦ 2¦ 1¦ 0¦
ГДДДБДДДБДДД†ДДД†ДДДБДДД†ДДДБДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДДґ
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ IC¦ RC ¦ PC ¦IEM¦ ¦ PM¦ UM¦ OM¦ ZM¦ DM¦ IM¦
АДДДБДДДБДДДБДДДБДДДДДДДБДДДДДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
АДДДДДДДДДДДЩ ¦ АДДДДДДДБДДДДДДДЩ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
зарезервировано ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦Неверная
УправлениеЪДДДДДЩ АДДД¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ операция
бесконечностью ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦Ненормализо-
ЪДДДДДДДДДДДДДДДДДДДДД¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ванный опе-
¦0 = Сходящаяся ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ранд
¦ Ъ бесконеч.¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ Деление на ноль
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ Переполнение
¦- ¦ ¦ + ¦ ¦ ¦ ¦ ¦ Потеря значимости
¦ АДДД 0 ДДДДЩ ¦ ¦ ¦ ¦ Точность Маска
¦1 = Расходящаяся ¦ ¦ ¦ ¦Зарезервирован разрешения
¦ ¦ ¦ ¦ ¦ прерывания
¦-беск.<-- 0 -->+беск.¦ ¦ ¦ ¦ ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
АДДДДДДДДДДДДДДДДДДДДДЩ ¦ ¦ АДД¦0= Разрешить ¦
¦ ¦ ¦1= Запретить (замаскировано)¦
¦ ¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Управление ЪДДДДДДДДДДДДЩ АДДДДДДДДДДДД¬ Управление
округлением точностью
ЪДДДДДДДДДДДДДДДДДДДДД¬ ЪДДДДДДДДДДДДДДДДДДДДДДДД¬
¦00=(x+1)<---0.5--->x ¦ ¦ ЪДДДДДДДДДД¬¦
¦01= ---> 0 ---> ¦ ¦00= ¦ 24 бита ¦¦
¦10= <--- 0 <--- ¦ ¦ АДДДДДДДДДДЩ¦
¦11= ---> 0 <--- ¦ ¦ ЪДДДДДДДДДДДДДДД¬¦
АДДДДДДДДДДДДДДДДДДДДДЩ ¦10= ¦ 53 бита ¦¦
¦ АДДДДДДДДДДДДДДДЩ¦
¦ ЪДДДДДДДДДДДДДДДДДД¬¦
¦11= ¦ 64 бита ¦¦
¦ АДДДДДДДДДДДДДДДДДДЩ¦
АДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис.10-8. Слово управления и его влияние на операции NPX
- 10-15 -
условия и то, как он видит используемую систему счисления. На ри-
сунке 10-8 продемонстрирована работа слова управления, а также
различные поля и их воздействия. В основном, слово управления со-
держит три поля управления и семь флагов для использования с осо-
быми ситуациями.
На данном этапе мы хотим использовать как можно больше встро-
енных средств NPX. Часть этого означает то, что мы хотим восполь-
зоваться встроенными возможностями обработки особых ситуаций NPX.
Вы видите, что NPX само по себе может следить за большинством
возникающих ошибок, исправлять число или возвращать специальное
значение, называемое не-число. Так как обрабатывать эти прерыва-
ния вручную сложно, мы предоставим NPX делать это за нас. Мы про-
делаем это посредством маскировки особой ситуации, что выполняет-
ся установкой масок ситуаций в слове управления. Все маски особых
ситуаций вместе с главной маской разрешения прерываний содержатся
в младшем байте слова управления.
Установка NPX в режим использования своих внутренних обработ-
чиков ошибок выполняется установкой младшего байта в BF (шестнад-
цатиричное) с применением команды загрузки слова управления
FLDCW. Мы просто определяем слово в памяти главного центрального
процессора с помощью младшего байта, имеющего значение BF (шест-
надцатиричное). Затем мы загружаем его следующим образом:
.
.
.
cw87 dw 03BFh ; значение слова управления NPX
.
.
.
FLDCW cw87 ; загрузить слово управления NPX
.
.
.
Зачем мы применили значение 3 для старшего байта слова управ-
ления? Старший байт содержит три поля для определения используе-
мой NPX модели числа. Эти три поля также показаны на рисунке
10-8. Сравнив диаграмму с нашим значением 3, Вы увидите, что мы
выбрали 64-битовую точность, округление до ближайшего целого и
сходящуюся бесконечность. Эти значения единственные, рекомендуе-
мые фирмой Intel, а также единственные, которые NPX использует по
умолчанию. Если Вы хотите изменить эти установки, рисунок 10-8
подскажет, какие значения можно применять.
Слово состояния NPX
Слово состояния NPX содержит четыре типа информации: (1) ин-
дикатор занятости; (2) указатель вершины стека; (3) коды условий,
отражающие результаты выполнения команд FCOM, FTST и FXAM; и (4)
индикаторы особых ситуаций, сигнализирующие о возможности появле-
ния ошибки. Рисунок 10-9 демонстрирует положения различных инди-
каторов внутри слова состояния.
- 10-16 -
ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
¦ 15¦ 14¦ 13¦ 12¦ 11¦ 10¦ 9¦ 8¦ 7¦ 6¦ 5¦ 4¦ 3¦ 2¦ 1¦ 0¦
ГДДД†ДДД†ДДДБДДДБДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДД†ДДДґ
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ B ¦ C3¦ ST ¦ C2¦ C1¦ C0¦ IR¦ ¦ PE¦ UE¦ OE¦ ZE¦ DE¦ IE¦
АДДДБДДДБДДДДДДДДДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
¦ ¦ АДДДДДДДДДДДБДДДДДДДДДДДЩ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ АДДДДДДДДДДДДДДДДДДД¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦