解决除法溢出问题
王爽汇编语言第二版实验10.2
一、实验要求
当用div指令进行8位除法运算时结果大于8位,或进行16位除法运算结果大于16位时,会出现除法溢出的错误。要求编写一个子程序,实现支持结果不会出现溢出的除法运算
二、算法概述
通过一个公式将可能产生溢出的运算X/N,转变为多个不会产生溢出的除法运算。公式中,等号右边的所有除法运算都可以用div指令来实现,并且不会产生除法溢出
公式:X/N = int(H/N)*65536 + [rem(H/N)*65536 + L]/N
X:被除数,范围:[0,FFFFFFFF]
N:除数,范围:[0,FFFF]
H:X的高16位
L:X的低16位
int():描述性运算符,取商
ram():描述性运算符,取余数
三、程序接口
名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
参数:(ax)=dword型数据的低16位
(dx)=dword型数据的高16位
(cx)=除数
返回:(ax)=商的低16位
(dx)=商的高16位
(cx)=余数
四、实现代码
divdw: ;子程序定义开始
push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
五、测试代码
assume cs:codesg,ss:stacksg
stacksg segment
dw 8 dup (0)
stacksg ends
codesg segment
start:
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
codesg ends
end start
六、测试结果
在执行后,测试除法命令的商为dx*16+ax,余数cx