问题描述:解决除法溢出的问题
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
参数:(ax)=dword型数据的低16位
(dx)=dword型数据的高16位
(cx)=除数
返回:(ax)=商的低16位
(dx)=商的高16位
(cx)=余数
公式:X/N = int(H/N)*65536+[rem(H/N)*65536+L]/N
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
注意:1.以cx存储除数,除数为16位,根据div使用,ax存储商,dx存储余数
2.公式解析:65536=10000H=2^16
格式中*65536意思是向左移16位,即移向高位。因此,int(H/N)为计算结果的高位,根据要求,结果存入dx。rem(H/N)*65536将高位运算中的余数放入低位运算中的高位上,即进行[rem(H/N)*65536+L]/N运算是
将rem(H/N)放入dx中,将L放入ax中的div运算。
结果:DX中存放int(H/N),AX中存放(rem(H/N)*65536+L)/N的商,CX中存放(rem(H/N)*65536+L)/N的余数
assume cs:code
code segment
start:
mov ax,4240H
mov dx,000FH
mov cx,0AH
call divdw
mov ax,4c00h
int 21h
;;解决除法溢出问题,注意入栈出栈顺序
divdw:
push ax ;将ax入栈,这样进行除法运算时,更改ax数值对后面ax计算没有影响
mov ax,dx
mov dx,0
div cx
mov bx,cx
mov cx,dx
mov dx,ax
pop ax
push dx ;将dx入栈,因为进行16位除数运算时,dx存储余数
mov dx,cx
div bx
mov cx,dx
pop dx
ret
code ends
end start
链接中文章讲得更清楚
http://www.cnblogs.com/cxjchen/archive/2013/03/19/2968824.html