7.2. Типы данных 8087

Микросхема 8087 имеет расширенный набор типов данных, необходимых для поддержки ее расширенных арифметических возможностей. В то время как микропроцессор 8088 может непосредственно работать только с байтами и словами, микросхема 8087 имеет семь типов данных. Шесть из них присущи лишь микросхеме 8087. На Фиг. 7.1 показаны все семь типов данных, с которыми работает микросхема 8087. Четыре формата представляют целые числа, а три формата - вещественные, или числа с плавающей точкой. Один формат представляет упакованные десятичные числа.

Рисунок 7.2 иллюстрирует способы, которыми микросхема хранит эти числа в памяти. Как и в случае данных микропроцессора 8088, все данные хранятся с младшей частью операнда, записанной в младших адресах. Бит знака всегда оказывается в байте по старшему адресу памяти. Мы будем обсуждать назначение различных полей по мере того, как будем рассматривать разные типы данных.

Сопроцессор 8087 работает с тремя типами целых чисел: словом, которое имеет длину 16 бит и идентично слову микропроцессора 8088; коротким целым числом, имеющим длину 32 бита; длинным целым числом, 64-значением. Все эти числа являются числами, представленными в двоичном дополнительном коде.

В программе целое слово определяется с помощью оператора DW. Такое целое слово может иметь значение в диапазоне от - 32768 до 32767. Этот целый формат уже использовался в наборе команд микропроцессора 8088. Это - единственный формат данных, общий для микропроцессора 8088 и арифметического сопроцессора 8087. Короткий целый формат требуется в операторе описания данных длиной 32 бита. Такое описание двойного слова выполняет оператор DD, определяющий целые числа, лежащие в диапазоне от -2^32 до 2^32-1. Напоминаем, что с помощью оператора DD можно также определить пару СЕГМЕНТ:СМЕЩЕНИЕ. Ассемблер решает сам, какую именно форму сгенерировать, основываясь на операнде. Если операнд - адрес, порождается пара СЕГМЕНТ:СМЕЩЕНИЕ; если же операнд - просто число, соответственно порождается длинное целое число. Для описания длинных 64-битовых целых чисел используется оператор определения счетверенного слова DQ. Эта директива вынуждает ассемблер сформировать поле данных, состоящее их четырех слов (восьми байт). Такой тип целого может иметь значения в диапазоне от -2^63 до 2^63-1. Этот оператор ассемблера, так же как и операторы DB, DW и DD, может определить константу, неопределенное поле (если задан операнд "?"), а также несколько восьмибайтовых полей с помощью команды DUP. Оставшийся целый тип данных - упакованный десятичный формат. Этот тип данных представляет целое число в упакованном десяточном формате. Такие данные занимают десять байт. Один байт резервируется для знака, а оставшиеся девять байт содержат 18 десяточных цифр. Такое упакованное представление десятичных чисел идентично представлению десятичных операндов микропроцессора 8088, но при этом представлении одновременно обрабатывается 18 цифр. Команды десятичной коррекции упакованных десятичных чисел микропроцессора 8088 допускают одновременно только две десятичные цифры. Кроме того, упакованные десятичгые числа микропроцессора 8088 требуют, чтобы программист определил метод обработки знака числа, если используются отрицательные числа. Упакованные десятичные числа сопроцессора 8087 имеют бит знака в старшем байте. Упакованное десятичное число хранится в десятичном коде, причем старший бит 10-байтного поля содержит знак (0 - положительно, 1 - отрицательно). Для описания упакованного десяточного числа используется оператор определения десятибайтового поля DT. Чтобы задать упакованное десятичное число в этом поле, необходимо использовать шестнадцатеричную запись. Если в поле операнда окажется целое число, ассемблер преобразует его в дополнительный двоичный код, а не в упакованное десятичное число. К счастью, преобразовать десятичное число в необходимую шестнадцатеричную форму легко. Просто запишите нужное число в десятичной форме, а затем добавьте букву H, показывающую, что это - шестнадцатеричное число. Изобразить отрицательное число труднее. Если вы напишите перед десятичным числом знак "-", ассемблер преобразует его в двоичный дополнительный код, даже если есть буква H. Поэтому в этом случае нужно подсчитать десятичные цифры и удлинить число до 20 цифр. первые две цифры должны быть 80, чтобы показать, что число отрицательно. То есть, чтобы изобразить -1234 в упакованном десятичном формате, надо записать:


DT 80000000000000001234H 

На Фиг. 7.3 изображен листинг ассемблера, иллюстрирующий сформированные ассемблером значения в случае четырех типов целых чисел.

Целые числа
Тип S X Величина Комментарий
Слово 15   14-0 Дополнение до двух
Короткое целое 31   30-0 Дополнение до двух
Длинное целое 63   62-0 Дополнение до двух
Упакованное десятичное 79 78-72 71-0 d17..d0
Числа с плавающей запятой
Тип I Порядок Мантиса Комментарий
Single 31 30-24 23-0  
Double 63 63-53 52-0  
Extended 79 78-64 63-0  

Фиг. 7.1 Форматы данных 8087 (Copyright Intel 1980)

     
Комментарии:
  S  - бит знака (0 - плюс, 1 - минус)
  dn - Десятичная цифра (по две на байт)
  X  - Незначащие биты; 8087 их игнорирует при загрузке и обнуляет при сохранении
  I  - Целый бит мантиссы; сохраняется для временных действительных
  Порядок (нормализованные значения):
    Короткие действительные:    127 (7FH)
    Длинные действительные:    1023 (3FFH)
    Временные действительные: 16383 (3FFFH)

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