解决除法溢出的问题

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

 

转载于:https://www.cnblogs.com/gkp307/p/9928613.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值