解决除法溢出的问题

子程序描述:

名称: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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值