王爽《汇编语言》实验10.2——解决除法溢出的问题

来源:互联网 发布:什么阅读软件最好 编辑:程序博客网 时间:2024/06/06 11:02

;====================================================================

;子程序DIVDW功能;进行不会产生溢出的除法运算。

;====================================================================

ASSUMECS:CODE,DS:DATA

 

DATASEGMENT

   DB'Welcome to masm!',0

DATAENDS

 

CODESEGMENT

START:

   MOVAX,DATA    ;初始化DS

   MOVDS,AX

   

   MOVAX,4240H

   MOVDX,000FH

   MOVCX,0AH

   CALL DIVDW

 

   MOVAX,4C00H

   INT21H

 

;-----------------------------------------------------------------

;名称: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():取余

DIVDWPROCNEAR

   PUSHBX

   PUSHCX

   PUSHAX

   MOVAX,DX  ;(DX)储存到AX

   MOVDX,0   ;(DX)置零

   DIVCX     ;16位除法,H/N,(AX)=,(DX)=余数

   MOVBX,AX  ;AX中高16位的结果转移到BX

   MOVAX,0   ;(DX)=REM(H/N)*FFFF16,(AX)=REM(H/N)*FFFF16=0

   MOVCX,AX  ;(CX)=REM(H/N)*FFFF16

   POPAX     ;(AX)=X的低16

   ADDCX,AX  ;(CX)=REM(H/N)*FFFF+L的低16

   MOVAX,CX  ;(AX)=REM(H/N)*FFFF+L的低16

   POPCX     ;恢复除数N

   DIVCX     ;(AX)=结果的低16,(DX)=结果的余数

   MOVCX,DX  ;(CX)=结果的余数

   MOVDX,BX  ;(DX)=结果的高16

   POPBX

   RET

DIVDWENDP

;-------------------------------------------------------------------

 

CODEENDS

END START

1 0