Корректировка регистра AL после сложения.
AAA - Корректировка регистра AL после сложения
Корректирует сумму двух распакованных значений BCD для создания результата распаковки BCD. Регистр al является подразумеваемым исходным и целевым операндом для этой инструкции. Инструкция aaa полезна только тогда, когда она следует за инструкцией add, которая добавляет (двоичное сложение) два распакованных значения BCD и сохраняет результат в байтах в регистре al. Затем инструкция aaa корректирует содержимое регистра al таким образом, чтобы оно содержало правильный 1-значный распакованный BCD результат.
Если при сложении получается десятичный перенос, регистр ah увеличивается на 1, и устанавливаются флаги CF и AF. Если десятичного переноса не было, флаги CF и AF снимаются, а регистр ah остаётся неизменным. В любом случае биты с 4 по 7 регистра al сбрасываются до 0.
Флаги AF и CF устанавливаются в 1, если корректировка приводит к переносу десятичной дроби; в противном случае они сбрасываются до 0. Флаги OF, SF, ZF и PF не определены.
Предположим, что регистр al содержит 510, (0516), регистр bl содержит 710, (0716). После выполнения add al, bl регистр al будет содержать 1210, (0С16). Затем выполняется инструкция aaa которая корректирует содержимое регистра al и в результате регистр ax содержит 010216. 5 + 7 = 12.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- code segment public _______; Начало сегмента кода
- ____assume cs:code
- ____main proc _____________; Начало процедуры main
- ________mov_____al, 5______; Копируем значение 5 в регистр al
- ________mov_____bl, 7______; Копируем значение 7 в регистр bl
- ________add_____al, bl_____; К регистру al прибавляем значение в регистре bl
- ________aaa________________; Выполняем корректировку содержимого регистра al
- ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
- ________int_____21h _______; Вызываем прерывание DOS
- ____main endp _____________; Конец процедуры main
- code ends _________________; Конец сегмента кода
- end main __________________; Конец файла. Точкой входа указывается процедура main
В качестве примера рассмотрим случай, когда нам нужно сложить (17 + 6 + 9). Затем выведем результат сложения на экран.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- code segment public _______; Начало сегмента кода
- ____assume cs:code
- ____main proc _____________; Начало процедуры main
- ________mov_____ax, 0107h__; Копируем распакованное значение 17 в регистр ax
- ________add_____al, 6______; К регистру al прибавляем значение 6
- ________aaa________________; Выполняем корректировку содержимого регистра al
- ________add_____al, 9______; К регистру al прибавляем значение 9
- ________aaa________________; Выполняем корректировку содержимого регистра al
- ________mov_____bx, ax_____; Сохраняем значение регистра ax в регистре bx
- ________or______bx, 3030h__; Выполняем преобразование значения в регистре bx в ASCII число
- ________mov_____ah, 02h____; Копируем значение функции вывода на консоль в регистр ah
- ________mov_____dl, bh_____; Копируем ASCII-число из регистра bh в регистр dl
- ________int_____21h________; Вызываем прерывание DOS
- ________mov_____dl, bl_____; Копируем ASCII-число из регистра bl в регистр dl
- ________int_____21h________; Вызываем прерывание DOS
- ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
- ________int_____21h _______; Вызываем прерывание DOS
- ____main endp _____________; Конец процедуры main
- code ends _________________; Конец сегмента кода
- end main __________________; Конец файла. Точкой входа указывается процедура main