logo

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

Система команд 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

DAS

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

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

OF

DF

IF

TF

SF

ZF

AF

PF

CF

?

     

*

*

*

*

*

 

Код

Команда

Описание

Проц.

Пример

2F

DAS

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

8086

das

Описание:

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

Для корректного использования команды DAS обе тетрады исходных операндов предшествующей команды вычитания SUB или SBB должны иметь значения в диапазоне от 0 до 9 (BCD-цифры). В этом случае команда DAS корректирует результат вычитания в регистре AL таким образом, что он будет содержать правильное упакованное двоично-десятичное значение, соответствующее разности двух упакованных двоично-десятичных значений (из исходного содержимого AL вычитается операнд команды SUB или SBB). Если при вычитании происходит десятичный заем (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 после выполнения команды DAS устанавливаются в соответствии с результатом в регистре AL. Состояние флага EFLAGS.OF согласно технической документации производителей процессоров считается неопределенным, но по факту этот флаг сбрасывается во всех известных автору моделях процессоров.

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

mov AL,71H   ; AL = 0x71h
sub AL,44H   ; AL = 0x71h - 0x44h = 0x2Dh
das          ; AL = 0x27h
             ; CF = 0 - заем (перенос) является частью результата

Операция:

tmpCF = 0;

tmpAL = AL;

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

   THEN

      EFLAGS.AF = 1;

      AL = AL - 0x06;

      tmpCF = (AL < 0) OR EFLAGS.CF;

   ELSE EFLAGS.AF = 0;

FI;

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

   THEN

      AL = AL - 0x60h;

      tmpCF = 1;

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       Сервер радиолюбителей России - схемы, документация,

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