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

     

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



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

sub_bcdmacro minuend.lenjn. deduction.len_d. difference local temp.ml.m2.exit_m

:sub_bcd minuend".len_m.deduction,len_d.difference -макрокоманда вычитания неупакованных BCD-чисел размером ;len_m и len_d байт и помещение результата в difference. ;Вход: minuend и deduction - адреса младших байтов уменьшаемого и вычитаемого: len_m и len_d - длины уменьшаемого и вычитаемого в байтах.

;Выход: difference - адрес младшего байта поля разности. :Длина поля difference должна быть не меньше длины :уменьшаемого.

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

push si

.¦копируем уменьшаемое в difference:

push ds

pop es

eld

lea si.minuend

lea di.difference

mov cx.lenjn



push ex rep movsb

jmp ml ;копируем вычитаемое во врем, область temp:

temp db len_m dup (0)

ml: lea si .deduction

lea di,cs:temp

mov cx.len_d

push cs

pop es rep movsb

xor si.si

pop ex

m2: mov al,minuend[si]

sbb al,cs:temp[si]

aas

mov difference[si].al

inc si

1oop m2

jc m3 :на обработку заема из старшего разряда

jmp exit_m m3: пор exitjn:

pop si

end

Макрокоманда учитывает возможный заем из старших разрядов.

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



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