Цель настоящей работы – знакомство с форматами представления десятичных чисел, упакованным и неупакованным BCD-форматами, освоение команд десятичной коррекции.
ОСНОВНЫЕ СВЕДЕНИЯ
Форматы представления десятичных чисел
Упакованные BCD-числа хранятся по две цифры в байте в виде четырехбитовых групп, называемых тетрадами, причем каждая тетрада представляет собой двоичную комбинацию, соответствующую одной десятичной цифре, т.е. двоичное число в диапазоне 0000b – 1001b.
Неупакованное BCD-число содержит одну десятичную цифру в младшей тетраде байта, старшая тетрада должна быть нулевой, однако для команд сложения и вычитания содержимое старшей тетрады несущественно.
Команды десятичной коррекции упакованных чисел
Для упакованных десятичных чисел допустимы только операции сложения и вычитания. Каждая операция выполняется в два этапа.
На первом выполняется операция – сложение или вычитание (add, adc, sub, sbb) двух упакованных десятичных чисел, первое из которых должно находиться в регистре AL, на втором – десятичная коррекция результата в регистре AL (daa, das).
|
|
Рассмотрим подробнее одну из команд коррекции – daa, коррекция после сложения BCD-чисел.
После первого этапа – двоичного сложения правильных BCD-чисел возможно появление неправильного BCD-результата в двух ситуациях:
· получена недопустимая тетрада, т.е. тетрада, двоичный эквивалент которой больше 9;
· получена допустимая тетрада, но при сложении из нее возник двоичный перенос с весом 16, в то время как правильный вес единицы переноса должен быть равен 10.
Отметим, что перенос из младшей тетрады фиксируется флагом AF, а из старшей – CF.
Алгоритм выполнения команды daa состоит из двух шагов:
· если AF=1 или младшая тетрада регистра AL содержит запрещенную комбинацию, к содержимому AL прибавляется 06 и флаг AF устанавливается в 1;
· если CF=1 или старшая тетрада регистра AL содержит запрещенную комбинацию, к содержимому AL прибавляется 60h и флаг CF устанавливается в 1.
Например. Содержимое регистров AL=65h и BL=28h, что соответствует десятичным числам 65 и 28. Выполним их сложение
add AL, BL; AL=8Dh, AF=0, CF=0, ZF=0
daa; AL=93h, AF=0, CF=0, ZF=0
и вычитание
sub AL, BL; AL=3Dh, AF=1, CF=0, ZF=0
das; AL=37h, AF=1, CF=0, ZF=0
в комментариях показаны значения регистра AL и флагов после выполнения соответствующей команды.