Информатика и информационные технологии: конспект лекций.
Арифметические действия над упакованными ВСD-числами.
Как уже отмечалось выше, упакованные ВСD-числа можно только складывать и вычитать. Для выполнения других действий над ними их нужно дополнительно преобразовывать либо в неупакованный формат, либо в двоичное представление. Из-за того, что упакованные ВСD-числа представляют не слишком большой интерес, мы их рассмотрим кратко.
Сложение упакованных ВСD-чисел.
Вначале разберемся с сутью проблемы и попытаемся сложить два двузначных упакованных ВСD-числа. Пример Сложение упакованных ВСD-чисел:
67 = 01100111.
+
75 = 01110101.
=
142 = 1101 1100 = 220.
Как видим, в двоичном виде результат равен 1101 1100 (или 220 в десятичном представлении), что неверно. Это происходит по той причине, что микропроцессор не подозревает о существовании ВСD-чисел и складывает их по правилам сложения двоичных чисел. На самом деле, результат в двоично-десятичном виде должен быть равен 0001 0100 0010 (или 142 в десятичном представлении).
Видно, что, как и для неупакованных ВСD-чисел, для упакованных ВСD-чисел существует потребность как-то корректировать результаты арифметических операций.
Микропроцессор предоставляет для этого команду dаа – dаа (Dесimаl Аdjust fоr Аdditiоn) – коррекция результата сложения для представления в десятичном виде.
Команда dаа преобразует содержимое регистра аl в две упакованные десятичные цифры по алгоритму, приведенному в описании команды dаа Получившаяся в результате сложения единица (если результат сложения больше 99) запоминается в флаге сf, тем самым учитывается перенос в старший разряд.
Вычитание упакованных ВСD-чисел.
Аналогично сложению, микропроцессор рассматривает упакованные ВСD-числа как двоичные и, соответственно, выполняет вычитание ВСD-чисел как двоичных.
Пример.
Вычитание упакованных ВСD-чисел.
Выполним вычитание 67–75. Так как микропроцессор выполняет вычитание способом сложения, то и мы последуем этому:
67 = 01100111.
+
-75 = 10110101.
=
-8 = 0001 1100 = 28.
Как видим, результат равен 28 в десятичной системе счисления, что является абсурдом. В двоично-десятичном коде результат должен быть равен 0000 1000 (или 8 в десятичной системе счисления).
При программировании вычитания упакованных ВСD-чисел программист, как и при вычитании неупакованных ВСD-чисел, должен сам осуществлять контроль за знаком. Это делается с помощью флага СF, который фиксирует заем из старших разрядов.
Само вычитание ВСD-чисел осуществляется простой командой вычитания sub или sbb. Коррекция результата осуществляется командой dаs – dаs (Dесimаl Аdjust fоr Substrасtiоn) – коррекция результата вычитания для представления в десятичном виде.
Команда dаs преобразует содержимое регистра АL в две упакованные десятичные цифры по алгоритму, приведенному в описании команды dаs.