王爽汇编语言第三版实验10编写子程序之二除法溢出

;名称:divdw
;功能:产生不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:ax存储着dword型数据的低16位,dx存储高16位,cx存储除数。返回后,dx中存储结果的高16位,ax中位低16位,cx为余数

;f4240h/0ah
assume cs:code,ds:data
data segment
dw 100 dup(0)
data ends
code segment
start:mov ax,data
      mov ds,ax
      mov dx,000fh
      mov ax,4240h
      mov cx,0ah
      call divdw
      mov ax,4c00h
      int 21h
      
divdw:mov ds:[0],ax
      mov ds:[2],dx;0-1中为ax L,2-3中为dx H
      mov ax,dx
      div cl;现在al中为商,ah中为余数
      mov dl,ah
      mov dh,0
      mov ah,0
      mov ds:[4],ax
      mov ds:[6],dx;4-5为商,6-7为余数,商乘以10000h+余数乘以10000h+低16位L 再除以除数
      ;观察可知,乘以10000h相当于左移4位
      mov ax,ds:[0]
      div cx;现在ax中存储的是商,dx存余数,(rem (h/n) *65536+L)/N,ax中为商,dx为余数
      mov cx,dx
      mov dx,ds:[4]
      ret
      code ends
      end start
      




先来看运行结果:

 功能得到了实现,现在来分析一下。题目中给了一个公式,具体的推导不多说,公式本身是X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

注意到H/N变成了八位除以八位,这所以实际上要把cx化为cl。

这里要注意数据之间的传递,一定要对照debug步步解析,ax,cx都是多处利用的。

而后再要注意的就是除法 乘法的运算。

16位的除法。被除数32位,高位dx,低位ax。结果ax为商,dx为余数

8位。被除数16位ax,结果al存商,ah存余数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值