Упакованные BCD-числа
В отличие от неупакованных BCD-чисел, разработчики команд микропроцессора Intel весьма сдержанно отнеслись к проблеме обработки упакованных BCD-чисел. Существуют только две команды – DAA и DAS, которые поддерживают процесс сложения и вычитания упакованных BCD-чисел. Умножение и деление этих чисел не поддерживается вовсе.
По этой причине при необходимости выполнения арифметических вычислений с упакованными BCD-числами есть смысл предварительно преобразовывать их в неупакованное представление, выполнять необходимые действия, результат которых конвертировать (если нужно) обратно в упакованный вид. Так как действия по преобразованию не являются основными в процессе вычислений, то желательно, чтобы они были максимально быстрыми. Можно предложить много вариантов подобного преобразования. Рассмотрим один из них.
Преобразование упакованного BCD-числа размером N байт в неупакованное BCD-число (макрокоманда)
BCD_PACK_TO_UNPACK macro PACK.N. UNPACK local cycl ;BCD_PACK_TO_UNPACK PACK,N.UNPACK – макрокоманда преобразования ; упакованного BCD-числа размером N байт в неупакованное BCD-число размером N*2 байт ;Порядок следования байтов – младший байт по младшему адресу:(Intel). сохраняем регистры… push ds pop es mov ecx.N eld;порядок обработки BCD-цифр – начиная с младшей lea edi.UNPACK lea esi.PACK cycl: xorax.ax lodsb;загрузить очередные 2 упакованные BCD-цифры из PACK в al rol ах.4 rol ah.4 stosw loop cycl восстанавливаем регистры… endm
Преобразование неупакованного BCD-числа размером N байт в упакованное BCD-число (макрокоманда)
ВС D_U N РАС К_ТО_РАСК macro UNPACK.N,PACK local cycl :BCD_UNPACK_TO_PACK UNPACK,N.PACK – макрокоманда преобразования неупакованного iBCD-числа"размером N байт в упакованное BCD-число. ;Порядок следования байтов – младший байт по младшему адресу;(Intel). сохраняем регистры… push ds pop es mov ecx.N :определяем N/2 (размерность PACK) – если нечетное, юкругляем в большую сторону shr ecx.l;делим на 2 bt есх.О jc $+4 setc b1 inc есх добавляем 1 для округления в больщую сторону предыдущие три команды можно заменить одной : adcecx.O:теперь в есх правильное значение сч. цикла в соответствии с размерностью UNPACK eld порядок обработки BCD-цифр – начиная с младшей lea edi.PACK lea esi.UNPACK cycl: xorax.ax загрузить очередные 2 неупакованные BCD-цифры из UNPACK в ах lodsw rol ah,4 rol ax,4 stosb loop cycl emp. 0 jne $+7 and byte ptr [edi-1].OfOh восстанавливаем регистры… endm