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