子程序2:解决除法溢出的问题
assume cs:code
code segment
start:
mov ax , 2h
mov dx , 2h
mov cx , 0ah
call divdw
mov ax , 4c00h
int 21h
;名称:divdw
;功能:进行不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
;X/N = int(H/N)*65536 +[rem(H/N)*65536+L]/N
divdw:
dataseg_divdw segment
db 100 dup(0) ;存放参数
db 100 dup(0) ;存放结果和中间变量
dataseg_divdw ends
push bx
push es
mov bx , dataseg_divdw
mov es , bx
mov es:[0] , ax ;L
mov es:[2] , dx ;H
mov es:[4] , cx ;N
mov dx , 0
mov ax , es:[2] ;计算 H/N , dx:ax / cx
div word ptr es:[4]
mov es:[100] , ax ;H/N的商放入对应字单元
这步执行完毕余数怎么处理了????直接省略了吗??
mov ax , es:[0];[rem(H/N)*65536+L]/N ren是余数???这一步不是把L的值放入AX吗
div word ptr es:[4]执行这一步时被除数是AX还是扩展后的DX:AX。。。。如果是 DX:AX可以从那里知道?这里是我不明白的地方。
mov es:[102] , ax ;结果ax
mov es:[104] , dx ;结果cx
mov dx , es:[100]
mov ax , es:[102]
mov cx , es:[104]
pop bx
pop es
ret
code ends
end start |