;名称:divdw
;功能:产生不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:ax存储着dword型数据的低16位,dx存储高16位,cx存储除数。返回后,dx中存储结果的高16位,ax中位低16位,cx为余数
;f4240h/0ah
assume cs:code,ds:data
data segment
dw 100 dup(0)
data ends
code segment
start:mov ax,data
mov ds,ax
mov dx,000fh
mov ax,4240h
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:mov ds:[0],ax
mov ds:[2],dx;0-1中为ax L,2-3中为dx H
mov ax,dx
div cl;现在al中为商,ah中为余数
mov dl,ah
mov dh,0
mov ah,0
mov ds:[4],ax
mov ds:[6],dx;4-5为商,6-7为余数,商乘以10000h+余数乘以10000h+低16位L 再除以除数
;观察可知,乘以10000h相当于左移4位
mov ax,ds:[0]
div cx;现在ax中存储的是商,dx存余数,(rem (h/n) *65536+L)/N,ax中为商,dx为余数
mov cx,dx
mov dx,ds:[4]
ret
code ends
end start
先来看运行结果:
功能得到了实现,现在来分析一下。题目中给了一个公式,具体的推导不多说,公式本身是X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
注意到H/N变成了八位除以八位,这所以实际上要把cx化为cl。
这里要注意数据之间的传递,一定要对照debug步步解析,ax,cx都是多处利用的。
而后再要注意的就是除法 乘法的运算。
16位的除法。被除数32位,高位dx,低位ax。结果ax为商,dx为余数
8位。被除数16位ax,结果al存商,ah存余数