Коррекция результата сложения для представления в кодах ASCII и в упакованном десятичном формате (команды AAA и DAA ).

Как уже упоминалось, при выполнении сложения микропроцессор 8x86 рассматривает операнды как двоичные числа. Что же произойдет, если они будут двоично-десятичными кодами чисел (кратко десятичными или BCD-числа­ми)? Разберемся в этом на примере. При сложении упакованных BCD-чисел 26 и 55 микропроцессор 8x86 выполнит следующее двоичное сложение:

 

00100110 (BCD-число 26)

+01010101 (BCD-число 55)

01111011 (??)

Вместо правильного значения (BCD-число 81) мы получим результат, у которого старшая цифра 7, а младшая - шестнадцатеричная цифра В. Означает ли это, что нельзя складывать десятичные числа? Нет, это означает лишь то, что результат должен быть скорректирован для представления в десятичной форме.

Коррекция результата сложения десятичных чисел осуществляется командами ААА (ASCII adjust for addition - скорректировать результат сложения для представ­ления в кодах ASCII) и DAA (Decimal adjust for addition - скорректировать сложе­ние для представления в десятичной форме). В них не требуется наличия операн­да: предполагается, что корректируемое значение находится в регистре AL.

Команда ААА преобразует содержимое регистра AL в правильную неупакован­ную десятичную цифру в младших четырех битах регистра AL (и заполняет нуля­ми старшие четыре бита). Она используется в следующем контексте:

 

ADD AL,BL ;Сложить неупакованные числа, находящиеся в AL и BL

ААА ; и преобразовать результат в неупакованное число

Если результат превышает 9, то команда ААА добавляет 1 к содержимому регист­ра АН (чтобы учесть избыточную цифру) и полагает флаг CF равным 1; в против­ном случае она обнуляет флаг CF. Кроме того, команда ААА изменяет состояние флага AF и оставляет значения флагов PF, ZF, SF и OF неопределенными. Но так как в данном случае только флаг CF имеет смысл, то считайте значения остальных флагов уничтоженными.

Команда DAA преобразует содержимое регистра AL в две правильные упако­ванные десятичные цифры. Она используется в следующем контексте:

 

ADD AL,BL ;Сложить упакованные BCD-числа в AL и BL

DAA ; и преобразовать результат в упакованное число

Если результат превышает предельное значение для упакованных BCD-чисел (99), то команда DAA добавляет 1 к содержимому регистра АН и полагает флаг CF равным 1. Кроме того, команда DAA изменяет состояния флагов PF, AF, ZF и CF и оставляет значение флага OF неопределенным. Но так как в данном случае только флаг CF имеет смысл, то считайте остальные пять флагов уничтоженными.