汇编语言除法公式溢出问题

汇编语言 除法公式溢出问题

当且仅当 H(高16位) ≤ ( n - 1 ) 时 才不会溢出 即
( H * 65536 ) / n + L / n ≤ 65535( 商) + ( n - 1 ) 余数 0FFFFH = 65536
通俗的讲就是高16位不能大于等于除数
=》 (n-1) * 65536 / n + L/n ≤ 65534 + n
=》 (n-1) * 65536 + L ≤ 65534 n + n * n
=》 65536n - 65536 + L ≤ 65534 n + n * n
=》 L ≤ n * n - 2n + 65536
=》 L ≤ n * n - 2n + 1 + 65535
=》 L ≤ (n-1)*(n-1) + 65535
L 为低16位 所以 L ≤ 65535 所以上式一定成立

反向证明 当高16位大于除数n时必然会溢出
( (dx) * 65536 +(ax) ) / n ≥ (dx) * 65536 / n + ax / n
= (dx) / n * 65536 + ax / n
≥ 1 * 65536
> 65535 = FFFF 所以必然溢出

所以可以用除以两次的方法来解决除法溢出问题
第一次
mov dx,0
mov ax,H ;H为高16位
mov cx,n
div cx ;ax中存商,dx存余数,余数必然是小于n,所以再次使用除法指令一定不会溢出(上面以证明了)

第二次
mov bx,ax ;将第一次的商放到bx中,第一的商也就是最总结果的高16位
mov ax,L ;L为低16位
div n ;这时候dx中数值为第一除法的余数且小于n,ax存商,dx存余数
mov cx,dx ;余数放到cx中
mov dx,bx ;第一次的高16位放到dx中

-----最终结果 dx存商的高16位 ax存商的低16位 cx存余数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值