102 lines
3.0 KiB
NASM
102 lines
3.0 KiB
NASM
|
; int _DivUnsArrByUns(a, c, n)
|
||
|
;
|
||
|
; ARGUMENT
|
||
|
; unsigned a[] n-word number to divide
|
||
|
; unsigned c number of divide by
|
||
|
; int n number of digits
|
||
|
;
|
||
|
; DESCRIPTION
|
||
|
; Divides n-digit number c by b, storing result in c.
|
||
|
; The (positive) remainder is calculated and returned.
|
||
|
;
|
||
|
; SIDE EFFECTS
|
||
|
; None.
|
||
|
;
|
||
|
; RETURNS
|
||
|
; Remainder.
|
||
|
;
|
||
|
; AUTHOR
|
||
|
; Jared Levy 7/9/89
|
||
|
; Copyright (C) 1989-90 Greenleaf Software Inc. All Rights Reserved.
|
||
|
;
|
||
|
; MODIFICATIONS
|
||
|
;
|
||
|
;
|
||
|
;
|
||
|
include model.h
|
||
|
include prologue.h
|
||
|
include gm.equ
|
||
|
|
||
|
pseg dmby1
|
||
|
cproc _DivUnsArrByUns,,_dmby1
|
||
|
|
||
|
; load parameters
|
||
|
if _LDATA
|
||
|
push es
|
||
|
les di, parm1_ ; get pointer to source & destination
|
||
|
mov cx, parm3_ ; get number to divide by
|
||
|
mov bx, parm4_ ; get number of digits
|
||
|
else
|
||
|
mov di, parm1_ ; get pointer to source & destination
|
||
|
mov ax, ds
|
||
|
mov es, ax
|
||
|
mov cx, parm2_ ; get number to divide by
|
||
|
mov bx, parm3_ ; get number of digits
|
||
|
endif
|
||
|
call near ptr dmby1a
|
||
|
if _LDATA
|
||
|
pop es
|
||
|
endif
|
||
|
cproce
|
||
|
|
||
|
; the computation routine is separate so it may be called from assembly
|
||
|
dmby1a:
|
||
|
dec bx ; digits go from 0 to n-1
|
||
|
sal bx, 1 ; want bytes rather than words
|
||
|
|
||
|
;/* skip initial zeroes */
|
||
|
; for(;(q>0)&&(c[q-1]==0);q--);
|
||
|
;
|
||
|
; if (q == 0)
|
||
|
; return(0);
|
||
|
; q--; /* q will be used for subscript */
|
||
|
zeroloop:
|
||
|
mov ax, word ptr es:[di+bx] ; get digit
|
||
|
cmp ax, 0 ; is digit zero?
|
||
|
jne nonzero ; if non-zero, begin divide
|
||
|
dec bx ; next word
|
||
|
dec bx
|
||
|
cmp bx, 0 ; last digit?
|
||
|
jge zeroloop ; if not, process next digit
|
||
|
xor ax, ax ; otherwise, remainder 0
|
||
|
jmp short exit1 ; && division through (0/c=0)
|
||
|
|
||
|
; bl = (unsigned long) b;
|
||
|
; while (q>=0) {
|
||
|
; k = (unsigned long *) &r[q];
|
||
|
; cl = *k / bl;
|
||
|
; c[q] = (unsigned) cl;
|
||
|
; r[q] = (unsigned) (*k - cl * bl);
|
||
|
; q--;
|
||
|
; }
|
||
|
nonzero:
|
||
|
xor dx,dx ; high word zero in first divide
|
||
|
divloop:
|
||
|
div cx ; divide digit
|
||
|
mov word ptr es:[di+bx], ax ; store quotient digit
|
||
|
cmp bx, 0 ; last digit?
|
||
|
je exit2 ; if so, division complete
|
||
|
dec bx ; next digit
|
||
|
dec bx
|
||
|
mov ax, word ptr es:[di+bx] ; get digit
|
||
|
jmp short divloop ; process digit
|
||
|
|
||
|
exit2:
|
||
|
mov ax, dx ; return remainder
|
||
|
exit1:
|
||
|
ret
|
||
|
|
||
|
endps
|
||
|
end
|
||
|
|