Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
DAA
Влияние команды на флаги и форматы команды:
? |
* |
* |
* |
* |
* |
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; (* недокументированнная операция *)
Замечание:
К командам двоично-десятичной арифметики относятся команды DAA, DAS, AAA, AAS, AAM, AAD.
В свою очередь, сами названные команды двоично-десятичной арифметики делятся на две подгруппы. Первая подгруппа команд предназначена для так называемой ASCII-коррекции, которая используется при непосредственной работе с данными в формате ASCII или в формате упакованных двоично-десятичных данных (неупакованный BCD-формат). Подгруппа включает команды AAA, AAS, AAM, AAD. Вторая подгруппа — это команды DAA и DAS — они предназначены для коррекции операций сложения и вычитания упакованных двоично-десятичных (упакованный BCD-формат).
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru