10.2 解决除法溢出的问题
给出的公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
参数: ax存放被除数低16 dx存放被除数高16 cx存放除数
分析:
*65536相当于进到高16位 rem(H/N)*65536不用算,因为算H/N的时候已经把这个结果算出来了,存放在dx,相当于只要计算H/N 和L/H
完整代码:
assume cs:code,ss:stack
stack segment
dw 10 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,20
mov ax,4240h
mov dx,0fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:
;X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
;分析 *65536相当于进到高16位 rem(H/N)*65536不用算,因为算h/n的时候已经把这个结果算出来了,存放在dx,相当于只要计算h/n 和l/n
;ax存放被除数低16 dx存放被除数高16 cx存放除数
push ax
mov ax,dx ;取出高16位
mov dx,0 ;被除数高16位置0,因为要计算H/N
div cx ;int()H/N 商结果存放ax,余数结果存放dx,一切都是那么的恰到好处
mov bx,ax ;存放结果
pop ax ;取出低16位
div cx ;L/N 商ax 余数dx
mov cx,dx ;存储余数
mov dx,bx ;存储低16位
ret
code ends
end start
实验10.3 数值显示
这里要用到前面的子程序showptr(显示以