Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
AAA
Влияние команды на флаги и форматы команды:
? |
? |
? |
* |
? |
* |
37 |
AAA |
ASCII коррекция AL после сложения |
8086 |
aaa |
Описание:
Команда AAA (ASCII Adjust After Addition) относится к группе команд двоично-десятичной арифметики (Binary-Coded Decimal, BCD) и позволяет преобразовать результат сложения двоично-десятичных данных в ASCII-формат. Для этого команда AAA должна выполняться после команды двоичного сложения ADD, которая помещает однобайтный результат в регистр AL.
Для корректного использования команды AAA младшая тетрада операнда предшествующей команды ADD должна быть в диапазоне от 0 до 9 (BCD-цифры). В этом случае команда AAA корректирует регистр AL таким образом, что он будет содержать правильную двоично-десятичную цифру, соответствующую результату сложения двух двоично-десятичных значений (исходного содержимого AL и операнда команды ADD). Если при сложении командой ADD происходит десятичный перенос (EFLAGS.AF = 1), то регистр AH увеличивается на единицу, а также устанавливаются флаги EFLAGS.CF и EFLAGS.AF. Если при этом же сложении в старшей тетраде регистра AL получилось значение 0xFh, тогда регистр AH увеличивается на единицу еще раз. Если при сложении десятичного переноса не возникло (EFLAGS.AF = 0), тогда сбрасываются флаги EFLAGS.CF и EFLAGS.AF, а регистр AH не изменяется. Во всех случаях старшая тетрада регистра AL обнуляется.
Для того, чтобы преобразовать содержимое регистра AL к ASCII-формату, необходимо после команды AAA выполнить команду OR AL,0x30h .
Сама по себе двоично-десятичная арифметика с преобразованием к ASCII-формату считалась устаревшей уже тогда, когда появились первые микропроцессоры. Эта методика предполагает использование для расчетов данных в ASCII-формате (в ASCII-формате цифрам 1, 2, 3, 4, ... соответствуют байт-коды 0x31h, 0x32h, 0x33h, 0x34h ...) и последующее получение результата также в ASCII-формате. Для сложения это выглядит следующим образом:
sub AH,AH ; очистка AH
mov AL,'6' ; AL = 0x36h
add AL,'8' ; AL = 0x36h + 0x38h = 0x6Eh
aaa ; AX = 0x0104h
or AL,30H ; AL = 0x34h = '4'
Операция:
IF ( (AL AND 0x0Fh) > 9) OR (EFLAGS.AF = 1) )
THEN
IF (Процессор Intel286, ...)
THEN AX = AX + 6;
ELSE AL = AL + 6;
FI;
AH = AH + 1;
EFLAGS.AF = 1;
EFLAGS.CF = 1;
ELSE
EFLAGS.AF = 0;
EFLAGS.CF = 0;
FI;
AL = AL AND 0Fh;
Замечание:
К командам двоично-десятичной арифметики относятся команды DAA, DAS, AAA, AAS, AAM, AAD.
В свою очередь, сами названные команды двоично-десятичной арифметики делятся на две подгруппы. Первая подгруппа команд предназначена для так называемой ASCII-коррекции, которая используется при непосредственной работе с данными в формате ASCII или в формате упакованных двоично-десятичных данных (неупакованный BCD-формат). Подгруппа включает команды AAA, AAS, AAM, AAD. Вторая подгруппа — это команды DAA и DAS — они предназначены для коррекции операций сложения и вычитания упакованных двоично-десятичных (упакованный BCD-формат).
В процессорах 8086/8088 и 80186/80188 реализация команд AAA, AAS была не вполне корректной, что дополнительно способствовалу тому, что их и использовали достаточно редко.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru