¦ 2¦ ¦ ST(2) ¦ ¦Cлово управления ¦
ГДДґ ГДДДДДДДДДДґ АДДДДДДДДДДДДДДДДДДЩ
¦ 3¦ ¦ ST(3) ¦
ГДДґ ГДДДДДДДДДДґ
¦ 4¦ ¦ ST(4) ¦ Доступно только
ГДДґ ГДДДДДДДДДДґ ЪДДДДДДДДДДДДДДДДДД¬посредством FSAVE
¦ 5¦ ¦ ST(5) ¦ ¦Указатель команды ¦Д¬ и FSTENV
ГДДґ ГДДДДДДДДДДґ АДДДДДДДДДДДДДДДДДДЩ ¦
¦ 6¦ ¦ ST(6) ¦ ¦Указатели главной
ГДДґ ГДДДДДДДДДДґ ЪДДДДДДДДДДДДДДДДДД¬ ¦общей памяти CPU
¦ 7¦ ¦ ST(7) ¦ ¦Указатель операнда¦ДЩ
АДДЩ АДДДДДДДДДДЩ АДДДДДДДДДДДДДДДДДДЩ
Рис.10-1. Размещение регистров в NPX
Вы должны помнить, что в отличие от центрального процессора,
регистры данных NPX не имеют уникальных имен, но они являются ин-
дексированными элементами стека (например, ST(1)). Значения за-
гружаются в NPX посредством помещения их в стек, а некоторые зна-
чения (но не все) восстанавливаются путем выталкивания их из
стека. Многие команды NPX работают только на вершине стека, а
большинство других команд установлены по умолчанию для работы на
вершине стека.
То, что NPX обращается к своим регистрам как к стеку, очень
важно, ввиду того, что все адреса регистров относительны к верши-
не стека! Например, значение, содержащееся в регистре i хранится
в регистре i-1, если стек вытолкнут, и в регистре i+1, если в
стек помещается новое значение.
- 10-3 -
При написании программ для NPX, уделяйте особое внимание по-
ведению стека. Вы не можете вставить значение в регистр и предпо-
ложить, что позже это значение будет находиться в том же самом
месте.
Представление в NPX вещественных чисел с плавающей точкой
Эти регистры также отличаются от регистров центрального про-
цессора тем, что они могут содержать только один тип числа, ве-
щественное число с плавающей точкой (называемое на языке Intel
временным вещественным). Самый верхний формат на рисунке 10-2 по-
казывает, как в регистре NPX выглядит вещественное число с плава-
ющей точкой. Из рисунка видно, что регистр разделен на три поля:
бит знака, смещенный порядок (15 бит) и значащая часть числа (64
бита). Каждое из этих чисел, взятое отдельно, представляет собой
двоичное целое без знака, но соединенные вместе, они выражают
очень большое число!
Давайте посмотрим внимательнее на отдельные части веществен-
ного числа с плавающей точкой. Самая левая часть (бит 79) являет-
ся битом знака. Когда он имеет значение 1, то число отрицатель-
ное. Когда он имеет значение 0, то число положительное. Просто,
но надо отметить два момента. Во-первых, в отличие от двоичного
дополнения целых чисел (используемых в главном центральном про-
цессоре), это вещественное число с плавающей запятой имеет столь-
ко положительных чисел, сколько и отрицательных. (Вы увидите это
позже). Во-вторых, более важно то, что данная система счисления
имеет два типа нуля! Это означает, что 0 может быть положительным
или отрицательным числом, и что 0 не обязательно равен 0. NPX
следит за этим эффектом, но об этом надо помнить, если Вы пытае-
тесь сравнить вещественные числа с помощью центрального процессо-
ра.(Вам это может никогда не понадобиться, так как NPX сравнивает
числа очень хорошо).
Перейдя к правой стороне числа, мы увидим мантиссу (биты с 0
по 63). Здесь представлены значащие цифры числа. Так как каждый
элемент может быть либо положительным, либо отрицательным, диапа-
зон для каждого один и тот же. Обратите внимание, что бит 63 (са-
мый значимый бит мантиссы) показан как 1. Это происходит из-за
того, что NPX обычно хранит числа в нормализованном формате, ко-
торый означает, что NPX находит самую левую 1 в двоичном числе и
сдвигает вверх или вниз до тех пор, пока 1 не окажется в бите 63.
(Число без 1 означает 0, и его представлением являются все нули.)
Приведем небольшой пример с числом 10:
Десятичное: 10
Шестнадцатиричное: A
Двоичное 64-битовое целое: 000000000000000...000000000001010
64-битовое вещественное NPX: 101000000000000...000000000000000
Видите, как скользит влево число в NPX? Это дает больше места
для других представляемых чисел, таких как 10.1, 10.12 и так да-
лее. Единственной проблемой является то, что число в NPX больше
не 10. Оно выглядит теперь как 10 х 2 . Как NPX узнает, что это
число действительно 10? Оно использует то, что называется полем
экспоненты (биты с 64 по 78).
NPX всегда предполагает, что число в мантиссе располагается
между 1 и 2. Само по себе число, показанное выше, будет двоичным
- 10-4 -
1.01 или десятичным 1.25. (Каждая двоичная цифра в дробной части
представляет собой 1/2 предыдущей двоичной цифры, поэтому, пози-
циями вправо десятичной точки в двоичном исчислении являются 1/2,
1/4, 1/8, 1/16, и т.д.) NPX запоминает в поле экспоненты на
сколько позиций сдвинуто первоначальное число. В случае числа 10,
NPX сдвигает десятичную точку на три позиции от 1010.0 (двоичное)
к 1.0100 (двоичное). Значение 3 хранится в поле экспоненты. Есть
еще одна хитрость в хранении данных NPX. Так как экспонента хра-
нится как целое без знака, и если NPX помещает точную экспоненту
в поле, то невозможно будет сохранить числа, меньше 1 (отсутствие
отрицательной экспоненты означает невозможность чисел меньше, чем
2 или единица). Таким образом, NPX смещает (добавляет смещение)
экспоненту. В NPX используется смещение 3FFFh, или 16,383 (деся-
тичное). В примере сохранения числа 10, смещение экспоненты опре-
деляется как 3 плюс 3FFFh, или 4002h.
ЪДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
Вещественное с ¦ ¦Смещенный по-¦ Мантисса ¦
плавающей запятой ¦Зн¦рядок 3FFFh ¦1 ¦
АДДБДДДДДДДДДДДДДБДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
79 64 63 0
АДДД1.0 задана явно
ЪДДВДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
Упакованное ¦ ¦Не использу-¦ Упакованные десятичные ¦
десятичное ¦Зн¦ ется ¦17 16 15 цифры 3 2 1 0¦
АДДБДДДДДДДДДДДДБДДБДДБДДБДДБДДБДДБДДБДДБДДБДДЩ
79 72 71 0
ЪДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДД¬
Длинное ¦ ¦Смещенный по-¦ Мантисса ¦
вещественное ¦Зн¦рядок 3FFFh ¦ ¦
АДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДЩ
63 52АД1.0
подразумевается
ЪДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
Длинное ¦ ¦Представление целого в допол-¦
целое ¦Зн¦ нительном коде ¦
АДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
63 0
ЪДДВДДДДДДДВДДДДДДДДДДДД¬
Короткое ¦ ¦Порядок¦ Мантисса ¦
вещественное ¦Зн¦ 7Fh ¦ ¦
АДДБДДДДДДДБДДДДДДДДДДДДЩ
31 23АД1.0 0
подразумевается
ЪДДВДДДДДДДДДДДДДДДДДДДД¬
Короткое ¦ ¦ Дополнительный ¦
целое ¦Зн¦ код ¦
АДДБДДДДДДДДДДДДДДДДДДДДЩ
31 0
ЪДДВДДДДДДДДДД¬
Целое- ¦ ¦Дополните-¦
-слово ¦Зн¦льный код ¦
АДДБДДДДДДДДДДЩ
15 0
Рис.10-2. Представление чисел в NPX
- 10-5 -
Мы все сделали, теперь посмотрим на рисунок 10-3, чтобы уви-
деть, как число 10 выглядит внутри NPX. Почему Вы должны понять,
как NPX хранит числа? Потому что иногда в процессе отладки Вам
требуется проверить содержимое регистров NPX и, в целях понимания
использования и ограничений некоторых более продвинутых команд
NPX, необходимо знать типы данных, которыми Вы манипулируете.
79 78 ... 64 63 62 ............ 0
ЪДВДДДДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦0¦ 40 02¦ 1¦ 010 000 000 000 ¦
АДБДДДДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
+ 2(3) x1.010=1010(Binary)=10(Decimal)
Рис.10-3. Представление числа 10 в NPX
Другие форматы данных, используемые в NPX
На рисунке 10-2 кроме 80-битового формата вещественного числа
с плавающей запятой показаны шесть других форматов данных. Для
чего они применяются? Вместе с 80-битовым вещественным NPX может
использовать эти формы для чтения и записи вещественных данных.
Если эти данные представлены в одном из этих форматов, то NPX
поймет их. Другие форматы NPX не воспринимает. Три основных типа
показаны на рисунке 10-2. Эти типы включают в себя вещественное,
целое и упакованное десятичное.
Короткий вещественный и длинный вещественный
форматы данных
Короткий вещественный (32-битовый) и длинный вещественный (64
-битовый) форматы очень похожи на 80-битовый вещественный с пла-
вающей запятой, который мы уже рассмотрели. Эти числа способны
представлять вещественные числа с плавающей запятой, но с меньшим
диапазоном и точностью. Различия показаны в таблице 10-1.
Таблица 10-1
Различия между форматами вещественных данных
ДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДД
Тип данных ¦Мантисса¦ Экспонента¦ Смещение ¦Самая левая
¦ # бит ¦ # бит ¦ экспоненты ¦единица
ДДДДДДДДДДДД†ДДДДДДДД†ДДДДДДДДДДД†ДДДДДДДДДДДДД†ДДДДДДДДДДДДДДД