您的位置:首页 > 其它

汇编语言 之 除法溢出问题

2013-08-16 16:47 525 查看

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

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

;应用举例:计算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

                                                       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息