实验十 编写子程序
解决除法溢出问题
问题
div 指令可以做除法。当进行8位除法的时候,用 al 存储结果的商,ah 存储结果的余数;进行16位除法的时候,用 ax 存储结果的商,dx 存储结果的余数。可是,现在有一个问题,如果结果的商大于 al 或 ax 所能存储的最大值,那么将如何?
当被除数为32位,除数为16位并且除数很小时,所得到的商可能超过16位的 ax
举个例子:计算1000000/10 (F4240H/0AH)
先规定:
int():描述性运算符,取商,比如,int(38/10) = 3 rem():描述性运算符,取余数,比如,rem(38/10) = 8
公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
下图为公式简单证明:
代码:
assume cs:code
code segment
start: mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw: mov si,ax ;;将低位先存起来
mov ax,dx ;;先处理高位
mov dx,0 ;;cx是16位,被除数高位置零
div cx ;;除以0ah
push ax ;;将高位商压栈
mov ax,si ;;处理低位,此时dx里存着高位余数
div cx ;;低位商存在ax中,余数在dx中
mov cx,dx ;;余数转移到cx中
pop dx ;;将高位商出栈
ret
code ends
end start
最后debug可知 => (dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数