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

Unknown Author

AAS    ;0FDh-6=0F7h —>    AL=07h, CF=1

Команда AAS применяется при вычитании как неупакованных двоично-десятичных чисел, так и ASCII-чисел. Алгоритмы вычитания аналогичны алгоритмам сложения, поэтому мы их не будем приводить.

При вычитании упакованных двоично-десятичных чисел для коррекции цифр разности используется команда

Десятичная коррекция после вычитания

(decimal adjust after subtraction): DAS

Эту команду следует применять после команды вычитания (SUB и т. п.), которая из одного байта, где упакованы две правильные десятичные цифры, вычитает другой подобный байт и записывает разность в регистр AL. Команда DAS действует так: если AF=1 или если величина 4 правых битов AL больше 9, тогда (для коррекции правой цифры разности) из AL вычитается 6; если CF=1 или если величина 4 левых битов AL больше 9, тогда (для коррекции левой цифры и учета заема) из AL вычитается 60h и флаг CF получает значение 1, а иначе CF получает значение 0. Например:

MOV АН,о MOV AL,25h

SUB AL,52h    ;AL=0D3h, AF=0, CF=1

DAS    ;AL:=0D3h-60h=73h, CF=1

14.1.4. Умножение и деление двоично-десятичных чисел

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

Для коррекции при умножении используется команда

ASCII-коррекция после умножения (ASCII adjust after multiply): AAM

Эту команду следует применять после команды умножения (MUL) двух неупакованных десятичных цифр, которая записывает их произведение в регистр AL. Команда ААМ делит значение AL на 10 и записывает неполное частное в регистр АН, а остаток - в регистр AL, получая тем самым в двух этих регистрах правильные десятичные цифры произведения. Например:

MOV AL,6 MOV вн,9

MUL ВН    ;AL=54=36h (АН=0)

ААМ    ;АН=5, AL=4

В качестве примера использования команды ААМ рассмотрим умножение N-значного неупакованного двоично-десятичного числа X на однозначное число Y с записью произведения в Z. Будем брать справа налево цифры из X и по очереди умножать их на Y, записывая в Z правую цифру получившегося произведения и прибавляя левую цифру к произведению старших цифр:

N EQU    ...    ;N>0

X DB N DUP(?)

Y DB ?    ;от 0 до 9

Z DB ?, N DUP (? )    ; первый байт - для переноса

;умножение неупакованного 2-10-го числа X на десятичную цифру Y MOV    CX,N    ;количество    цифр    в    X

MOV    SI,N-1    ;индекс цифры из    X    (справа налево)

MOV    ВН,0    ;перенос из    младших цифр

MLT: MOV AL,X[SI]

;умножение цифры из X на Y

MUL Y ЛАМ

ADD AL,BH AAA

MOV Z[SI+1],AL MOV BH,AH DEC SI LOOP MLT MOV Z,BH

;АН=левая цифра произведения, АЬ=правая

;учет переноса из младших цифр

;коррекция сложения (если надо, АН: =АН+1)

;запись правой цифры в Z

;запомнить перенос в старшие цифры

;старшая цифра произведения

Для коррекции при делении двоично-десятичных чисел в ПК используется команда