解决除法溢出的问题
名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax)=dword型数据的低16位
(dx)=dword型数据的高16位
(cx)=除数
返回:
(dx)=结果的高16位,(ax)=结果的低16位
(cx)=余数
应用举例:计算1000000/10(F4240H/0AH)
提示
给出一个公式:
X:被除数,范围:[0, FFFFFFFF]
N:除数,范围:[0, FFFF]
H:X高16位,范围:[0, FFFF]
L:X低16位,范围:[0, FFFF]
int():描述性运算符,取商,比如,int(38/10) =3
rem():描述性运算符,取余数,比如,rem(38/10)= 8
公式:X/N = int(H/N) * 65536 +[rem(H/N) * 65536 + L] / N
这个公式将可能产生溢出的除法运算:X/N,转变为多个不会产生溢出的除法运算。公式中,等号右边的所有除法运算都可以用div指令来做,肯定不会导致除法溢出。
assume cs:code
code segment
start:
mov ax, 4240H
mov dx, 000FH
mov cx, 0AH
call divdw
mov ax, 4c00h
int 21h
divdw:
push bx
push si
mov bx,ax
mov ax, dx
mov dx, 0
div cx ;ax = int(H/N), dx = rem(H/N)
mov si, ax ;si = int(H/N), (dx) = rem(H/N) * 65536
mov ax, bx
div cx ;(rem(H/N) * 65536 + L) / N, ax保存的低16位商,(dx) = 余数
mov cx, dx
mov dx, si
pop si
pop bx
ret
code ends
end start