Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 176

Unknown Author

10

2

10

2

0

0000

5

0101

1

0001

6

ОНО

2

0010

7

0111

3

ООП

8

1000

4

0100

9

1001

На каждое двоично-десятичное число отводят соседние байты памяти - столько, сколько надо. Порядок, в котором цифры числа занимают эти байты, вообще говоря, не фиксируется и определяется программистом. Дело в том, что обработка этих чисел ведется по цифрам и переход от цифры к цифре организует сам программист, а он может с одинаковым успехом переходить от очередного байта как к следующему байту, так и к предыдущему. Но для определенности мы в дальнейшем будем располагать левые (старшие) цифры числа в байтах с меньшими адресами, а правые цифры - с большими.

В ПК используются два формата представления двоично-десятичных чисел -упакованный и неупакованный. При упакованном формате в каждый байт записываются две соседние цифры числа (при нечетном количестве цифр слева к числу приписывается 0), а при неупакованном формате в каждом байте размещается только одна цифра, которая прижимается к правому краю байта. Ниже приведены представления числа 592 в упакованном (слева) и неупакованном форматах (А - адрес первого из байтов, занятых числом):

В ЯА переменные, значения которых трактуются как двоично-десятичные числа, можно описать по директиве DB с несколькими операндами:

PACK DB 5h, 92h UNPACK DB 5, 9, 2

А+1

1 0000 0101 1 1001 0010 1

А    А+1    А+2

1 0000 0101 | 0000 1001 ~00 0010 \

;число 592 в упакованном виде ;число 592 в неупакованном виде

Обратите внимание, что для упакованного числа в одном операнде надо указывать две цифры, причем указывать их в шестнадцатеричной системе, чтобы каждая из цифр при трансляции заменялась на соответствующую четверку битов независимо от другой цифры (если в качестве операнда указать десятичное число 92, тогда оно заменится на 0101ЮОЬ, а не на 10010010b).

В реальных программах двоично-десятичные числа редко выписываются явно. Они обычно получаются из так называемых ASCII-чисел - из числовых строк, из записи чисел в виде символьных строк (например, ’592’), и в конце снова преобразуются в такие строки. Эти преобразования реализуются очень просто: поскольку в системе кодировки ASCII символы-цифры от '0’ до *9* имеют коды от 30h до 39h, то для преобразования цифры-символа в цифру-число надо лишь выделить 4 правых бита из кода этого символа, а для обратного преобразования цифру-число надо сложить (арифметически или логически) с 30h.

14.1.2. Сложение двоично-десятичных чисел

Теперь рассмотрим, как реализуются арифметические операции над двоичнодесятичными числами. Начнем со сложения.

Сложение неупакованных двоично-десятичных чисел

В ПК нет команды сложения двоично-десятичных чисел как единых объектов, поэтому такие числа приходится складывать по цифрам: сначала складывают последние (младшие) цифры, затем - предпоследние и т. д. При этом, учитывая специфику представления таких чисел, при сложении двух их цифр приходится особым образом устанавливать, есть ли перенос в старшие цифры и какую цифру надо записать в соответствующую позицию числа-результата. Здесь возможны два случая. Если сумма двух цифр не превосходит 9 (например, 2+3=5=00000101Ь), тогда переноса в старшие цифры нет (в флаг переноса CF надо записать 0), а в качестве цифры результата надо взять получившуюся величину. Но если сумма цифр больше 9 (5+8=13=00001101Ь), тогда перенос в старшие цифры есть и его надо запомнить в флаге CF, а в результат надо записать величину, которая на 10 меньше полученной суммы. В последнем случае можно поступить и иначе: надо к сумме цифр прибавить 6 и затем обнулить левую половину байта (13+6=19=0001001 lb ~> 00000011Ь=3); отметим, что ПК действует именно по этому варианту.