Те же самые команды, что и для чисел в двоичном дополнительном коде, используются в программе для работы с числами в двоично=десятичном коде BCD. Однако результат арифметических операций может оказаться неправильным для двоично=десятичного представления. Команды десятичной коррекции корректируют результат, полученный после действий двоичной арифметики.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:01:04
Фиг. 4.12 Пример двоично-десятичной арифметики Page 1-1
PAGE ,132
TITLE Фиг. 4.12 Пример двоично-десятичной арифметики
0000 CODE SEGMENT
ASSUME CS:CODE,DS:CODE
0000 ?? BCD1 DB ? ; Две десятичные цифры упакованного числа
0001 ?? BCD2 DB ?
0002 ???? BCD1L DW ? ; Четыре десятичные цифры упакованного числа
0004 ???? BCD2L DW ?
0006 FIG4_12 PROC NEAR
;----- Сложение двух упакованных чисел
0006 DAA_EXAMPLE:
0006 A0 0000 R MOV AL, BCD1 ; Взять первое упакованное число
0009 02 06 0001 R ADD AL, BCD2 ; Добавить второе
000D 27 DAA ; Преобразование упакованного числа
000E C3 RET
;----- Сложение двух упакованных чисел размером по 4 цифры (2 байта)
000F DAA_LONG:
000F A0 0002 R MOV AL, BYTE PTR BCD1L
0012 02 06 0004 R ADD AL, BYTE PTR BCD2L ; Добавление младшей части числа
0016 27 DAA ; Коррекция упакованного числа
0017 A2 0004 R MOV BYTE PTR BCD2L, AL ; Сохранение младшей части
001A A0 0003 R MOV AL, BYTE PTR BCD1L+1
Фиг. 4.12 Примеры вычислений с BCD (начало)
001D 12 06 0005 R ADC AL, BYTE PTR BCD2L+1 ; Добавление старшей части числа
0021 27 DAA ; Коррекция упакованного числа
0022 A2 0005 R MOV BYTE PTR BCD2L+1, AL ; Сохранение старшей части
0025 C3 RET
;----- Сложение двух упакованных чисел
0026 DAS_EXAMPLE:
0026 A0 0000 R MOV AL, BCD1
0029 2A 06 0001 R SUB AL, BCD2 ; Вычитание значений
002D 2F DAS ; Коррекция упакованного числа
002E C3 RET
002F FIG4_12 ENDP
002F CODE ENDS
END
Фиг. 4.12 Примеры вычислений с BCD (продолжение)
Команда DAA правильно устанавливает регистр флагов. Если в результате сложения получилось значение в диапазоне 100 - 198, флаг переноса показывает перенос из старшей десятичной позиции. Аналогично, нулевой результат оставляет установленным в 1 флаг нуля. В случае операций с упакованными десятичными числами флаги знака и переполнения не имеют значения, хотя флаг знака устанавливается, если установлен старший бит регистра AL. Команда DAA использует флаг дополнительного переноса для определения вида коррекции, но после выполнения этой команды флаг дополнительного переноса неопределен.