;====================================================================
;子程序DIVDW功能;进行不会产生溢出的除法运算。
;====================================================================
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DB 'Welcome to masm!',0
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA ;初始化DS
MOV DS,AX
MOV AX,4240H
MOV DX,000FH
MOV CX,0AH
CALL DIVDW
MOV AX,4C00H
INT 21H
;-----------------------------------------------------------------
;名称:DIVDW
;功能:进行不会产生溢出的除法运算,被除数位dword型,除数为word型,
; 结果为dword型。
;参数:(AX)=dword型数据的低16位 ,(DX)=dword型数据的高16位 ,(CX)=除数
;返回:(AX)=结果的低16位 ,(DX)=结果的高16位 ,(CX)=余数
;应用的公式:X/N = INT(H/N)*FFFF + [REM(H/N)*FFFF+L]/N
;X=被除数(0~FFFFFFFF),N=除数(0~FFFF),H=X的高16位(0~FFFF),
;L=X的低16位(0~FFFF),INT():取商,REM():取余
DIVDW PROC NEAR
PUSH BX
PUSH CX
PUSH AX
MOV AX,DX ;把(DX)储存到AX中
MOV DX,0 ;(DX)置零
DIV CX ;16位除法,H/N,(AX)=商,(DX)=余数
MOV BX,AX ;把AX中高16位的结果转移到BX中
MOV AX,0 ;(DX)=REM(H/N)*FFFF高16位,(AX)=REM(H/N)*FFFF低16位=0
MOV CX,AX ;(CX)=REM(H/N)*FFFF低16位
POP AX ;(AX)=X的低16位
ADD CX,AX ;(CX)=REM(H/N)*FFFF+L的低16位
MOV AX,CX ;(AX)=REM(H/N)*FFFF+L的低16位
POP CX ;恢复除数N
DIV CX ;(AX)=结果的低16位,(DX)=结果的余数
MOV CX,DX ;(CX)=结果的余数
MOV DX,BX ;(DX)=结果的高16位
POP BX
RET
DIVDW ENDP
;-------------------------------------------------------------------
CODE ENDS
END START