Читать «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
;запомнить перенос в старшие цифры
;старшая цифра произведения
Для коррекции при делении двоично-десятичных чисел в ПК используется команда