Assembler для начинающих






      Для изображения чисел с плавающей точкой в процессоре 8087
    существует три формата данных.  Два из них совпадают с предложенным
    ИИЭР стандартом для таких чисел.  Короткий формат имеет 32 бита, а
    длинный - 64 бита.  Третий формат определяет 80-битовые числа, и не
    совпадает со стандартом ИИЭР.  Сопроцессор 8087 использует такой
    формат "промежуточного действительного числа", чтобы обеспечить
    очень высокую точность для промежуточных результатов вычислений.
 
      Оставшаяся часть этого раздела предназначена для тех, кто не
    имел дела с вещественными числами в ЭВМ.  Вы можете пропустить этот
    раздел, если понимаете о общих чертах способы представления
    вещественных чисел - как на бумаге, так и в ЭВМ; а в следующем
    разделе мы рассмотрим конкретный способ, используемый в
    сопроцессоре 8087.
 
      Целые числа - лучший способ представления многих величин.
    Целые чила просто понимать и использовать, а также легко
    преобразовывать в двоичное представление.  Однако с целыми числами
    плохо работать в случае очень больших значений.  Очень большое
    целое число обычно оканчивается длинной строкой нулей.  Например:
    Солнце находится на расстоянии около 93000000 миль от Земли.  Целые
    числа, кроме того, не способны представить значение, содержащее
    дробную часть, то есть ЭВМ не может запомнить число 1/2 в целом
    представлении.  Любые другие дроби, меньшие 1, также невозможно
    представить, используя целые числа.
 
      Ученые и математики давным-давно разработали способ
    представления этих чисел в достаточно удобном виде.  На первом
    этапе вводится десяточная точка.  Этот символ, "." показывает
    границу между целой и дробной частью числа.  В случае целого числа
    позиция, представляющая единицы, всегда находится на рпавом краю
    числа; в случае, когда используется десятичная точка, цифры справа
    от нее представляют значения, меньшие единицы.
 
      У целых чисел каждая позиция числа соответствует степени 10.
    То есть число 1234 есть
 
      1234=1000+200+30+4=1*10**3+2*10**2+3*10**1+4*10**0
 
      Десятичная точка показывает границу между позицией,
    соответствующей 100, и дробной частью.  В дробной части позиции
    снова являются сиепенями 10, но теперь эти степени 10 -
    отрицательные.  Поэтому число 1.234 есть
 
      1.234=1+0.2+0.03+0.004=
         1*10**0+2*10**-1+3*10**-2+4*10**-3
 
      Десятичная точка позволяет записывать дроби.  Число 1/2 теперь
    выглядит как 1.5, а 1/4 выглядит как 0.25, и 1/5 выглядит как 0.2.
 
      Поскольку каждая позиция десятичного числа отличается от
    соседней на степень 10, умножение числа на 10 эквивалентно сдвигу
    десятичной точки на одну позицию вправо.  Аналогично деление на 10
    сдвигает десятичную точку на позицию влево.  Это свойсто можно
    использовать для сдвига десятичной точки на соответствующее место:
    мы сдвигаем десятичную точку и одновременно корректируем число на
    же степень 10.  Такое представление чисел называется представление
    "с плавающей точкой", поскольку десятичная точка "плавает" в числе;
    она больше не помечает абсолютное место между целой и дробной
    частями.  Положение десятичной точки можно выбрать из соображений
    удобства, а затем умножить число на нужную степень 10, чтобы
    получить правильное значение.
 
      Например, Солнце находится на расстоянии примерно 93000000 миль
    от Земли.  С такой формой записи тяжело работать из-за обилия
    нулей.  Можно записать это число в формате с плавающей точкой:
    9.3*107.  То есть 93000000 эквивалентно 9.3, умноженному на 10 в
    седьмой степени.  Фактически,
 
      93000000=9.3*10**7=93*10**6=930*10**5
 
      и так далее.  Мы можем двигать десятичную точку куда угодно,
    меняя степень 10.
 
      Десятичное число с плавающей точкой состоит из двух частей.
    Значащая часть числа называется мантиссой.  В предыдущем примере
    число 9.3 есть мантисса.  На практике мантисса обычно находится в
    пределах 1<=мантисса<10; т.е.  она может быть равна 1.3, 7.6 или
    9.97.  Другая часть числа с плавающей точкой - это порядок,
    степень, в которую нужно возвести 10 перед умножением его на
    мантиссу.  То есть 9.3*107 имеет мантиссу 9.3 и порядок 7.    Если
    основание системы счисления определено раз и навсегда, в нашем
    случае это 10, то для восстановления первоначального числа должны
    быть заданы только два числа - мантисса и порядок.
 
      Представление с плавающей точкой позволяет записявать в
    компактном виде как очень большие (например, 1.234*1085) так и
    очень малые (1.234*10-85) числа.  Чтобы записать те же числа без
    использования степени десяти, потребовались бы длинные строки,
    состоящие из нулей.
 
      Двоичные числа с плавающей точкой изображаются аналогично
    десятичным; отличие заключается в том, что основание системы
    счисления здесь 2, а не 10.  Мантисса имеет значение 1<=мантисса<2,
    а порядок показывает степень 2.  То есть число 1.101*10100 в
    двоичной форме означает, что мантисса 1.101 умножается на 24, или
    16.  Значение мантиссы определяется таким же позиционным способом,
    как и для десятичного числа, за исключением того, что основание
    теперь равно 2.  Позиции, находящиеся справа от двоичной точки,
    представляют отрицательные степени двойки.  Таблица на Фиг. 7.4
    показывает значения первых пяти позиций.
 
      Теперь мы можем вычислить десятичное значение числа из примера:
 
      1.101b=1+1/2+1/8=15/8=1.625
      10**100b=2**4=16
      1.101*10**100B = (1+5/8)*16 = 26
      Кроме того, мы могли бы вычислить это значение точно так же,
    как в случае десятичных чисел.  Значение порядка показывает, на
    сколько позиций надо сдвинуть двоичную точку.  В этом случае,
    поскольку значение порядка равно 4, двоичную точку надо сдвинуть на
    четыре позиции вправо.  Поэтому
 
      1.101*10**100B=11010B=26
 
      Оба метода правильные и дают идентичные результаты.  В первом
    случае вычисляется мантисса, затем она умножается на основание,
    возведенное в степень порядка; во втором случае сначала выполняется
    умножение, а затем вычисляется мантисса.
 
      Двоичное значение   Десятичное значение
     -------------------------------------------
      0.1               1/2
      0.01              1/4
      0.001             1/8
      0.0001                  1/16
      0.00001           1/32
     ----------------------------------------- Фиг. 7.4 Отрицательные
                                        степени двух
 
      Как же эти числа представляются в ЭВМ?    Место, отводимое для
    числа с плавающей точкой, делится на два поля.  Одно поле содержит
    знак и значение мантиссы, а другое содержит знак и значение
    порядка.  Размер поля мантиссы определяет точность представления
    числа.  Чем большее число бит отводится в ЭВМ под поле мантиссы,
    тем выше точность.  Например, десятичная мантисса 1.234 более
    точная, чем мантисса 1.2.  Две дополнительные цифры мантиссы дают
    возможность более точно передавать значение числа.
 
      Для того, чтобы сохранить максимальную точность, вычислительные
    машины почти всегда хранят мантиссу в нормализованном виде.  Это
    означает, что мантисса есть число, лежащее между 1 и 2
    (1<=мантисса<2).  Два соображения говорят в пользу нормализации.
    Во-первых, ни один незначащий нуль не дает никакого вклада в
    точность числа.  (Это несправедливо для нулей, лежащих в конце
    числа; мы считаем, что число 1.000 более точно, чем число 1.0).
    Если в мантиссе с плавающей точкой появились незначащие нули,
    точность числа падает.  Во-вторых, способ хранения мантиссы с
    плавающей точкой подразумевает, что двоичная точка находится на
    фиксированном месте.  Фактически подразумевается, что двоичная
    точка следует после первой двоичной цифры.  То есть нормализация
    мантиссы делает единичным первый бит, помещая тем самым значение
    мантиссы между 1 и 2.  Для выполнения нормализации ЭВМ корректирует
    порядок числа на соответствующее значение.
 
      При нормализации встречаются исключения.  Наиболее очквидное
    исключение - нуль.  В этом случае вся мантисса нулевая.  Второе
    исключение не так очевидно, и возникает в случае приближения числа
    к нижней границе своего диапазона.    Давайте разберемся, что это
    означает.
      Точно так же, как длина мантиссы числа определяет его точность,
    длина поля порядка определяет диапазон числа.  Поле порядка
    содержит степень двойки, и чем больше бит в этом поле, тем большее
    число может быть представлено.
 
      Если под поле порядка (представленного в дополнительном коде)
    отведено три двоичных цмфры, наибольшее представимое число есть
    1.111 ...  * 10011B.  Мантисса - это число, чуть меньше двух, а
    множитель мантиссы равен 23, или 8.  Поэтому максимальное число
    чуть меньше 16.  Наименьшее ненулевое положительное число есть
    1.000 ...  * 10100B, или 1*2-4, или 1/16.  Поскольку в числах с
    плавающей точкой для представления мантиссы не используется
    дополнительный код, диапазон отрицательных чисел такой же.    В
    случае 3-битового порядка диапазон положительных чисел от 1/16 до
    16, а отрицательных - от -16 до -1/16.
 
      Если для поля порядка используется 4 бита, наибольшее число
    равно 1.111...  *100111B<2*27=256.    Наименьшее ненулевое
    положительное число 1.000...  *101000B=1*2-8=1/256.  Таким образом
    четыре бита порядка допускают диапазон изменения чисел от 1/256 до
    256.  Чем большее число бит в поле порядка, тем шире диапазон
    представимых чисел.
 
      Важно отметить, что хотя диапазон и расширяется с увеличением
    числа бит порядка, точность не увеличивается.  В только что
    рассмотренных примерах предполагалось, что имеется 4 бита мантиссы.
    Если выбрать конкретное число, попадающее в диапазон обоих
    примеров, то оно будут иметь одну и ту же точность независимо от
    диапазона порядка.  Например, число 1.010*10001B=21/2.  Увеличение
    количества бит порядка не увеличивает точность числа.  Размер
    мантиссы есть единственное ограничение точности данного числа в
    пределах системы.
 
      Значение порядка хранится не как число, представленное в
    дополнительном коде.  Для упрощения вычислений значение порядка в
    ЭВМ хранится в виде смещенного числа.  Это означает, что к
    действительному значению порядка прибавляется смещение перед
    записью его в память.  Смещенным значение порядка делается для
    того, чтобы можно было сравнивать значения порядка с помощью
    обычной операции сравнения чисел с фиксированной точкой без знака.
    В частности, это полезно при сравнении двух чисел с плавающей
    точкой.  Значения порядка и мантиссы записываются в одном элементе
    данных, причем порядок записывается перед мантиссой.  В случае
    смещенного значения порыдка программа может сравнивать числа
    побитно, начиная со старших позиций.  Первое же неравенство
    показывает соотношение чисел, и больше не нужно учитывать никакие
    части чисел.  Значение смещения определяется размером поля порядка.
    Давайте это рассмотрим на примере форматов данных сопроцессора
    8087.
 
      В сопроцессоре 8087 формат короткого действительного числа
    использует 32 бита, восемь из которых содержат значение порядка;
    таким образом, оно может находиться в пределах от - 128 до 127.
    Однако значение -128 зарезервировано для обозначения некоторого
    специального, а именно, неопределенного числа, так что значения
    порядка находятся в диапазоне от -127 до 127.  Значение порядка -
    это не число, представленное в дополнительном коде.  Сопроцессор
    8087 прибавляет значение смещения 127 к значению порядка
    действительного числа перед тем, как его запомнить.
 
      Значение порядка  Хранимое значение
      ---------------------------------------
       -127             000H
         -1             07EH
          0             07FH
          1             080H
        127             0FEH
      ------------------------------------- Фиг. 7.5 Хранение порядка
 
      В таблице на Фиг. 7.5 показаны некоторые возможные значения
    порядка и его запоминаемое значение.  Как видно из рисунка,
    смещение меняет содержимое поля порядка так, чтобы наименьшему
    значению порядка соответствовало наименьшее действительное число;
    аналогично, наибольшему значению порядка соответствовало наибольшее
    число.  Если два числа с плавающей точкой различаются значением
    порядка, простое сравнение полей порядка упорядочивает оюа числа.
    Поскольку такое сравнение можно продолжать и дальше с полями
    мантисс, программа может легко сравнить два числа с плавающей
    точкой.  И вся эта простота - только благодаря смещению порядка.