根据公式: X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N
H=INT(X/65536);L=REM(X/65536)
我的程序是这样的:
assume
data segment
dw 0000000
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,4240H
mov dx,000fH '设置被除数'
mov cx,0aH '设置除数'
call divdw
mov ax,4c00H
int 21H
divdw:mov bx,65536
div bx '计算X/65536,AX中放商(既公式中的H),DX中放余数(既公式中的L)'
mov ds:[0],ax '将H放在DS:[0]内存单元'
mov ds:[2],dx '将L放在DS:[2]内存单元'
mov dx,0 '设置被除数,DX=0 高16位,AX低16位为H'
div cx '计算H/N,除数在CX中,计算后AX中为H/N的商,DX中为H/N的余数'
mov ds:[4],ax '将H/N的商放在DS:[4]内存单元'
mov ds:[6],dx '将H/N的余数放在DS:[6]内存单元'
mul bx '计算INT(H/N)*65536,结果的高16位放在DX中,低16位放在AX中'
mov ds:[8],dx '将INT(H/N)*65536结果的高16位放在DS:[8]内存单元'
mov ds:[a],ax '将INT(H/N)*65536结果的低16位放在DS:[A]内存单元'
mov ax,ds:[6] '将DS:[6]内存单元中的H/N的余数取出放在AX中'
mul bx '计算REM(H/N)*65536,结果的高16位放在DX中,低16位放在AX中'
mov ds:[c],dx '将REM(H/N)*65536结果的高16位放入DS:[C]内存单元'
mov ds:[e],ax '将REM(H/N)*65536结果的低16位放入DS:[E]内存单元'
add ax,ds:[2] '将REM(H/N)*65536与L相加,结果放在AX中'
mov ds:[e],ax
div cx '计算[REM(H/N)*65536+L]/N'
mov cx,dx '结果的余数放入CX中'
add ax,ds:[a] 'AX中放入结果的低16位'
mov dx,ds:[8] 'DX中放入结果的高16位'
ret
code ends
end start
这个程序我编译和连接都通过了,但是用DEBUG跟踪是会出现问题,得不到预想中的结果;
我分析了一下,在这个程序执行过中,
在 add ax,ds:[2]这条指令执行是参生了加法溢出,既REM(H/N)*65536与L相加后会参生溢出的情况(用DEBUG跟踪是看到的),但是附注的公式证明却证明了不会参生溢出情况;
还有一个问题是公式中的那个数65536 我觉得有点问题,65536刚好大于65535(FFFFH)既在BX中放不下;
请教各位该问题该如何解决啊 谢谢!! |