Иллюстрированный самоучитель по задачам и примерам Assembler

Упакованные 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.