汇编语言 之 除法溢出问题

                                            汇编语言----除法溢出

这个暑假我一直再学习汇编语言,刚开始学的时候顺风顺水,一下子学好几章,可是在学到一大半后,我发现汇编语言可真是不好学了,每个问题都异常艰难,都得经过一番苦思冥想。。。。比如下面的这个除法溢出问题。

;应用举例:计算1000000/10(f4240h/0ah)

assume cs:code

code segment

start: mov ax,4240h

mov dx,000fh

mov cx,0ah

call divdw

 

mov ax,4c00h

int 21h

 

;名称:divdw

;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。

;参数:(ax)=dword型数据的低16位;

; (dx)=dword型数据的高16位;

; (cx)=除数。

;返回:(dx)=结果的高16位;

; (ax)=结果的低16位;

; (cx)=余数。

divdw:

push si

push bx

push ax

mov ax,dx

mov dx,0

div cx ;被除数的高位/cx,高位在ax,余数在dx

mov si,ax

pop ax

div cx ;(被除数高位的商+低位)/cx,高位在ax,余数在dx

mov cx,dx ;余数入cx

mov dx,si ;高位的商入dx

 

pop bx

pop si

ret

 

code ends

end start

下面是我思考后对这个程序的理解,希望对你们有些帮助。   

;关于防止除法溢出的算法分析
assume cs:code,ss:stack

stack segment
        db 8 dup(0)
stack ends

code segment
start: mov ax,4240h                            ;存放被除数的低十六位
       mov dx,000fh                            ;存放被除数的高十六位
       mov cx,0ah                              ;存放除数
     
    mov bx,stack                            ;将栈顶指针移到栈底
    mov ss,bx
    mov sp,8
   
    ;设计子函数的目标是不发生溢出,让dx存放商的高十六位,
    ;让ax存放商的低十六位,cx存放商
    call divdw
   
    mov  ax,4c00h
    int 21h
   
divdw: push si                                 ;引入这两个变量的目的是 1 将高位被除数移到底位
                                               ;2将高位的计算结果运用到第二步的低位被除数的除法运算中
       push di
      
    mov si,ax                               ;第一次除法的准备
    mov ax,dx
    xor dx,dx
      
    div cx
   
    mov di,ax                              ;把第一次的商先放到di中

    mov ax,si
    div cx
    mov cx,dx
    mov dx,di
    pop di
    pop di
    ret
   
code ends
end start

                                                       

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值