汇编 解决除法溢出问题

389 阅读1分钟

实验十 编写子程序

解决除法溢出问题

问题
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)=余数