Category : Assembly Language Source Code
Archive   : ASM_SUBR.ZIP
Filename : MBINMUL
; from BLUEBOOK OF ASSEMBLY ROUTINES FOR IBM PC & XT.
; page : 120
;
; NAME MBINMUL
;
; ROUTINE FOR Multidigit Binary Multiplication
;
; FUNCTION: This routine multiplies two multidigit binary numbers.
;
; INPUT: Upon entry DS:SI points to the first number; DS:DI points to
; the second number, and DS:BX points to the location where the result
; will be stored. The size of these multidigit numbers is controlled
; by the constant ISIZE. The input numbers contain 16*ISIZE number of
; bits and the output number has double that precision. Both inputs are
; stored in ISIZE number of 16-bit words of memory and the output is
; stored in 2*ISIZE number of 16-bit words of memory.
;
; OUTPUT: Upon exit DS:BX points to where the result is stored.
;
; REGISTERS USED: No registers are modified.
;
; SEGMENTS REFERENCED: Upon entry the data segment must contain
; storage for three multidigit numbers; two for input and one for output.
;
; ROUTINES CALLED: None
;
; SPECIAL NOTES: None
;
; ROUTINE TO MULTIPLY MULTIDIGIT BINARY NUMBERS
;
mbinmul proc far
;
push si ; save registers
push di
push bx
push cx
push ax
;
; clear result buffer
push bx ; save result pointer BX
mov ax,0 ; get a zero
mov cx,2*isize ; double precision for this number
cld ; forward direction
;
mbinmul1:
mov [bx],ax ; clear the 'digit'
inc bx ; point to next 'digit'
inc bx
loop mbinmul1 ; loop through all 'digitts'
pop bx ; store result pointer BX
;
mov cx,isize ; get the number of 16-bit 'digits'
;
mbnimul2:
push cx ; save counter from outter loop
mov dx,[si] ; get 'digit'' from 1st number
inc si ; point to next number
inc si
;
push bx ; save register during inner loop
push di
;
mov cx,isize ; get the number of 16-bit 'digits'
;
mbinmul3:
push cx ; save counter for inner loop
push dx ; save multiplier digit
mov ax,[di] ; get 'digit' from 2nd number
inc di ; point to next 'digit'
inc di
mul dx ; multiply
add [bx],ax ; add lower 'digit' to result
inc bx ; point to next 'digit'
inc bx
adc [bx],dx ; add upper part to result
pop dx ; restore multiplier
pop cx ; restore counter for inner loop
loop mbinmul3 ; loop through all 'digits' of second
;
pop di ; restore registers
pop bx
;
inc bx ; shift by on 'digit'
inc bx
pop cx ; restore counter for outer loop
loop mbinmul2 ; loop through all 'digits' of first
;
pop ax ; restore registers
pop cx
pop bx
pop di
pop si
ret
;
ret ; return
;
mbinmul endp
;-------------------------mbinmul routine ends---------------------------
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/