Справочник по языку Ассемблера IBM PC

DAS


(Decimal Adjust for Subtraction)

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

Схема команды:  das 

Назначение: коррекция упакованного результата вычитания двух BCD-чисел в упакованном формате.


Алгоритм работы:


команда das работает только с регистром al и анализирует наличие следующих ситуаций:

Ситуация 1. В результате предыдущей команды сложения флаг af =1 или значение младшей тетрады регистра al>9. Напомним, что для случая вычитания флаг af устанавливается в 1 в случае заема двоичной единицы из старшей тетрады в младшую тетраду регистра al. Наличие одного из этих двух признаков говорит о том, что значение младшей тетрады превысило 9h и его нужно корректировать.

Ситуация 2. В результате предыдущей команды сложения флаг сf =1 или значение регистра al>9fh. Напомним, что для случая вычитания флаг cf устанавливается в 1 в случае заема двоичной единицы. Наличие одного из этих двух признаков говорит о том, что значение в регистре al превысило 9fh.



Если имеет место одна из этих ситуаций, то регистр al корректируется следующим образом:

для ситуации 1 содержимое регистра al уменьшается на 6;

для ситуации 2 содержимое регистра al уменьшается на 60h;

если имеют место обе ситуации, то корректировка начинается с младшей тетрады.

Состояние флагов после выполнения команды (в случае, если были переносы):

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r 1 1

Состояние флагов после выполнения команды (в случае, если переносов не было):

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r 0 0

Применение:


Команду das следует применять после вычитания двух упакованных BCD-чисел с целью корректировки получающегося двоичного результата вычитания в правильное двузначное десятичное число. После команды das следует анализировать состояние флага cf. Если он равен 1, то это говорит о том, что был заем единицы в старший разряд и это нужно учесть в дальнейших действиях. Если у вычитаемого нет больше старших разрядов, то результат следует трактовать как отрицательное двоичное дополнение. Для определения его абсолютного значения нужно вычесть 100 из результата в al. Если у вычитаемого еще есть старшие разряды, то факт заема нужно просто учесть уменьшением младшего из этих оставшихся старших разрядов на единицу.

        mov     ah,08h  ;ah=08h         mov     al,05h  ;al=05h         add     al,ah   ;al=al+ah=05h+08h=0dh — не BCD-число         xor     ah,ah   ;ah=0         aaa             ;ah=01h,al=03h — результат скорректирован         

См. также: урок 8, Приложение 7 и команды , , , ,



Содержание раздела