logo

Главная Система команд x86 Базовая система команд CPU DAA

Система команд x86

Программирование - Архитектура и система команд микропроцессоров 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

DAA

Десятичная коррекция AL после сложения

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

OF

DF

IF

TF

SF

ZF

AF

PF

CF

?

     

*

*

*

*

*

 

Код

Команда

Описание

Проц.

Пример

27

DAA

Десятичная коррекция AL после сложения

8086

daa

Описание:

Команда DAA (Decimal Adjust AL after Addition) относится к группе команд двоично-десятичной арифметики (Binary-Coded Decimal, BCD) и позволяет получать результат сложения упакованных двоично-десятичных данных в таком же упакованном BCD-формате. Для этого команда DAA должна выполняться после команд двоичного сложения ADD или ADC, которые помещают однобайтный результат в регистр AL.

Для корректного использования команды DAA обе тетрады исходных операндов предшествующей команды сложения ADD или ADC должны иметь значения в диапазоне от 0 до 9 (BCD-цифры). В этом случае команда DAA корректирует результат сложения в регистре AL таким образом, что он будет содержать правильное упакованное двоично-десятичное значение, соответствующее результату сложения двух упакованных двоично-десятичных значений (исходного содержимого AL и операнда команды сложения ADD или ADC). Если при сложении происходит десятичный перенос (EFLAGS.AF = 1) или младшая тетрада результата операции в регистре AL имеет значение большее 9, то регистр AL увеличивается на 6, устанавливается флаг EFLAGS.AF, а флаг EFLAGS.CF корректируется (устанавливается или остается неизменным) по результату такого увеличения в регистре AL. Если же при сложении еще и в старшей тетраде регистра AL получилось значение большее 9 (то есть AL > 0x99h), тогда регистр AL увеличивается еще на 0x60h и устанавливается флаг EFLAGS.CF. Если при сложении десятичного переноса не возникло (EFLAGS.AF = 0) и младшая тетрада результата операции в регистре AL оказалась меньше 10 (AL and 0x0Fh ≤ 9), тогда перед проверкой старшей ттрады (как это описано выше) флаги EFLAGS.CF и EFLAGS.AF сбрасываются.

Флаги EFLAGS.PF, EFLAGS.ZF и EFLAGS.SF после выполнения команды DAA устанавливаются в соответствии с результатом в регистре AL. Состояние флага EFLAGS.OF согласно технической документации производителей процессоров считается неопределенным, но по факту этот флаг сбрасывается во всех известных автору моделях процессоров.

Двоично-десятичная арифметика с манипулированием упакованными BCD-данными предполагает использование для расчетов таких двоичных значений, у которых для представления десятичных цифр используются тетрады (четыре бита), то есть в одном байте, имеющем две тетрады, представляется две десятичных цифры. Для сложения это выглядит следующим образом:

mov AL,71H   ; AL = 0x71h
add AL,44H   ; AL = 0x71h + 0x44h = 0xB5h
daa          ; AL = 0x15h
             ; CF = 1 - перенос является частью результата 71 + 44 = 115

Операция:

tmpAL = AL;

IF ( ( (tmpAL AND 0x0F) > 0x09h ) or EFLAGS.AF = 1 )

   THEN

      tmpCF = ( (AL > 0xF9h) or EFLAGS.CF );

      AL = AL + 0x06h;

     EFLAGS.AF = 1;

   ELSE

     EFLAGS.AF = 0;

FI;

IF ( ( tmpAL > 0x99h ) or EFLAGS.CF = 1 )

   THEN

      AL = AL + 0x60h;

      tmpCF = 1;

   ELSE

     tmpCF = 0;

FI;

EFLAGS.CF = tmpCF;

EFLAGS.OF = 0; (* недокументированнная операция *)

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

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-формат).


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




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

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

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