Умножение BCD чисел (asm x86)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:59, 9 августа 2015.

Код программы:

;+----------------------------------------------------------------------+
;|Вход: u - адрес первого сомножителя.                                  |
;|      i - длина u.                                                    |
;|      v - адрес второго сомножителя.                                  |
;|      j - длина v.                                                    |
;|      w - адрес области длиной i+j байтов для помещения результата.   |
;|      Ь-256 - размерность машинного слова.                            |
;+----------------------------------------------------------------------+	
;| Выход: w - произведение размерностью i+j байтов.                     |
;+----------------------------------------------------------------------+	
;| Порядок следования байтов - младший байт по младшему адресу (Intel). | 
;+----------------------------------------------------------------------+

.data 
k          db	  0               ;перенос 0 <= k < 255
b          dw	 10               ;основание системы счисления
.code
mul_bcd    macro u. i. v. j. w
           local m2. m4. m6
           push	 si
;----------очистим w
           cld	
           push ds
           pop	es
           xor	al. al
           lea	di. w
           mov	cx. I + j
           rep	stosb
:m1
           xor  bx. bx           ;j=0..m-1
           mov	cx. j
m2:        push	cx               ;вложенные циклы
           cmp	v[bx], 0
           je	m6
:m3
           xor	si. si           ;i=0..n-1
           mov	cx. i
           mov	k. 0
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)-временная переменная
;----------корректируем результат - (ah)=цифра переноса (al)=результат
           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	cx
           loop	m2
           pop	si
endm