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

     

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



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

.data

k db 0 :перенос 0 < к < 255

b dw 10 ;основание системы счисления

.code

mul_bcdmacro u.i.v.j.w *

local m2.m4.m6

:mul_bcd u.i.v.j.w - макрокоманда умножения неупакованных
:BCD-чисел u и v размером i и j байт и помещение результата

:в w.

;Вход: и - адрес первого множителя; i - длина u: v - адрес

;второго множителя: j - длина v: w - адрес области

:размерностью i+j байт, куда необходимо поместить

:произведение: Ь=256 - размерность машинного слова.



:Выход: w - произведение размерностью i+j байт.

:Порядок следования байтов - младший байт по младшему адресу

:(Intel).

:сохраним регистры

push si

:очистим w

eld

push ds

pop es

xor al.al

lea di ,w

mov ex,i+j

rep stosb

xor bx.bx ;j=0..m-l

mov CX.j

m2: push ex : вложенные циклы

CiTlp v[bx].O '

je тб

:m3

xor si,si :1=0..n-1

mov cx.i

mov k.O

m4: mov al,u[si]

mul v[bx]

xor dx.dx

mov dl.w[bx+si]

add ax.dx

xor dx.dx

mov dl ,k

add ax.dx ;t-(ax) -- временная переменная

:корректируем результат - (ап)-цифра переноса: ;(а1)=результат

aam

mov k.ah

mov w[bx+si].al

:m5

inc si

loop m4

mov al.k

mov w[bx+si],al

m6: inc bx

pop ex

loop m2

pop si

endm

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



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