Микросхема 8087 имеет расширенный набор типов данных,
необходимых для поддержки ее расширенных арифметических
возможностей. В то время как микропроцессор 8088 может
непосредственно работать только с байтами и словами, микросхема
8087 имеет семь типов данных. Шесть из них присущи лишь микросхеме
8087. На Фиг. 7.1 показаны все семь типов данных, с которыми
работает микросхема 8087. Четыре формата представляют целые числа,
а три формата - вещественные, или числа с плавающей точкой. Один
формат представляет упакованные десятичные числа.
Рисунок 7.2 иллюстрирует способы, которыми микросхема хранит
эти числа в памяти. Как и в случае данных микропроцессора 8088,
все данные хранятся с младшей частью операнда, записанной в младших
адресах. Бит знака всегда оказывается в байте по старшему адресу
памяти. Мы будем обсуждать назначение различных полей по мере
того, как будем рассматривать разные типы данных.
Сопроцессор 8087 работает с тремя типами целых чисел: словом,
которое имеет длину 16 бит и идентично слову микропроцессора 8088;
коротким целым числом, имеющим длину 32 бита; длинным целым числом,
64-значением. Все эти числа являются числами, представленными в
двоичном дополнительном коде.
В программе целое слово определяется с помощью оператора DW.
Такое целое слово может иметь значение в диапазоне от - 32768 до
32767. Этот целый формат уже использовался в наборе команд
микропроцессора 8088. Это - единственный формат данных, общий для
микропроцессора 8088 и арифметического сопроцессора 8087. Короткий
целый формат требуется в операторе описания данных длиной 32 бита.
Такое описание двойного слова выполняет оператор DD, определяющий
целые числа, лежащие в диапазоне от -232 до 232-1. Напоминаем, что
с помощью оператора DD можно также определить пару
СЕГМЕНТ:СМЕЩЕНИЕ. Ассемблер решает сам, какую именно форму
сгенерировать, основываясь на операнде. Если операнд - адрес,
порождается пара СЕГМЕНТ:СМЕЩЕНИЕ; если же операнд - просто число,
соответственно порождается длинное целое число. Для описания
длинных 64-битовых целых чисел используется оператор определения
счетверенного слова DQ. Эта директива вынуждает ассемблер
сформировать поле данных, состоящее их четырех слов (восьми байт).
Такой тип целого может иметь значения в диапазоне от -264 до 264-1.
Этот оператор ассемблера, так же как и операторы DB, DW и DD, может
определить константу, неопределенное поле (если задан операнд "?"),
<ДДДД ВОЗРАСТАНИЕ ЗНАЧЕНИЯ
ЪДВДДДДДДДДДДДДДДДї
СЛОВА ЦЕЛЫЕ іSі ВЕЛИЧИНА і(ДВОИЧНОЕ
АДБДДДДДДДДДДДДДДДЩ ДОПОЛНЕНИЕ)
15 0
ЪДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
КОРОТКОЕ ЦЕЛОЕ іSі ВЕЛИЧИНА і(ДВОИЧНОЕ
АДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ ДОПОЛНЕНИЕ)
31 0
ЪДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
ДЛИННОЕ ЦЕЛОЕ іSі ВЕЛИЧИНА і
АДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
63
ЪДВДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
УПАКОВАННОЕ ДЕСЯТИЧНОЕ іSі X і ВЕЛИЧИНА і
АДБДДДДДДДБd17Бd16Бd15Бd14Бd13Бd12Бd11Бd10Бd9ДБd8ДБd7ДБd6ДБd5ДБd4ДБd3ДБd2ДБd1ДБd0ДЩ
79 72 0
ЪДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДї
КОРОТКОЕ ВЕЩЕСТВЕННОЕ іSіПОРЯДОК і МАНТИССА і
АДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДЩ
31 23 0
ЪДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
ДЛИННОЕ ВЕЩЕСТВЕННОЕ іSі ПОРЯДОК і МАНТИССА і
АДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
63 52 0
ЪДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
ВРЕМЕННОЕ ВЕЩЕСТВЕННОЕ іSі ПОРЯДОК ГДДї МАНТИССА і
АДБДДДДДДДДДДДДДДДДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
79 64 63 0
КОММЕНТАРИИ:
S - бит знака (0 - плюс, 1 - минус)
dn - Десятичная цифра (по две на бит)
X - Незначащие биты; 8087 их игнорирует при загрузке и обнуляет при сохранении
- Позиция подразумеваемой двомичной точки
I - Целый бит мантиссы; сохраняется для временных действительных, подразумевается - для коротких и длинных
ПОРЯДОК (нормализованные значения):
Короткие действительные: 127 (7FH)
Длинные действительные: 1023 (3FFH)
Временные действительные: 16383 (3FFFH)
Фиг. 7.1 Форматы данных 8087 (Copyright Intel 1980)
а также несколько восьмибайтовых полей с помощью команды DUP.
Оставшийся целый тип данных - упакованный десятичный формат.
Этот тип данных представляет целое число в упакованном десяточном
формате. Такие данные занимают десять байт. Один байт
резервируется для знака, а оставшиеся девять байт содержат 18
десяточных цифр. Такое упакованное представление десятичных чисел
идентично представлению десятичных операндов микропроцессора 8088,
но при этом представлении одновременно обрабатывается 18 цифр.
Команды десятичной коррекции упакованных десятичных чисел
микропроцессора 8088 допускают одновременно только две десятичные
цифры. Кроме того, упакованные десятичгые числа микропроцессора
8088 требуют, чтобы программист определил метод обработки знака
числа, если используются отрицательные числа. Упакованные
десятичные числа сопроцессора 8087 имеют бит знака в старешм байте.
Упакованное десятичное число хранится в десятичном коде, причем
старший бит 10-байтного поля содержит знак (0 - положительно, 1 -
отрицательно).
Для описания упакованного десяточного числа используется
оператор определения десятибайтового поля DT. Чтобы задать
уракованное десятичное число в этом поле, необходимо использовать
шестнадцатеричную запись. Если в поле операнда окажется целое
число, ассемблер преобразует его в дополнительный двоичный код, а
не в упакованное десятичное число. К счастью, преобразовать
десятичное число в необходимую шестнадцатеричную форму легко.
A
ЪДВДВДДДДДДДДДДДї
і |M| і
+3іS|S| і
і |B| і
ГДБДБДДДДДДДДДДДґ
і і
+2і і
і і
ЪДВДВДДДДДДДДДДДї ГДДДДДДДДДДДДДДДґ ЪДВДВДДДДДДДДДДДї
і |M| і і і і |M| і
+1іS|S| і +1і і +3іS|S| і
і |B| і і і і |E| і
ГДБДБДДДДДДДДДВДґ ГДДДДДДДДДДДДДВДґ ГДЕДЕДДДДДДДДДДДґ
і |Lі і |Lі іL|M| і
+0і |Sі +0і |Sі +2іS|S| і
і |Bі і |Bі іE|F| і
АДДДДДДДДДДДДДБДЩ АДДДДДДДДДДДДДБДЩ ГДБДБДДДДДДДДДДДґ
7 0 7 0 і і
ЦЕЛЫЕ СЛОВА КОРОТКИЕ ЦЕЛЫЕ +1і і
і і
і ЪДВДДДДДДДДДДДДДї ГДДДДДДДДДДДДДВДґ ЪДВДВДДДДДДДДДДДї
і і | і і |Lі і |M| і
і +9іS| (X) і +0і |Sі +9іS|S| і
і і | і і |Fі і |E| і
і ГДБДДДДДВДДДДДДДґ АДДДДДДДДДДДДДБДЩ ГДБДБДДДДДДДДДВДґ
і і | і 7 0 і |Lі
Р +8і | і КОРОТКИЕ ВЕЩЕСТВ. +8і |Sі
О і | і і |Eі
ЪДВДВДДДДДДДДДДДї С ГДДДДДДДЕДДДДДДДґ ЪДВДВДДДДДДДДДДДї ГДВДВДДДДДДДДДБДґ
і |M| і Т і | і і |M| і і і |M| і
+7іS|S| і +7і | і +7іS|S| і і +7іI|S| і
і |B| і А і | і і |E| і і і |F| і
ГДБДБДДДДДДДДДДДґ Д ГДДДДДДДЕДДДДДДДґ ГДБДБДДВДВДВДДДДґ і ГДБДБДДДДДДДДДДДґ
і і Р і | і і |L|M| і і і і
+6і і Е +6і | і +6і |S|S| і і +6і і
і і С і | і і |E|F| і Р і і
ГДДДДДДДДДДДДДДДґ О ГДДДДДДДЕДДДДДДДґ ГДДДДДДБДБДБДДДДґ О ГДДДДДДДДДДДДДДДґ
і і В і | і і і С і і
+5і і +5і | і +5і і Т +5і і
і і і | і і і і і
ГДДДДДДДДДДДДДДДґ ГДДДДДДДЕДДДДДДДґ ГДДДДДДДДДДДДДДДґ А ГДДДДДДДДДДДДДДДґ
і і і | і і і Д і і
+4і і +4і | і +4і і Р +4і і
і і і | і і і Е і і
ГДДДДДДДДДДДДДДДґ ГДДДДДДДЕДДДДДДДґ ГДДДДДДДДДДДДДДДґ С ГДДДДДДДДДДДДДДДґ
і і і | і і і О і і
+3і і +3і | і +3і і В +3і і
і і і | і і і і і
ГДДДДДДДДДДДДДДДґ ГДДДДДДДЕДДДДДДДґ ГДДДДДДДДДДДДДДДґ ГДДДДДДДДДДДДДВДґ
і і і | і і і і | і
+2і і +2і | і +2і і +2і | і
і і і | і і і і | і
ГДДДДДДДДДДДДДДДґ ГДДДДДДДЕДДДДДДДґ ГДДДДДДДДДДДДДДДґ ГДДДДДДДДДДДДДДДґ
і і і | і і і і і
+1і і +1і | і +1і і +1і і
і і і | і і і і і
ГДДДДДДДДДДДДДВДґ ГДДДДДДДЕДДДДДДДґ ГДДДДДДДДДДДДДВДґ ГДДДДДДДДДДДДДВДґ
і |Lі і | і і |Lі і |Lі
+0і |Sі +0і | і +0і |Sі +0і |Sі
і |Bі і | і і |Fі і |Fі
АДДДДДДДДДДДДДБДЩ АДДДДДДДБДДДДДДДЩ АДДДДДДДДДДДДДБДЩ АДДДДДДДДДДДДДБДЩ
7 0 7 0 7 0 7 0
ДЛИННЫЕ ЦЕЛЫЕ УПАКОВАННЫЕ ДЕС. ДЛИННЫЕ ВЕЩЕСТВ. ВРЕМЕННЫЕ ВЕЩЕСТВ.
S: Бит знака S: Бит знака
MSB/LSB: Старший/младший бит MSE/LSE: Старший/младший бит порядка
MSD/LSD: Старшая/младшая десятичная цифра MSF/LSF: Старший/младший бит дробной части
(X): Биты не имеют значения I: Целый бит мантиссы
A
Фиг. 7.2 Структура хранения данных в 8087
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:03:56
Фиг. 7.3 Целочисленные форматы данных сопроцессора 8087 Page 1-1
PAGE ,132
TITLE Фиг. 7.3 Целочисленные форматы данных сопроцессора 8087
0000 CODE SEGMENT
0000 04D2 WORD DW 1234
7_3.ASM(6): warning A4016: Reserved word used as symbol: WORD
0002 FB2E DW -1234
0004 40E20100 SHORT_INTEGER DD 123456
0008 C01DFEFF DD -123456
000C D202964900000000 LONG_INTEGER DQ 1234567890
0014 2EFD69B6FFFFFFFF DQ -1234567890
001C ???????????????? DQ ?
0024 78563412907856341200 PACKED_BCD DT 00123456789012345678H
002E 78563412907856341280 DT 80123456789012345678H ; Отрицательное от предыдущего
0038 0002[ DT 2 DUP (?)
???????????????
?????
]
004C CODE ENDS
END
Фиг. 7.3 Целочисленные форматы данных сопроцессора 8087
Просто запишите нужное число в десятичной форме, а затем добавьте
букву H, показывающую, что это - шестнадцатеричное число.
Изобразить отрицательное число труднее. Если вы напишите перед
десятичным числом знак "-", ассемблер преобразует его в двоичный
дополнительный код, даже если есть буква H. Поэтому в этом случае
нужно подсчитать десятичные цифры и удлинить число до 20 цифр.
первые две цифры должны быть 80, чтобы показать, что число
отрицательно. То есть, чтобы изобразить -1234 в упакованном
десятичном формате, надо записать:
DT 80000000000000001234H
На Фиг. 7.3 изображен листинг ассемблера, иллюстрирующий
сформированные ассемблером значения в случае четырех типов целых
чисел.