8086_除法溢出

公式来源于王爽老师汇编语言一书

公式如下:    X/n=int(H/n)*65536+[rem(H/n)*65536+L]/n

X[0,FFFFFFFF] 被除数

n[0,FFFF] 除数   CX

H[0,FFFF] 高16位  DX

L[0,FFFF] 低16位 AX

总结一下就是简单强大,将一个除法运算转化成二个不会造成溢出的除法运算,关键就是二次不溢出,那么就可以第一次除法的商左移16位,第二次除法运算的商数就是低16位的值,余数就是X/N的余数.

1,int(H/n)*65536 

相当于:

mov bx,ax   ;低16位转存

mov ax,dx  

mov dx,0

div cx

因为第二个除法不会造成溢出,所以这步得出的商就是最后高16位的商值,可以将商AX转存或入栈

2,[rem(H/n)*65536+L]/n

第一步运算得出的余数在DX中,那么直接用第一步中存入BX中的值存入AX中,就是rem(H/n)*65536+L了

 

具体代码摘自网上:

;*************************************************
;计算参数:
;ax=被除数低16位
;dx=被除数高16位
;cx=除数
;计算结果返回参数:
;ax=结果商的低16位
;dx=结果商的高16位
;cx=结果的余数
;*************************************************
divdw:push bx
      mov bx,ax
      mov ax,dx
      mov dx,0
      div cx
      push ax
      mov ax,bx
      div cx
      mov cx,dx
      pop dx
      pop bx
      ret

 

;*************************************************
;计算参数:
;进入子程序时,栈顶IP,后面依次被除数低16位,高16位,除数
;计算结果返回参数:
;被除数低16位,高16位存放商高16位,低16位
;除数位存放余数
;*************************************************
divdw:
   push bp
   mov bp,sp
   
   mov ax,[bp+6]
   mov dx,0
   div word ptr [bp+8]
   
   mov bx,ax
   
   mov ax,[bp+4]
   div word ptr [bp+8]
   
   mov [bp+8],dx
   mov [bp+6],bx
   mov [bp+4],ax
     
   pop bp
      ret

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值