;*******************************
;*******无符号数五字节除以三字节除法
;*******被除数在R0R1R2R3R4中,除数在R5R6R7中
;*******OV=0时商在R0R1R2R3R4中,余数在R5R6R7中;OV=1溢出
;*******影响PSW,A,B,R0-R7,5字节存储器
;*******堆栈2字节
TEMP0 EQU 30H
TEMP1 EQU 31H
TEMP2 EQU 32H
TEMP3 EQU 33H
TEMP4 EQU 34H
TEMP5 EQU 35H
TEMP6 EQU 36H
TEMP7 EQU 37H
DIV53: CLR A
MOV TEMP0,A ;余数(TEMP0-2)初始化为零
MOV TEMP1,A
MOV TEMP2,A
MOV B,#40 ;设定移位次数
MOV A,R7 ;检查除数是否为零
JNZ DIV530
MOV A,R6
JNZ DIV530 ;非零,可计算
MOV A,R5
JNZ DIV530 ;非零,可计算
SETB OV ;是零,溢出
RET
DIV530: CLR C ;被除数和部分商左移
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,TEMP2 ;余数(TEMP0-2)左移
RLC A
MOV TEMP2,A
MOV A,TEMP1
RLC A
MOV TEMP1,A
MOV A,TEMP0
RLC A
MOV TEMP0,A
MOV F0,C ;保护余数溢出位
CLR C
MOV A,TEMP2
SUBB A,R7 ;计算(TEMP012-R5R6R7)
MOV TEMP4,A ;低字节差暂存至TEMP4
MOV A,TEMP1
SUBB A,R6
MOV TEMP3,A ;中字节差暂存至TEMP3
MOV A,TEMP0
SUBB A,R5
ANL C,/F0 ;结果判断
JC DIV531 ;不够减,余数不变
MOV TEMP0,A ;够减,存放新的余数
MOV A,TEMP3
MOV TEMP1,A
MOV A,TEMP4
MOV TEMP2,A
INC R4 ;商的低位加一
DIV531: DJNZ B,DIV530 ;计算完40位商(R0R1R2R3R4中)
MOV A,TEMP2 ;余数移到R5R6R7
MOV R7,A
MOV A,TEMP1
MOV R6,A
MOV A,TEMP0
MOV R5,A
CLR OV ;置计算成功标志
RET
;******************************* |