解决除法溢出的问题

来源:互联网 发布:淘宝蜘蛛店 编辑:程序博客网 时间:2024/05/18 02:36

子程序描述:

名称:divdw

功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型

参数:

(ax)=dword 型数据的低16位

(dx)=dword型数据的高16位

(cx)=除数

返回结果:

(ax)=结果的低16位

(dx)=结果的高16位

(cx)=结果的余数

应用举例:1000000/10(F4240H/0AH)

结果:(dx)=0001H;(ax)=86A0H;(cx)=0

 

对算法公式的理解:

X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

 

assume cs:code
stack segment
dw 0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,9
mov ax,1000h
mov dx,0001h
mov cx,1h
call divdw
mov ax,4c00h
int 21h
divdw:
push ax        // 将原被除数的低位(86A0H)入栈;
mov ax,dx    //将原被除数的高位推到低位并使高位为0,即满足int(H/N)的条件
mov dx,0     
div cx
mov bx,ax   //第一次相除后,将除后的商(即最终结果的高位)保留到bx中,为int(H/N)*65536做准备
pop ax         //还原原被除数的低位,高位为第一次相除后的余数,满足rem(H/N)*65536+L
div cx           //第二次相除后,所得余数保存到cx中,再将先第一次相除所得的商(bx)结果保存到现结果的高位中
mov cx,dx   
mov dx,bx           
ret                      
code ends
end start