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


Дополнительный флаг переноса



Дополнительный флаг переноса


    Возможно,     вам    никогда    не   придется      пользоваться    флагом
    дополнительного  переноса (AUX),  по крайней  мере непосредственно.
    Изучив команды условных переходов микропроцессора 8088, вы увидите,
    что  прямое  тестирование  этого  флага  невозможно. Микропроцессор
    имеет флаг дополнительного переноса  AUX для очень конкретной цели:
    он      позволяет  микропроцессору  выполнять  десятичные  вычисления в
    двоичной кодировке (Binary-coded-decimal arithmetic - BCD - арифметика).
       BCD - арифметика отличается от  той, которую мы обсудили в гл.2.
    Она  основана на  десятичной системе  счисления. При  осуществлении
    десятичной арифметики  в двоичной кодировке  любая дасятичная цифра
    представляется четырьмя битами  (полубайтом). Каждый полубайт может
    представлять  значения  от      0  до  9;  значения  от  0AH  до 0FH не


    используются.  Это  означает,  что    один  байт  может  представлять
    десятичные числа от 0 до 99.
      На  первый  взгляд  такой  способ  хранения числовой информации
    кажется  расточительным,  двоичная    кодировка  десятичныч  чисел не
    использует 6 из 16 возможных состояний каждого полубайта. Однако во
    многих   случаях  применения   микропроцессора  этот   способ  дает
    непосредственное    представление     вводимых    оператором  чисел.
    Большинство людей более подготовлено к работе с десятичными, а не с
    двоичными  или шестнадцатеричными  числами. Как  только потребности
    ввода-вывода  могут  перевесить  аспекты  хранения      и  вычислений в
    приложениях, так удобнее становится  выстраивать информацию в виде,
    легко  преобразуемом  к  формату  ввода-вывода.  Двоичная кодировка
    десятичных    чисел дает  такую возможность.      BCD -  арифметика также
    решает   возникающую   в   некоторых   двоичных  системах  проблему
    представления  чисел. При  использовании чисел  с плавающей  точкой
    иногда возникает  проблема округления, потому  что двоичная система
    счисления     не  полностью     соответствует  десятичной   системе.  В
    некоторых случаях последняя цифра  в результате простого вычисления
    может  оказаться неверной.      Иногда это  называют проблемой      "потери
    пенни",  так   как  эти  случаи   наиболее  заметны  в   финансовых
    приложениях. BCD - представление  чисел дает альтернативу для таких
    вычислений.
      Набор команд  микропроцессора 8088 не  имеет специальных команд
    сложения и вычитания для BCD-арифметики. Здесь используется обычное
    сложение  и  вычитание,  применяемые  как  и  при  обычном двоичном
    представлении.  Результат сложения  двух    BCD-чисел   на    обычном
    математическом процессоре может  оказаться неправельным BCD-числом;
    Для  устранения этого  микропроцессор 8088  имеет несколько команд,
    которые  преобразуют  результат  к    правильной  двоичной  кодировке
    десятичного числа. Для  корректного проведения этого преобразования
    процессор  должен знать,  был ли  перенос из  младшего полубайта  в
    старший во    время сложения. Пример на  Фиг. 3.13 показывает, почему
 
               38
            +  29
              ----
               61       Фиг. 3.13 Десятичное сложение
 
    это  необходимо. Десятичная  сумма 38  + 29  равна 67.  Но двоичная
    сумма  38H    +  29H      равна  61H.  Если  числа  38  и 29 представляют
    BCD-значения, то после операции сложения программа должна выполнить
    коррекцию.    Команда  десятичной   коррекции  для     сложения  (DAA)
    преобразует число в форму BCD.  В нашем случае число представлено в
    десятичной форме, т.е. оба полубайта  находятся в диапазоне от 0 до
    9, однако результат неверен. В данном случае сложение устанавливает
    флаг дополнительного  переноса, который показаывает,  что произошел
    перенос из младшей  цифры (8 + 9). Этот  флаг сообщает команде DAA,
    чтобы она прибавила к результату 6, давая правильный результат 67.
      Микропроцессор    также использует  флаг дополнительного переноса
    при коррекции  десятичной арифметики вслед за  вычитанием с помощью
    команды  десятичной коррекции  для вычитания  DAS. Существуют также
    две  другие команды,  которые используют  флаг AUX      для определения
    правильности  действий.  Эти   команды,  символьная  коррекция  для
    вычитания AAS и символьная коррекция для сложения AAA, выполняют ту
    же      BCD-коррекцию, что  и команды  DAA  и  DAS. Команды  AAA и  AAS
    используются в программах для  работы с таким представлением чисел,
    при  котором  каждая  десятичная  цифра  занимает  один  байт.  Это
    представление,  еще более  расточающее память,  чем BCD,  допускает
    очень удобную перекодировку из  кода ASCII в числовое представление
    и обратно. Числа от  0 до 9 представляются в  коде ASCII значениями
    от      30H  до  39H,  и  преобразование  в  этот  код и обратно просто
    означает   сложение   или вычитание   30H.   В   следующей  главе
    рассматривается   использование  команд   десятичной  и  сомвольной
    коррекции.




Содержание раздела