logo

Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

AAA

ASCII коррекция после сложения

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

?

     

?

?

*

?

*

 

Код

Команда

Описание

Проц.

Пример

37

AAA

ASCII коррекция AL после сложения

8086

aaa

Описание:

Команда AAA относится к группе команд двоично-десятичной арифметики (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;

Особые ситуации защищенного режима:

Intel386 … :
#UD при использовании префикса LOCK.

Особые ситуации режима реальной адресации:

Intel386 … :
#UD при использовании префикса LOCK.

Особые ситуации режима V86:

Intel386 … :
#UD при использовании префикса LOCK.

Замечание:

К командам двоично-десятичной арифметики относятся команды DAA, DAS, AAA, AAS, AAM, AAD.

В свою очередь, сами названные команды двоично-десятичной арифметики делятся на две подгруппы. Первая подгруппа команд предназначена для так называемой ASCII-коррекции, которая используется при непосредственной работе с данными в формате ASCII или в формате упакованных двоично-десятичных данных (неупакованный BCD-формат). Подгруппа включает команды AAA, AAS, AAM, AAD. Вторая подгруппа — это команды DAA и DAS — они предназначены для коррекции операций сложения и вычитания упакованных двоично-десятичных (упакованный BCD-формат).

В процессорах 8086/8088 и 80186/80188 реализация команд AAA, AAS была не вполне корректной, что дополнительно способствовалу тому, что их и использовали достаточно редко.


Входит в группу команд: Базовая система команд CPU


Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники