Коррекция результата вычитания для представления в кодах ASCII и в упакованном десятичном формате (команды AAS и DAS ).
При вычитании, как и при сложении, микропроцессор 8x86 рассматривает операнды как двоичные числа. Поэтому вычитание чисел, представленных в двоично-десятичном коде (BCD-чисел), может привести к неправильным результатам. Предположим, например, что надо вычесть BCD-число 26 из BCD-числа 55. Микропроцессор 8x86 выполнит двоичное вычитание следующим образом: дополнит до двух двоично-десятичное представление числа 26, а затем выполнит сложение:
0101 0101 (BCD-число 55)
+ 1101 1010 (дополнение до двух BCD-числа 26)
1 0010 1111 (??).
Вместо правильного значения (BCD-числа 29) мы получили результат, у которого старшая цифра 2, младшая цифра - шестнадцатеричная цифра F, и при этом бит переноса равен 1. Конечно, этот результат требует коррекции.
Коррекция результата вычитания двух десятичных чисел осуществляется командами AAS (ASCII adjust for substraction - скорректировать вычитание для представления в кодах ASCII) и DAS (Decimal adjust for substraction - скорректировать вычитание для представления в десятичной форме). При их исполнении предполагается, что корректируемое число находится в регистре AL.
Команда AAS преобразует содержимое регистра AL в правильную неупакованную десятичную цифру в младших четырех битах регистра AL (и обнуляет старшие четыре бита). Она используется в следующем контексте:
SUB AL,BL ; Вычесть BCD-число (содержимое BL) из AL
AAS ; и преобразовать результат в неупакованное число
Если результат превышает 9, то команда AAS вычитает 1 из содержимого регистра АН и полагает флаг CF равным 1, в противном случае она обнуляет флаг CF. Кроме того, команда AAS изменяет состояние флага AF и оставляет значения флагов PF, ZF, SF и OF неопределенными. Но так как в данном случае только флаг CF имеет смысл, то считайте значения остальных флагов уничтоженными.
Команда DAS преобразует содержимое регистра AL в две правильные упакованные десятичные цифры. Она используется в следующем контексте:
SUB AL,BL ;Вычесть упакованное BCD-число(содержимое) BL из AL
DAS ; и преобразовать результат в упакованное число
Если результат превышает предельное значение для упакованных BCD-чисел (99), то команда DAS вычитает 1 из содержимого регистра АН и полагает флаг CF равным 1; в противном случае она обнуляет флаг CF. Кроме того, команда DAS изменяет состояния флагов PF, AF, ZF и SF, а значение флага OF оставляет неопределенным. Но так как в данном случае только флаг CF имеет смысл, то считайте остальные упомянутые флаги уничтоженными.