в двоичном виде результат равен
Сложение упакованных BCD-чисел
67 = 0110 0111 + 75 = 0111 0101 = 142 = 1101 1100 = 220
Как видим, в двоичном виде результат равен 1101 1100 (или 220 в десятичном представлении), что неверно. Это происходит по той причине, что микропроцессор не подозревает о существовании BCD-чисел и складывает их по правилам сложения двоичных чисел. На самом деле, результат в двоично-десятичном виде должен быть равен 0001 0100 0010 (или 142 в десятичном представлении).
Видно, что как и для неупакованных BCD-чисел, для упакованных BCD-чисел существует потребность как-то корректировать результаты арифметических операций.
Микропроцессор предоставляет для этого команду daa:
daa (Decimal Adjust for Addition) — коррекция результата сложения для представления в десятичном виде.
Команда daa преобразует содержимое регистра al в две упакованные десятичные цифры по алгоритму, приведенному в описании команды .
Получившаяся в результате сложения единица (если результат сложения больше 99) запоминается в флаге cf, тем самым учитывается перенос в старший разряд.
Проиллюстрируем сказанное на примере сложения двух двузначных BCD-чисел в упакованном формате (листинг 12).
Листинг 12. Сложение упакованных BCD-чисел <1> ;prg_8_12.asm <2> ... <3> .data ;сегмент данных <4> b db 17h ;упакованное число 17h <5> c db 45h ;упакованное число 45 <6> sumdb 2 dup (0) <7> .code ;сегмент кода <8> main: ;точка входа в программу <9> ... <10> mov al,b <11> add al,c <12> daa <13> jnc $+4 ;переход через команду, если результат <= 99 <14> mov sum+1,ah ;учет переноса при сложении (результат > 99) <15> mov sum,al ;младшие упакованные цифры результата <16> exit: |
В приведенном примере все достаточно прозрачно, единственное, на что следует обратить внимание, — это описание упакованных BCD-чисел и порядок формирования результата. Результат формируется в соответствии с основным принципом работы микропроцессоров Intel: младший байт по младшему адресу.