You're getting divide overflow because the quotient doesn't fit within a 16 bit integer.
You can split up the dividend into upper and lower halves to produce up to a 32 bit quotient and 16 bit remainder. The remainder of dx = 0000 : ax = upper_dividend / divisor
becomes the upper half of 2nd dividend for the 2nd division, so the 2nd division calculates dx = remainder : ax = lower_dividend / divisor
, neither of which can't overflow because the remainder is strictly less than the divisor. This process can be extended for longer dividends and quotients, one step per word of dividend and quotient, with the remainder of each divide step becoming the upper half of the partial dividend for the next step.
Example using MASM syntax:
dvnd dd 859091
dvsr dw 11
; ...
; bx:ax will end up = quotient of dvnd/dvsr, dx = remainder
mov di,dvsr
xor dx,dx
mov ax,word ptr dvnd+2 ;ax = upr dvnd
div di ;ax = upr quot, dx = rmdr
mov bx,ax ;bx = upr quot
mov ax,word ptr dvnd ;ax = lwr dvnd
div di ;ax = lwr quot, dx = rmdr
example for quad word:
dvnd dq 0123456789abcdefh
dvsr dw 012h
quot dq 0
rmdr dw 0
; ...
mov di,dvsr
xor dx,dx ;dx = 1st upr half dvnd = 0
mov ax,word ptr dvnd+6 ;ax = 1st lwr half dvnd
div di ;ax = 1st quot, dx = rmdr = 2nd upr half dvnd
mov word ptr quot+6,ax
mov ax,word ptr dvnd+4 ;ax = 2nd lwr half dvnd
div di ;ax = 2nd quot, dx = rmdr = 3rd upr half dvnd
mov word ptr quot+4,ax
mov ax,word ptr dvnd+2 ;ax = 3rd lwr half dvnd
div di ;ax = 3rd quot, dx = rmdr = 4th upr half dvnd
mov word ptr quot+2,ax
mov ax,word ptr dvnd ;ax = 4th lwr half dvnd
div di ;ax = 4th quot, dx = rmdr
mov word ptr quot,ax
mov rmdr,dx
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…