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

Unknown Author

Сложение ASCII-чисел

Несколько усложненное действие команды ААА объясняется тем, что она ориентирована на сложение цифр не только неупакованных двоично-десятичных чисел, но и ASCII-чисел. Например, если по команде ADD сложить коды цифр 5 и 8, т. е. коды 35h и 38h, то получим сумму 6Dh = 01101101b. Если после этого выполнить команду ААА, то она будет обращать внимание только на правую половину суммы, т. е. на величину 1101b (=13), которая и является настоящей суммой цифр (как чисел). Поскольку эта величина больше 9, то команда ААА фиксирует в флаге CF перенос и прибавляет б к AL (6Dh+6=73h), после чего обнуляет левую половину этой суммы, получая "правильную" цифру 3. Осталось только объединить ее с числом 30h, чтобы получить ASCH-код этой цифры - 33h.

Если значения описанных в последнем примере переменных X, Y и Z рассматривать как ASCII-числа, тогда сложение Z:=X+Y можно реализовать следующим образом (замечание: поскольку команда OR портит флаг CF, то перенос в старшие цифры будем производить через регистр АН): ;сложение ASCI1-чисел (числовых строк): Z:=X+Y

MOV CX,N MOV SI,N-1 MOV AH,0

SUM: MOV AL,X[SI] ADD AL,Y[SI] ADD AL,AH MOV AH,0 AAA

OR AL,30h

количество цифр в слагаемых ;индекс цифр слагаемых (справа налево)

;АН - перенос из младших цифр (вначале его нет)

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

;коррекция сложения и запись переноса в АН преобразование цифры в символ

MOV Z[SI+1],AL ;запись кода цифры в Z DEC SI LOOP SUM OR AH,30h

MOV Z,AH    ;запись в Z переноса из старших цифр

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

И здесь приходится складывать числа по частям, но уже не по одной цифре, а по паре цифр, упакованных в одном байте: по команде ADD или ADC складывается пара цифр из первого слагаемого с парой цифр из второго слагаемого, а затем с помощью специальной команды корректируется полученная сумма. Это следующая команда:

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