Команды AAA, AAD, AAM, AAS служат для работы с двоично-десятичными числами (BCD). Двоично-десятичные числа - это форма представления числа в бинарном кодe. Каждая цифра в формате BCD представлена четырьмя битами, то есть может иметь значения от 0 до 15. Значения от 0 до 9 соответствуют цифрам от 0 до 9, остальные значения являются в формате BCD запрещенными.

Для примера посмотрим как выглядит число 258 в формате BCD: 2 - это 0010, 5 - это 0101, 8 - это 1000. Итого число 258 в формате BCD записывается как 001001011000.

Арифметические операции с такими числами можно выполнять точно также, как и с числами в обычном представлениии, за исключением того, что после операций необходимо производить двоично-десятичную коррекцию результата. Например после сложения чисел 5 и 6 получаем результат 11 (0101 + 0110 = 1011), что является запрещенным значением в BCD. Для приведения результата в нормальный для BCD вид используется команда коррекции AAA. После ее выполнения в результате получим 00010001.

Рассмотрим команды подробнее.

Команда AAA
Синтаксис: AAA
Операнды: Нет
Назначение: ASCII-коррекция после сложения
Процессор: 8086+
Флаги: Флаги CF и AF устанавливаются в 1, если произошел перенос из AL в AH, в противном случае они равны нулю. Значения флагов OF, SF, ZF и PF не определены.
Комментарий: Команда AAA корректирует сумму двух неупакованных двоично-десятичных чисел в регистре AL. Если коррекция приводит к десятичному переносу, регистр AH увеличивается на 1.
Эту команду лучше использовать сразу после команды сложения двух таких чисел.
Ограничения: Нет
Примеры:
mov	ax,0005h
add	ax,0006h	;AX=000Bh
aaa			;AX=0101h
Команда AAD
Синтаксис: AAD
Операнды: Нет
Назначение: ASCII-коррекция перед делением
Процессор: 8086+
Флаги: Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Значения флагов OF, AF и CF не определены.
Комментарий: Команда AAD выполняет коррекцию неупакованного двоично-десятичного числа, находящегося в регистре AX, так, чтобы последующее деление привело к десятичному результату.
Ограничения: Нет
Примеры:
mov	ax,0205h
mov	bl,05h
aad		;AX=0019h
div	bl	;AX=0005h
Команда AAM
Синтаксис: AAM
Операнды: Нет
Назначение: ASCII-коррекция после умножения
Процессор: 8086+
Флаги: Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Значения флагов OF, AF и CF не определены.
Комментарий: Команда AAM корректирует результат умножения неупакованных двоично-десятичных чисел, который находится в регистре AX после выполнения команды MUL, преобразовывая его в пару неупакованных двоично-десятичных чисел в регистрах AH и AL.
Ограничения: Нет
Примеры:
mov	al,05h
mov	bl,05h
mul	bl    	;AX=0019h
aam		;AX=0205h
Команда AAS
Синтаксис: AAS
Операнды: Нет
Назначение: ASCII-коррекция после вычитания
Процессор: 8086+
Флаги: Флаги CF и AF устанавливаются в 1, если произошел заем из AL в AH, в противном случае они равны нулю. Значения флагов OF, SF, ZF и PF не определены.
Комментарий: Команда AAS корректирует разность двух неупакованных двоично-десятичных чисел в регистре AL сразу после команды SUB или SBB. Если операция приводит к займу, регистр AH уменьшается на 1.
Ограничения: Нет
Примеры:
mov	ax,0101h
sub	al,06h	;AX=01FBh
aas		;AX=0005h