第十章实验10.2

本实验要实现32位除法结果不溢出(被除数32位,除数16位)


assume cs:code


code segment


start :
       mov ax , 4240H                            //参数1:被除数的低16位,放入ax
       mov dx , 000FH                           //参数2:被除数的高16位,放入dx
       mov cx , 0AH                               //参数3: 除数,放入cx
       call divdw                                    //调用函数 divdw,传入参数1,2,3


       mov ax , 4c00H
       int 21H


divdw:                                              //32位不溢出除法函数,函数中用到的局部变量保存在bx,si中,所以要先保存bx,si的原始值
       push bx
       push si


       mov bx , ax                             //将被除数的低16位保存到局部变量
       mov ax , dx                            //将被除数高位移到低位
       sub dx , dx                            //被除数高位清0
       div cx                                    //调用div指令进行32位除法运算,这个结果不会溢出,因为被除数的高16位现在为0
       mov si , ax                         //div的商保存在ax,因为接下来还要进行一次div,所以把这个商保存的局部变量,这个值实际上构成最终的商的高16位
       mov ax , bx                        //将原被除数的低16位还原到ax中
       div cx                                 //再次进行div调用,这回dx中保存的是第一次div后的余数,dx现在一定小于除数,所以这回的除法也不会溢出
       mov cx , dx                       //第二次div的余数构成最终的余数,保存到cx
       mov dx , si                       //最终的商的高位从局部变量还原回来,而最终的商的低16位就是第二次div的商,正好保存在ax中,不用改变


       pop si
       pop bx
       ret                                //函数返回


code ends
end start



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值