Сборник по задачам и примерам Assembler

Сложение неупакованных BCD-чисел (макрокоманда)



Сложение неупакованных BCD-чисел (макрокоманда)

add_bcdmacro summand_i.1en_l,summand_2.1 en_2,sum local ml.m2.m3

:add_bcd summand_1.1en_l,summand_2.1en_2.sum - макрокоманда

:сложения неупакованных BCD-чисел размером 1еп_1 и len_2

:байт и помещение результата в sum.

:Вход: summand_i и summand_2 - адреса младших байтов

хлагаемых; 1еп_1 и 1еп__2 - длины слагаемых в байтах.

;Выход: sum - адрес младшего байта поля суммы. Желательно.

:чтобы это поле имело длину на единицу больше, чем длина

:самого длинного слагаемого.

;Порядок следования байт - младший байт по младшему адресу (Intel).

push si

push bx



mov ax.len_l

cmp ax.len_2

jna m2

mov cx,len_l ;длина большего для сложения (см. ниже)

push ex

mov cx,len_2 ;длина меньшего для сложения (см. ниже)

push ex

mov cx.ax

lea bx.summand_l :адрес большего источника для сложения

lea si,summand_2 :адрес меньшего источника для movsb

jmp m3

т2: mov сх.1еп_2 :длина большего для сложения (см. ниже)

push ex

mov cx.len_l ;длина меньшего для сложения (см. ниже)

push ex

mov cx.len_2

lea bx.summand_2 ;адрес большего источника для сложения

lea si.summand_l :адрес меньшего источника для movsb m3: заполняем sum нулями - длина определена выше:

eld

хог al.al

lea di. sum rep stosb ;пересылка меньшего (по длине) BCD-числа в sum:

eld

push ds

pop es

lea di. sum :адрес источника см. выше

pop сх ;длина была определена выше и соотв. меньшему ВСО-числу rep movsb

pop сх ;дикл по большему

хог si,si

ml: mov al.[bx][si]

adc al, sum[si]

aaa

mov sum[si].al

inc si

loop ml

adc sum[si].O

pop bx

pop si

endm

Макрокоманда обрабатывает байты, исходя из предположения, что младший байт слагаемых находится по младшему адресу. Слагаемые необязательно имеют одинаковую длину, но сумма должна иметь размер поля на единицу больше, чем длина самого длинного слагаемого. В начале процесса сложения в поле результата помещается меньшее (по длине) слагаемое.

Нам понадобится и другой вариант этой команды — addbedr, который обрабатывает операнды с порядком следования байтов — старший байт по младшему адресу.



Содержание раздела