;片內RAM初始化子程序
IBCLR: MOV A,R0
MOV R1,A
CLR A
IBC1 : MOV @R1,A
INC R1
DJNZ R7,IBC1
RET
;片外RAM初始化子程序
EBCLR1: MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR C
EBC11: MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC11
RET
;片外RAM初始化子程序(雙字節個單元)
EBCLR2: MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
MOV A,R7
JZ EBC21
INC R6
EBC21: CLR A
MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC21
DJNZ R6,EBC21
RET
;內部RAM數據復制程序
;入口: R0,R7
;占用資源: A
;堆棧需求: 2字節
;出口: R1
IBMOV: MOV A,R0
ADD A,R7
MOV R0,A
MOV A,R1
ADD A,R7
MOV R1,A
IBM1 : DEC R0
DEC R1
MOV A,@R0
MOV @R1,A
DJNZ R7,IBM1
RET
;外部RAM數據復制程序
;入口: ADDPH,ADDPL,R7
;占用資源: ACC
;堆棧需求: 2字節
;出口: R0,R1
EBMOV1 : MOV A,ADDPL
ADD A,R7
MOV DPL,A
CLR A
ADDC A,ADDPH
MOV DPH,A
MOV A,R7
ADD A,R1
XCH A,R0
ADDC A,#00H
MOV P2,A
EBM11: DEC R0
CJNE R0,#0FFH,EBM12
DEC P2
EBM12: DEC DPL
MOV A,DPL
CJNE A,#0FFH,EBM13
DEC DPH
EBM13: MOVX A,@R0
MOVX @DPTR,A
DJNZ R7,EBM11
RET
;外部RAM數據復制程序
;入口: ADDPH,ADDPL,R6,R7
;占用資源: ACC
;堆棧需求: 2字節
;出口: R0,R1
EBMOV2 : MOV A,ADDPL
ADD A,R7
MOV DPL,A
MOV A,R6
ADDC A,ADDPH
MOV DPH,A
MOV A,R7
ADD A,R1
XCH A,R0
ADDC A,R6
MOV P2,A
MOV A,R7
JZ EBM21
INC R6
EBM21: DEC R0
CJNE R0,#0FFH,EBM22
DEC P2
EBM22: DEC DPL
MOV A,DPL
CJNE A,#0FFH,EBM23
DEC DPH
EBM23: MOVX A,@R0
MOVX @DPTR,A
DJNZ R7,EBM21
DJNZ R6,EBM21
RET
;外部RAM數據復制到內部RAM程序
;入口: ADDPH,ADDPL,R7
;占用資源: ACC
;堆棧需求: 2字節
;出口: R0
ITEMOV : MOV A,ADDPL
ADD A,R7
MOV DPL,A
MOV A,ADDPH
ADDC A,#00H
MOV DPH,A
MOV A,R0
ADD A,R7
MOV R0,A
ITEM1 : DEC R0
DEC DPL
MOV A,DPL
CJNE A,#0FFH,ITEM2
DEC DPH
ITEM2 : MOVX A,@DPTR
MOV @R0,A
DJNZ R7,ITEM1
RET
;限幅濾波程序
;入口: A,SDAT,DELTY
;占用資源: B
;堆棧需求: 2字節
;出口: A
JUGFILT : MOV B,A
CLR C
SUBB A,SDAT
JNC JUGFT1
CPL A
INC A
JUGFT1 : SETB A
SUBB A,#DELTY
JNC JUGFT3
MOV A,SDAT
RET
JUGFT3 : MOV A,B
MOV SDAT,A
RET
;中位值濾波程序
;入口: ADDPH,ADDPL,N
;占用資源: ESELSORT
;堆棧需求: 4字節
;出口: A
MEDFILT : LCALL ESELSORT
MOV A,N
CLR C
RRC A
ADD A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
JNC MEDFT1
INC DPH
MEDFT1 : MOVX A,@DPTR
RET
;N點算術平均濾波
;入口: ADDPH,ADDPL,N
;占用資源: B,R3,R4
;堆棧需求: 2字節
;出口: A
AVFILT : MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR A
MOV R3,A
MOV R4,A
MOV R7,N
AVFT1: MOVX A,@DPTR
INC DPTR
ADD A,R4
MOV R4,A
JNC AVFT2
INC R3
AVFT2: DJNZ R7,AVFT1
MOV R7,N
MOV R2,#00H
LCALL NDIV31
MOV A,R4
RET
;N點加權平均濾波
;入口: ADDPH,ADDPL,N
;占用資源: B,R3,R4
;堆棧需求: 2字節
;出口: A
QAVFILT : CLR A
MOV R3,A
MOV R4,A
MOV R7,N
MOV P2,ADDPH
MOV R1,ADDPL
MOV DPTR,#QAVTAB
QAVFT1 : MOVC A,@A+DPTR
MOV B,A
MOVX A,@R1
INC DPTR
INC R1
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
DJNZ R7,QAVFT1
MOV A,R4
JNB ACC.7,QAVFT2
INC R3
QAVFT2 : MOV A,R3
RET
QAVTAB : DB
;一階加權滯后濾波程序
;入口: A,DELTY
;占用資源: B,R3,R4
;堆棧需求: 2字節
;出口: A
BQFILT : MOV B,A
CLR A
MOV DPTR,#ABTAB
MOVC A,@A+DPTR
MUL AB
MOV R4,A
MOV R3,B
MOV A,#01H
MOVC A,@A+DPTR
MOV B,DELTY
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
MOV A,R4
JNB ACC.7,FT1
INC R3
FT1 : MOV A,R3
MOV DELTY,A
RET
BQTAB: DB 80H,80H
;雙字節取補程序 /(R3R4)=(R3R4)
;入口: R3,R4
;占用資源: ACC
;堆棧需求: 2字節
;出口: R3,R4
CMPT : MOV A,R4
CPL A
ADD A,#01H
MOV R4,A
MOV A,R3
CPL A
ADDC A,#00H
MOV R3,A
RET
;N節取補程序 /([R0])=([R0])
;入口: R0,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R0
NCMPTN : MOV B,R0
SETB C
NCPT1: MOV A,@R0
CPL A
ADDC A,#00H
MOV @R0,A
INC R0
DJNZ R7,NCPT1
MOV R0,B
RET
;雙字節無符號數加法程序 (R3R4+R6R7)=(R3R4)
;入口: R3,R4,R6,R7
;占用資源: ACC
;堆棧需求: 2字節
;出口: R3,R4,CF
NADD : MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
RET
;N字節無符號數加法程序 ([R0]+[R1])=([R0])
;入口: R0,R1,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R0,CF
NADDN: MOV B,R0
CLR C
NADN1: MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NADN1
MOV R0,B
RET
;雙字節無符號數減法程序 (R3R4-R6R7)=(R3R4)
;入口: R3,R4,R6,R7
;占用資源: ACC
;堆棧需求: 2字節
;出口: R3,R4
NSUB : MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
RET
;N字節無符號數減法程序 ([R0]-[R1])=([R0])
;入口: R0,R1,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R0,CF
NSUBN: MOV B,R0
MOV R7,N
CLR C
NSUBN1 : MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NSUBN1
MOV R0,B
RET
;單字節無符號數乘法程序 (R3R4*R7)=(R2R3R4)
;入口: R3,R4,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R2,R3,R4
NMUL21 : MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
CLR OV
RET
;單字節無符號數乘法程序 (R2R3R4*R7)=(R5R2R3R4)
;入口: R2,R3,R4,R6,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R5,R2,R3,R4
NMUL31 : MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,R7
MUL AB
ADD A,R2
MOV R2,A
CLR A
ADDC A,B
MOV R5,A
CLR OV
RET
;單字節無符號數乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)
;入口: R5,R2,R3,R4,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R7,R5,R2,R3,R4
NMUL41 : MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,R7
MUL AB
ADD A,R2
MOV R2,A
CLR A
ADDC A,B
XCH A,R5
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R7,A
CLR OV
RET
;雙字節無符號數乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口: R3,R4,R6,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R5,R2,R3,R4
NMUL22 : MOV A,R4
MOV B,R7
MUL AB
XCH A,R4
MOV R5,B
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R2,A
MOV A,R3
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R2
MOV R2,A
CLR A
ADDC A,#00H
XCH A,R3
MOV B,R6
MUL AB
ADD A,R2
MOV R2,A
MOV A,B
ADDC A,R3
XCH A,R5
MOV R3,A
CLR OV
RET
;雙字節無符號數乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)
;入口: R2,R3,R4,R6,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R1,R5,R2,R3,R4
NMUL32 : MOV A,R4
MOV B,R7
MUL AB
XCH A,R4
MOV R5,B
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R1,A
MOV A,R3
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R1
MOV R1,A
CLR A
ADDC A,#00H
XCH A,R3
MOV B,R6
MUL AB
ADD A,R1
MOV R1,A
MOV A,B
ADDC A,R3
XCH A,R5
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R1
MOV R1,A
MOV A,B
ADDC A,R5
MOV R5,A
CLR A
ADDC A,#00H
XCH A,R2
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R2
XCH A,R1
MOV R2,A
CLR OV
RET
;N字節無符號數乘法程序 ([R0]*[R1])=([R0])
;入口: R0,R1,M,N
;占用資源: ACC,B,R2,R5,R6,R7,NCNT
;堆棧需求: 2字節
;出口: R0
NMULMN : MOV A,M
ADD A,R0
MOV R5,A
XCH A,R1
XCH A,R5
ADD A,N
XCH A,R0
MOV R6,A
MOV B,M
MOV NCNT,B
NMLMN1 : DEC R0
DEC R1
CLR A
XCH A,@R1
MOV @R0,A
DJNZ NCNT,NMLMN1
MOV NCNT,B
NMLMN2 : CLR A
XCH A,@R0
MOV R2,A
MOV A,R6
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
CLR C
NMLMN3 : MOV A,R2
MOV B,@R1
INC R1
MUL AB
ADDC A,@R0
MOV @R0,A
INC R0
MOV A,B
ADDC A,@R0
MOV @R0,A
DJNZ R7,NMLMN3
INC R0
INC R6
DJNZ NCNT,NMLMN2
MOV A,R0
CLR C
SUBB A,M
SUBB A,N
MOV R0,A
RET
;單字節無符號除法程序 (R2R3R4/R7)=(R2)R3R4 余數R7
;入口: R2,R3,R4,R7
;占用資源: ACC,B,F0
;堆棧需求: 3字節
;出口: (R2),R3,R4,R7,OV
NDIV31 : MOV A,R2
MOV B,R7
DIV AB
PUSH A
MOV R2,B
MOV B,#10H
NDV311 : 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 F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 : XCH A,R2
MOV R7,A
RET
;單字節無符號除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余數R7
;入口: R2,R3,R4,R7
;占用資源: ACC,B,F0
;堆棧需求: 3字節
;出口: (R5),R2,R3,R4,R7,OV
NDIV41 : MOV A,R5
MOV B,R7
DIV AB
PUSH A
MOV R5,B
MOV B,#18H
NDV411 : 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,R5
RLC A
MOV R5,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV412
JC NDV413
NDV412 : MOV R5,A
INC R4
NDV413 : DJNZ B,NDV411
POP A
CLR OV
JZ NDV414
SETB OV
NDV414 : XCH A,R5
MOV R7,A
RET
;雙字節無符號除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余數R6R7
;入口: R5,R2,R3,R4,R6,R7
;占用資源: ACC,B,F0
;堆棧需求: 4字節
;出口: (R2),R3,R4,R6,R7,OV
NDIV42 : MOV A,R1
PUSH A
MOV B,#00H
NDV421 : MOV A,R2
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JC NDV422
MOV R5,A
MOV A,R1
MOV R2,A
INC B
SJMP NDV421
NDV422 : PUSH B
MOV B,#10H
NDV423 : 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
XCH A,R5
RLC A
XCH A,R5
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JB F0,NCV424
JC NDV425
NCV424 : MOV R5,A
MOV A,R1
MOV R2,A
INC R4
NDV425 : DJNZ B,NDV423
POP A
CLR OV
JNZ NDV426
SETB OV
NDV426 : XCH A,R2
MOV R7,A
MOV A,R5
MOV R6,A
POP A
MOV R1,A
RET
;N字節無符號除法程序(組合) ([R0]/[R1])=([R0])
;入口: R0,R1,M,N
;占用資源: ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN
;堆棧需求: 4字節
;出口: R0
;NDIVMN : MOV A,M
CLR C
SUBB A,N
MOV NCNT,A
ADD A,R0
MOV R4,A
XCH A,R0
MOV R3,A
MOV A,R1
MOV R5,A
MOV R2,#00H
NDVMN1 : MOV R7,N
LCALL NSUBN
MOV A,R5
MOV R1,A
JC NDVMN2
INC R2
SJMP NDVMN1
NDVMN2 : MOV R7,N
LCALL NADDN
MOV A,NCNT
SWAP A
RR A
MOV NCNT,A
NDVMN3 : MOV A,R3
MOV R0,A
MOV R7,M
LCALL NRLCN
MOV F0,C
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
LCALL NSUBN
JB F0,NDVMN4
JC NDVMN5
NDVMN4 : MOV A,R3
MOV R0,A
INC @R0
SJMP NDVMN6
NDVMN5 : MOV A,R5
MOV R1,A
MOV R7,N
LCALL NADDN
NDVMN6 : DJNZ NCNT,NDVMN3
MOV A,R4
MOV R1,A
MOV A,R2
MOV @R1,A
MOV A,R3
MOV R0,A
RET
;N字節無符號除法程序(集成) ([R0]/R[1])=([R0])
;入口: R0,R1,M,N
;占用資源: ACC,R2,R3,R4,R5,R7,F0
;堆棧需求: 2字節
;出口: R0
NDIVMN : MOV A,M
CLR C
SUBB A,N
MOV B,A
ADD A,R0
MOV R4,A
XCH A,R0
MOV R3,A
MOV A,R1
MOV R5,A
MOV R2,#00H
NDVMN1 : MOV R7,N
CLR C
NDVMN2 : MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN2
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
JC NDVMN3
INC R2
SJMP NDVMN1
NDVMN3 : MOV R7,N
CLR C
NDVMN4 : MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN4
MOV A,#08H
MUL AB
MOV B,A
NDVMN5 : MOV A,R3
MOV R0,A
MOV R7,M
CLR C
NDVMN6 : MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R7,NDVMN6
MOV F0,C
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
CLR C
NDVMN7 : MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN7
JB F0,NDVMNB
JC NDVMN8
NDVMNB : MOV A,R3
MOV R0,A
INC @R0
SJMP NDVMNA
NDVMN8 : MOV R7,N
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
CLR C
NDVMN9 : MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN9
NDVMNA : DJNZ B,NDVMN5
MOV A,M
CLR C
SUBB A,N
ADD A,R3
MOV R1,A
MOV A,R2
MOV @R1,A
MOV A,R3
MOV R0,A
RET
;N字節數據左移程序 RLC([R0])=(CF[R0])
;入口: R0,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R0,CF
NRLCN: MOV B,R0
CLR C
NRLN1: MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R7,NRLN1
MOV R0,B
RET
;原碼有符號雙字節減法程序 (R3R4-R6R7)=R3R4
;入口: R3,R4,R6,R7
;占用資源: ACC,DADD
;堆棧需求: 6字節
;出口: R3,R4,OV
DSUB : MOV A,R6
CPL ACC.7
MOV R6,A
LCALL DADD
RET
;原碼有符號雙字節加法程序 (R3R4+R6R7)=R3R4
;入口: R3,R4,R6,R7
;占用資源: ACC,SR0,NADD,NSUB,CMPT
;堆棧需求: 4字節
;出口: R3,R4,OV
DADD : MOV A,R3
MOV C,ACC.7
MOV SR0,C
XRL A,R6
MOV C,ACC.7
MOV A,R3
CLR ACC.7
MOV R3,A
MOV A,R6
CLR ACC.7
MOV R6,A
JC DAB2
LCALL NADD
MOV A,R3
JB ACC.7,DABE
DAB1 : MOV C,SR0
MOV ACC.7,C
MOV R3,A
CLR OV
RET
DABE : SETB OV
RET
DAB2 : LCALL NSUB
MOV A,R3
JNB ACC.7,DAB1
LCALL CMPT
CPL SR0
SJMP DAB1
;原碼有符號雙字節乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口: R3,R4,R6,R7
;占用資源: ACC,SR0,NMUL22
;堆棧需求: 4字節
;出口: R5,R2,R3,R4
IMUL : MOV A,R3
XRL A,R6
MOV C,ACC.7
MOV SR0,C
MOV A,R3
CLR ACC.7
MOV R3,A
MOV A,R6
CLR ACC.7
MOV R6,A
LCALL NMUL22
MOV A,R5
MOV C,SR0
MOV ACC.7,C
MOV R5,A
RET
;原碼有符號雙字節除法程序 (R5R2R3R4/R6R7)=(R3R4) 余數(R6R7)
;入口: R5,R2,R3,R4
;占用資源: ACC,SR0,NDIV42
;堆棧需求: 6字節
;出口: R3,R4,R6,R7,OV
IDIV : MOV A,R5
XRL A,R6
MOV C,ACC.7
MOV SR0,C
MOV A,R5
CLR ACC.7
MOV R5,A
MOV A,R6
CLR ACC.7
MOV R6,A
LCALL NDIV42
MOV A,R3
JB ACC.7,IDIVE
JB OV,IDIVE
MOV C,SR0
MOV ACC.7,C
MOV R3,A
RET
IDIVE: SETB OV
RET
;單字節順序查找程序
;入口: R0,R1,A,R7
;占用資源: B
;堆棧需求: 2字節
;出口: R0,R1,A
FINDB1 : MOV B,A
MOV DPL,R1
MOV DPH,R0
FINDB11 : MOVX A,@DPTR
CJNE A,B,FINDB12
MOV R1,DPL
MOV R0,DPH
CLR A
RET
FINDB12 : INC DPTR
DJNZ R7,FINDB11
MOV A,#0FFH
RET
;單字節順序查找程序
;入口: R0,R1,A,R6,R7
;占用資源: B
;堆棧需求: 2字節
;出口: R0,R1,A
FINDB2 : MOV B,A
MOV DPL,R1
MOV DPH,R0
MOV A,R7
JZ FINDB21
INC R6
FINDB21 : MOVX A,@DPTR
CJNE A,B,FINDB22
MOV R1,DPL
MOV R0,DPH
CLR A
RET
FINDB22 : INC DPTR
DJNZ R7,FINDB21
DJNZ R6,FINDB21
MOV A,#0FFH
RET
;雙字節字符串順序查找程序
;入口: R0,R1,R3,R4,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R0,R1,A
FINDS1 : MOV DPL,R1
MOV DPH,R0
FINDS11 : MOVX A,@DPTR
INC DPTR
CLR C
SUBB A,R4
JNZ FINDS12
MOVX A,@DPTR
SUBB A,R3
JNZ FINDS12
MOV A,DPL
CLR C
SUBB A,#01H
MOV R1,A
MOV A,DPH
SUBB A,#00H
MOV R0,A
CLR A
RET
FINDS12 : DJNZ R7,FINDS11
MOV A,#0FFH
RET
;雙字節字符串順序查找程序
;入口: R0,R1,R3,R4,R6,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R0,R1,A
FINDS2 : MOV DPL,R1
MOV DPH,R0
MOV A,R7
JZ FINDS21
INC R6
FINDS21 : MOVX A,@DPTR
INC DPTR
CLR C
SUBB A,R4
JNZ FINDS22
MOVX A,@DPTR
SUBB A,R3
JNZ FINDS22
MOV A,DPL
CLR C
SUBB A,#01H
MOV R1,A
MOV A,DPH
SUBB A,#00H
MOV R0,A
CLR A
RET
FINDS22 : DJNZ R7,FINDS21
DJNZ R6,FINDS21
MOV A,#0FFH
RET
;N字節字符串順序查找程序
;入口: ADDPH,ADDPL,R0,R6,R7,N
;占用資源: ACC,B,R2,NCNT
;堆棧需求: 2字節
;出口: ADDPH,ADDPL,A
FINDN: MOV A,R0
MOV R2,A
MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
MOV A,R7
JZ FINDN1
INC R6
FINDN1 : MOV A,R2
MOV R0,A
MOV A,N
MOV NCNT,A
FINDN2 : MOVX A,@DPTR
CLR C
SUBB A,@R0
JNZ FINDN3
INC DPTR
INC R0
DJNZ NCNT,FINDN2
MOV A,DPL
CLR C
SUBB A,N
MOV ADDPL,A
MOV A,DPH
SUBB A,#00H
MOV ADDPH,A
CLR A
RET
FINDN3 : CLR C
MOV A,R0
SUBB A,R2
JNZ FINDN4
INC DPTR
FINDN4 : DJNZ R7,FINDN1
DJNZ R6,FINDN1
MOV A,#0FFH
RET
;單字節最值查找程序
;入口: R0,R1,R6,R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R0(最大值),R1(最小值),R2,R3,R4,R5
FMAMIB : MOV DPL,R1
MOV DPH,R0
MOVX A,@DPTR
MOV R0,A
MOV R1,A
MOV A,DPL
MOV R3,A
MOV R5,A
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,R7
JZ FMMB1
INC R6
FMMB1: MOVX A,@DPTR
MOV B,A
SETB C
SUBB A,R0
JC FMMB2
MOV R0,B
MOV R3,DPL
MOV R2,DPH
SJMP FMMB3
FMMB2: MOV A,B
CLR C
SUBB A,R1
JNC FMMB3
MOV R1,B
MOV R5,DPL
MOV R4,DPH
FMMB3: INC DPTR
DJNZ R7,FMMB1
DJNZ R6,FMMB1
RET
;浮點數順序查找程序
;入口: R0,R1,R2,R3,R4,R6,R7
;占用資源: B,NCNT,FCMP
;堆棧需求: 2字節
;出口: R0,R1,A
FINDF: MOV DPL,R1
MOV DPH,R0
MOV A,R7
MOV B,A
MOV NCNT,R6
JZ FINDF1
INC NCNT
FINDF1 : MOVX A,@DPTR
INC DPTR
MOV R5,A
MOVX A,@DPTR
INC DPTR
MOV R6,A
MOVX A,@DPTR
INC DPTR
MOV R7,A
LCALL FCMP
JNZ FINDF2
MOV A,DPL
CLR C
SUBB A,#03H
MOV R1,A
MOV A,DPH
SUBB A,#00H
MOV R0,A
CLR A
RET
FINDF2 : DJNZ B,FINDF1
DJNZ NCNT,FINDF1
MOV A,#0FFH
RET
;浮點數最值查找程序
;入口: ADDPH,ADDPL,R6,R7
;占用資源: ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP
;堆棧需求: 5字節
;出口: [R0](最大值),[R1](最小值),R2,R3,R4,R5
FMAMIF : MOV A,ADDPL
MOV R3,A
MOV R5,A
MOV DPL,A
MOV A,ADDPH
MOV R2,A
MOV R4,A
MOV DPH,A
MOV B,R7
MOV R7,#03H
LCALL ITEMOV
MOV R7,#03H
LCALL IBMOV
MOV A,B
JZ FMMF1
INC NCNT
FMMF1: PUSH B
MOVX A,@DPTR
INC DPTR
MOV R2,A
MOVX A,@DPTR
INC DPTR
MOV R3,A
MOVX A,@DPTR
INC DPTR
MOV R4,A
LCALL MOVR1
LCALL FCMP
JNC FMMF2
MOV A,R0
XCH A,R1
MOV R0,A
LCALL MOVB
MOV R5,DPL
MOV R4,DPH
MOV A,R0
XCH A,R1
MOV R0,A
SJMP FMMF3
FMMF2: MOV A,R0
XCH A,R1
MOV R0,A
LCALL MOVR1
LCALL FCMP
MOV A,R0
XCH A,R1
MOV R0,A
JZ FMMF3
JC FMMF3
LCALL MOVB
MOV R3,DPL
MOV R2,DPH
FMMF3: POP B
DJNZ B,FMMF1
DJNZ NCNT,FMMF1
RET
;單字節折半查找程序
;入口: A,R0,R1,R6,R7
;占用資源: B,R2
;堆棧需求: 2字節
;出口: R0,R1
SEARCHB : MOV B,A
MOV A,R1
ADD A,R7
MOV R7,A
MOV A,R0
ADDC A,R6
MOV R6,A
MOV A,R7
SUBB A,#01H
MOV R7,A
JNC SECH1
DEC R6
SECH1: MOV A,R7
CLR C
SUBB A,R1
MOV A,R6
SUBB A,R0
JNC SECH2
MOV A,#0FFH
RET
SECH2: MOV A,R7
ADD A,R1
MOV R2,A
MOV A,R6
ADDC A,R0
RRC A
MOV DPH,A
MOV A,R2
RRC A
MOV DPL,A
MOVX A,@DPTR
CLR C
SUBB A,B
JNC SECH3
INC DPTR
MOV R0,DPH
MOV R1,DPL
SJMP SECH1
SECH3: JZ SECH5
MOV A,DPL
SUBB A,#01H
MOV R7,A
JNC SECH4
MOV R6,DPH
DEC R6
SECH4: SJMP SECH1
SECH5: MOV R0,DPH
MOV R1,DPL
CLR A
RET
;辛普生積分程序
;入口: DPTR,N,COUNT
;占用資源: ACC,R3,R4,R6,R7
;堆棧需求: 2字節
;出口: R3,R4
SJF : MOV R7,N
MOVX A,@DPTR
INC DPTR
MOV R4,A
MOV R3,#00H
DEC R7
SJF1 : MOVX A,@DPTR
INC DPTR
CLR C
RLC A
MOV R6,A
CLR A
RLC A
XCH A,R7
JNB ACC.0,SJF2
XCH A,R6
RLC A
XCH A,R6
XCH A,R7
RLC A
XCH A,R7
SJF2 : XCH A,R7
XCH A,R6
ADD A,R4
MOV R4,A
MOV A,R6
ADDC A,R3
MOV R3,A
DJNZ R7,SJF1
SJF3 : MOVX A,@DPTR
ADD A,R4
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
MOV R7,#COUNT
LCALL NMUL21
MOV A,N
MOV B,#03H
MUL AB
MOV R7,A
LCALL NDIV31
RET
NMUL21 : MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
CLR OV
RET
NDIV31 : MOV B,#10H
NDV311 : 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 F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
RET
;內部RAM數據排序程序(升序)
;入口: R0(起始地址),N(數據個數)
;占用資源: ACC,B,R5,R6,R7
;堆棧需求: 2字節
;出口: R0
ISELSORT : MOV R7,N
DEC R7
ISST1: MOV A,R7
MOV R6,A
MOV A,R0
MOV R1,A
MOV R2,A
MOV B,@R1
ISST2: INC R1
MOV A,@R1
CLR C
SUBB A,B
JC ISST3
MOV A,R1
MOV R2,A
MOV B,@R1
ISST3: DJNZ R6,ISST2
MOV A,B
XCH A,@R1
MOV B,R2
MOV R1,B
MOV @R1,A
DJNZ R7,ISST1
RET
;外部RAM數據排序程序(升序)
;入口: ADDPH,ADDPL(起始地址),N(數據個數)
;占用資源: ACC,B,R0,R1,R5,R7
;堆棧需求: 2字節
;出口: ADDPH-ADDPL
ESELSORT : MOV R7,N
DEC R7
ESST1: MOV A,R7
MOV R6,A
MOV DPL,ADDPL
MOV R1,DPL
MOV DPH,ADDPH
MOV R0,DPH
MOVX A,@DPTR
MOV B,A
ESST2: INC DPTR
MOVX A,@DPTR
CLR C
SUBB A,B
JC ESST3
MOV R0,DPL
MOV R1,DPH
MOVX A,@DPTR
MOV B,A
ESST3: DJNZ R6,ESST2
MOVX A,@DPTR
XCH A,B
MOVX @DPTR,A
MOV DPL,R0
MOV DPH,R1
MOV A,B
MOVX @DPTR,A
DJNZ R7,ESST1
RET
;外部RAM浮點數排序程序(升序)
;入口: ADDPH,ADDPL(起始地址),N(數據個數)
;占用資源: ACC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT
;堆棧需求: 5字節
;出口: ADDPH,ADDPL
FSORT: MOV A,N
MOV NCNT,A
DEC NCNT
FST1 : MOV B,NCNT
MOV DPL,ADDPL
MOV R1,DPL
MOV DPH,ADDPH
MOV R0,DPH
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R4,A
FST2 : INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
PUSH B
LCALL FCMP
POP B
JNC FST4
MOV A,DPL
CLR C
SUBB A,#02H
MOV R1,A
MOV R0,DPH
JNC FST3
DEC R0
FST3 : MOV A,R5
MOV R2,A
MOV A,R6
MOV R3,A
MOV A,R7
MOV R4,A
FST4 : DJNZ B,FST2
MOV A,DPL
CLR C
SUBB A,#02H
MOV DPL,A
JNC FST5
DEC DPH
FST5 : MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R4
MOVX @DPTR,A
MOV A,R0
MOV P2,A
MOV A,R5
MOVX @R1,A
INC R1
MOV A,R6
MOVX @R1,A
INC R1
MOV A,R7
MOVX @R1,A
DJNZ NCNT,FST1
RET
;BCD小數轉換為二進制小數(2位)
;入口: R0(低位首址),R7
;占用資源: ACC,B,R5
;堆棧需求: 2字節
;出口: R3,R4
PDTB : CLR A
MOV R3,A
MOV R4,A
PDB1 : MOV A,R3
MOV B,#9AH
MUL AB
MOV R5,B
XCH A,R4
MOV B,#19H
MUL AB
ADD A,R4
MOV A,R5
ADDC A,B
MOV R5,A
MOV A,@R0
MOV B,#9AH
MUL AB
ADD A,R5
MOV R4,A
CLR A
ADDC A,B
XCH A,R3
MOV B,#19H
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
MOV A,@R0
MOV B,#19H
MUL AB
ADD A,R3
MOV R3,A
DEC R0
DJNZ R7,PDB1
RET
;BCD小數轉換為二進制小數(N位)
;入口: R1(低位首址),M,N
;占用資源: ACC,B,R2,R3,R7
;堆棧需求: 2字節
;出口: R0
PDTBMN : MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
MOV B,N
CLR A
PDBMN1 : MOV @R0,A
INC R0
DJNZ B,PDBMN1
MOV A,N
SWAP A
RR A
MOV R7,A
PDBMN2 : MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV B,M
CLR C
PDBMN3 : MOV A,@R1
ADDC A,@R1
DA A
JNB ACC.4,PDBMN4
SETB C
CLR ACC.4
PDBMN4 : MOV @R1,A
INC R1
DJNZ B,PDBMN3
MOV B,N
PDBMN5 : MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ B,PDBMN5
DJNZ R7,PDBMN2
MOV A,R2
MOV R0,A
RET
;BCD整數轉換為二進制整數(1位)
;入口: R0(高位地址),R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R4
IDTB1: CLR A
MOV R4,A
IDB11: MOV A,R4
MOV B,#0AH
MUL AB
ADD A,@R0
INC R0
MOV R4,A
DJNZ R7,IDB11
RET
;BCD整數轉換為二進制整數(2位)
;入口: R0(高位地址),R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R3,R4
IDTB2: CLR A
MOV R3,A
MOV R4,A
IDB21: MOV A,R4
MOV B,#0AH
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#0AH
MUL AB
ADD A,R3
MOV R3,A
MOV A,R4
ADD A,@R0
INC R0
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
DJNZ R7,IDB21
RET
;BCD整數轉換為二進制整數(3位)
;入口: R0(高位地址),R7
;占用資源: ACC,B
;堆棧需求: 2字節
;出口: R2,R3,R4
IDTB3: CLR A
MOV R2,A
MOV R3,A
MOV R4,A
IDB31: MOV A,R4
MOV B,#0AH
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#0AH
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,#0AH
MUL AB
ADD A,R2
MOV R2,A
MOV A,R4
ADD A,@R0
INC R0
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
DJNZ R7,IDB31
RET
;BCD整數轉換為二進制整數(N位)
;入口: R1(高位地址),M,N
;占用資源: ACC,B,R2,R7,NCNT,F0
;堆棧需求: 2字節
;出口: R0
IDTBMN : MOV A,R0
MOV R2,A
MOV B,N
CLR A
IDBMN1 : MOV @R0,A
INC R0
DJNZ B,IDBMN1
MOV A,R2
MOV R0,A
MOV A,M
MOV NCNT,A
IDBMN2 : MOV R7,N
CLR A
CLR F0
IDBMN3 : XCH A,@R0
MOV B,#0AH
MUL AB
MOV C,F0
ADDC A,@R0
MOV F0,C
MOV @R0,A
INC R0
MOV A,B
DJNZ R7,IDBMN3
MOV A,R2
MOV R0,A
MOV A,@R1
INC R1
ADD A,@R0
MOV @R0,A
DJNZ NCNT,IDBMN2
RET
;二進制小數(2位)轉換為十進制小數(分離BCD碼)
;入口: R3,R4,R7
;占用資源: ACC,B
;堆棧需求: 3字節
;出口: R0
PBTD : MOV A,R7
PUSH A
PBD1 : MOV A,R4
MOV B,#0AH
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#0AH
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV @R0,A
INC R0
DJNZ R7,PBD1
POP A
MOV R7,A
MOV A,R0
CLR C
SUBB A,R7
MOV R0,A
RET
;二進制小數(M位)轉換為十進制小數(分離BCD碼)
;入口: R1,M,N
;占用資源: ACC,B,R2,R3,R7,NCNT
;堆棧需求: 2字節
;出口: R0
PBTDMN : MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
MOV A,N
MOV NCNT,A
PBDMN1 : MOV R7,M
CLR A
CLR F0
PBDMN2 : XCH A,@R1
MOV B,#0AH
MUL AB
MOV C,F0
ADDC A,@R1
MOV F0,C
MOV @R1,A
INC R1
MOV A,B
DJNZ R7,PBDMN2
ADDC A,#00H
MOV @R0,A
INC R0
MOV A,R3
MOV R1,A
DJNZ NCNT,PBDMN1
MOV A,R2
MOV R0,A
RET
;二進制整數(2位)轉換為十進制整數(分離BCD碼)
;入口: R3,R4
;占用資源: ACC,R2,NDIV31
;堆棧需求: 5字節
;出口: R0,NCNT
IBTD21 : MOV NCNT,#00H
MOV R2,#00H
IBD211 : MOV R7,#0AH
LCALL NDIV31
MOV A,R7
MOV @R0,A
INC R0
INC NCNT
MOV A,R3
ORL A,R4
JNZ IBD211
MOV A,R0
CLR C
SUBB A,NCNT
MOV R0,A
RET
;二進制整數(2位)轉換為十進制整數(組合BCD碼)
;入口: R3,R4
;占用資源: ACC,B,R7
;堆棧需求: 3字節
;出口: R0
IBTD22 : MOV A,R0
PUSH A
MOV R7,#03H
CLR A
IBD221 : MOV @R0,A
INC R0
DJNZ R7,IBD221
POP A
MOV R0,A
MOV R7,#10H
IBD222 : PUSH A
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV B,#03H
IBD223 : MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
DJNZ B,IBD223
POP A
MOV R0,A
DJNZ R7,IBD222
RET
;二進制整數(3位)轉換為十進制整數(分離BCD碼)
;入口: R2,R3,R4
;占用資源: ACC,R2,NDIV31
;堆棧需求: 5字節
;出口: R0,NCNT
IBTD31 : CLR A
MOV NCNT,A
IBD311 : MOV R7,#0AH
LCALL NDIV31
MOV A,R7
MOV @R0,A
INC R0
INC NCNT
MOV A,R2
ORL A,R3
ORL A,R4
JNZ IBD311
MOV A,R0
CLR C
SUBB A,NCNT
MOV R0,A
RET
;二進制整數(3位)轉換為十進制整數(組合BCD碼)
;入口: R2,R3,R4
;占用資源: ACC,B,R7
;堆棧需求: 3字節
;出口: R0
IBTD32 : MOV A,R0
PUSH A
MOV R7,#04H
CLR A
IBD321 : MOV @R0,A
INC R0
DJNZ R7,IBD321
POP A
MOV R0,A
MOV R7,#18H
IBD322 : PUSH A
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 B,#04H
IBD323 : MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
DJNZ B,IBD323
POP A
MOV R0,A
DJNZ R7,IBD322
RET
;二進制整數(M位)轉換為十進制整數(組合BCD碼)
;入口: R1,M,N
;占用資源: ACC,B,R2,R3,R7
;堆棧需求: 2字節
;出口: R0
IBTDMN : MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
MOV B,N
CLR A
IBDMN1 : MOV @R0,A
INC R0
DJNZ B,IBDMN1
MOV A,M
SWAP A
RR A
CLR C
MOV R7,A
IBDMN2 : MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV B,M
IBDMN3 : MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ B,IBDMN3
MOV B,N
IBDMN4 : MOV A,@R0
ADDC A,@R0
DA A
JNB ACC.4,IBDMN5
SETB C
CLR ACC.4
IBDMN5 : MOV @R0,A
INC R0
DJNZ B,IBDMN4
DJNZ R7,IBDMN2
MOV A,R2
MOV R0,A
RET
;附:
;三字節無符號除法程序(R2R3R4/R7)=(R2)R3R4 余數R7
;入口: R2,R3,R4,R7
;占用資源: ACC,B,F0
;堆棧需求: 3字節
;出口: (R2),R3,R4,R7,OV
NDIV31 : MOV A,R2
MOV B,R7
DIV AB
PUSH A
MOV R2,B
MOV B,#10H
NDV311 : 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 F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 : XCH A,R2
MOV R7,A
RET
(一) MCS-51定點運算子程序庫及其使用說明
定點運算子程序庫文件名為DQ51.ASM,為便于使用,先將有關約定說明如下:
1.多字節定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續單元中的數
據。地址小的單元存放數據的高字節。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,
(31H)=34H,(32H)=56H。
2.運算精度:單次定點運算精度為結果最低位的當量值。
3.工作區:數據工作區固定在PSW、A、B、R2~R7,用戶只要不在工作區中存放無關的或非消耗性的信息,程序就具有較好的透明性。
(1) 標號: BCDA 功能:多字節BCD碼加法
入口條件:字節數在R7中,被加數在[R0]中,加數在[R1]中。
出口信息:和在[R0]中,最高位進位在CY中。
影響資源:PSW、A、R2 堆棧需求: 2字節
BCDA: MOV A,R7 ;取字節數至R2中
MOV R2,A
ADD A,R0 ;初始化數據指針
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0 ;調整數據指針
DEC R1
MOV A,@R0
ADDC A,@R1 ;按字節相加
DA A ;十進制調整
MOV @R0,A ;和存回[R0]中
DJNZ R2,BCD1 ;處理完所有字節
RET
(2) 標號: BCDB 功能:多字節BCD碼減法
入口條件:字節數在R7中,被減數在[R0]中,減數在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影響資源:PSW、A、R2、R3 堆棧需求: 6字節
BCDB: LCALL NEG1 ;減數[R1]十進制取補
LCALL BCDA ;按多字節BCD碼加法處理
CPL C ;將補碼加法的進位標志轉換成借位標志
MOV F0,C ;保護借位標志
LCALL NEG1 ;恢復減數[R1]的原始值
MOV C,F0 ;恢復借位標志
RET
NEG1: MOV A,R0 ;[R1]十進制取補子程序入口
XCH A,R1 ;交換指針
XCH A,R0
LCALL NEG ;通過[R0]實現[R1]取補
MOV A,R0
XCH A,R1 ;換回指針
XCH A,R0
RET
(3) 標號: NEG 功能:多字節BCD碼取補
入口條件:字節數在R7中,操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節
NEG: MOV A,R7 ;取(字節數減一)至R2中
DEC A
MOV R2,A
MOV A,R0 ;保護指針
MOV R3,A
NEG0: CLR C
MOV A,#99H
SUBB A,@R0 ;按字節十進制取補
MOV @R0,A ;存回[R0]中
INC R0 ;調整數據指針
DJNZ R2,NEG0 ;處理完(R2)字節
MOV A,#9AH ;最低字節單獨取補
SUBB A,@R0
MOV @R0,A
MOV A,R3 ;恢復指針
MOV R0,A
RET
(4) 標號: BRLN 功能:多字節BCD碼左移十進制一位(乘十)
入口條件:字節數在R7中,操作數在[R0]中。
出口信息:結果仍在[R0]中,移出的十進制最高位在R3中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節
BRLN: MOV A,R7 ;取字節數至R2中
MOV R2,A
ADD A,R0 ;初始化數據指針
MOV R0,A
MOV R3,#0 ;工作單元初始化
BRL1: DEC R0 ;調整數據指針
MOV A,@R0 ;取一字節
SWAP A ;交換十進制高低位
MOV @R0,A ;存回
MOV A,R3 ;取低字節移出的十進制高位
XCHD A,@R0 ;換出本字節的十進制高位
MOV R3,A ;保存本字節的十進制高位
DJNZ R2,BRL1 ;處理完所有字節
RET
(5) 標號: MULD 功能:雙字節二進制無符號數乘法
入口條件:被乘數在R2、R3中,乘數在R6、R7中。
出口信息:乘積在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
MULD: MOV A,R3 ;計算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R3 ;計算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;計算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;計算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分積
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
(6) 標號: MUL2 功能:雙字節二進制無符號數平方
入口條件:待平方數在R2、R3中。
出口信息:結果在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R5 堆棧需求: 2字節
MUL2: MOV A,R3 ;計算R3平方
MOV B,A
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R2 ;計算R2平方
MOV B,A
MUL AB
XCH A,R3 ;暫存部分積,并換出R2和R3
XCH A,B
XCH A,R2
MUL AB ;計算2×R2×R3
CLR C
RLC A
XCH A,B
RLC A
JNC MU20
INC R2 ;累加溢出量
MU20: XCH A,B ;累加部分積
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
RET
(7) 標號: DIVD 功能:雙字節二進制無符號數除法
入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0 時,雙字節商在R2、R3中,OV=1 時溢出。
影響資源:PSW、A、B、R1~R7 堆棧需求: 2字節
DIVD: CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙字節商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
(8) 標號: D457 功能:雙字節二進制無符號數除以單字節二進制數
入口條件:被除數在R4、R5中,除數在R7中。
出口信息:OV=0 時,單字節商在R3中,OV=1 時溢出。
影響資源:PSW、A、R3~R7 堆棧需求: 2字節
D457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV ;商溢出
RET
DV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
(9) 標號: DV31 功能:三字節二進制無符號數除以單字節二進制數
入口條件:被除數在R3、R4、R5中,除數在R7中。
出口信息:OV=0 時,雙字節商在R4、R5中,OV=1 時溢出。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV ;商溢出
RET
DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5
DM23: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3 ;四舍五入
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: CLR OV
RET ;商在R4R5中
(10) 標號: MULS 功能:雙字節二進制有符號數乘法(補碼)
入口條件:被乘數在R2、R3中,乘數在R6、R7中。
出口信息:乘積在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R7 堆棧需求: 4字節
MULS: MOV R4,#0 ;清零R4R5
MOV R5,#0
LCALL MDS ;計算結果的符號和兩個操作數的絕對值
LCALL MULD ;計算兩個絕對值的乘積
SJMP MDSE ;用補碼表示結果
(11) 標號: DIVS 功能:雙字節二進制有符號數除法(補碼)
入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0時商在R2、R3中,OV=1時溢出。
影響資源:PSW、A、B、R1~R7 堆棧需求: 5字節
DIVS: LCALL MDS ;計算結果的符號和兩個操作數的絕對值
PUSH PSW ;保存結果的符號
LCALL DIVD ;計算兩個絕對值的商
JNB OV,DVS1 ;溢出否?
POP ACC ;溢出,放去結果的符號,保留溢出標志
RET
DVS1: POP PSW ;未溢出,取出結果的符號
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用補碼表示結果
CLR OV ;結果為正,原碼即補碼,計算成功
RET
MDS: CLR F0 ;結果符號初始化
MOV A,R6 ;判斷第二操作數的符號
JNB ACC.7,MDS1;為正,不必處理
CPL F0 ;為負,結果符號取反
XCH A,R7 ;第二操作數取補,得到其絕對值
CPL A
ADD A,#1
XCH A,R7
CPL A
ADDC A,#0
MOV R6,A
MDS1: MOV A,R2 ;判斷第一操作數或運算結果的符號
JNB ACC.7,MDS3;為正,不必處理
CPL F0 ;為負,結果符號取反
MDS2: MOV A,R5 ;求第一操作數的絕對值或運算結果的補碼
CPL A
ADD A,#1
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
MOV A,R3
CPL A
ADDC A,#0
MOV R3,A
MOV A,R2
CPL A
ADDC A,#0
MOV R2,A
MDS3: CLR OV ;運算成功
RET
(12) 標號: SH2 功能:雙字節二進制無符號數開平方(快速)
入口條件:被開方數在R2、R3中。
出口信息:平方根仍在R2、R3中,整數部分的位數為原數的一半,其余為小數。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET ;被開方數為零,不必運算
SH20: MOV R7,#0 ;左規次數初始化
MOV A,R2
SH22: ANL A,#0C0H ;被開方數高字節小于40H否?
JNZ SQRH ;不小于40H,左規格化完成,轉開方過程
CLR C ;每左規一次,被開方數左移兩位
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7 ;左規次數加一
SJMP SH22 ;繼續左規
(13) 標號: SH4 功能:四字節二進制無符號數開平方(快速)
入口條件:被開方數在R2、R3、R4、R5中。
出口信息:平方根在R2、R3中,整數部分的位數為原數的一半,其余為小數。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
SH4: MOV A,R2
ORL A,R3
ORL A,R4
ORL A,R5
JNZ SH40
RET ;被開方數為零,不必運算
SH40: MOV R7,#0 ;左規次數初始化
MOV A,R2
SH41: ANL A,#0C0H ;被開方數高字節小于40H否?
JNZ SQRH ;不小于40H,左規格化完成
MOV R6,#2 ;每左規一次,被開方數左移兩位
SH42: CLR C ;被開方數左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42 ;被開方數左移完兩位
INC R7 ;左規次數加一
SJMP SH41 ;繼續左規
SQRH: MOV A,R2 ;規格化后高字節按折線法分為三個區間
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一區間的斜率
MOV R4,#80H ;第一區間的平方根基數
SJMP SQR3
SQR1: MOV B,#0B2H ;第二區間的斜率
MOV R4,#0A0H;第二區間的平方根基數
SJMP SQR3
SQR2: MOV B,#8DH ;第三區間的斜率
MOV R4,#0D0H;第三區間的平方根基數
SQR3: MUL AB ;與區間基點的偏移量乘區間斜率
MOV A,B
ADD A,R4 ;累加到平方根的基數上
MOV R4,A
MOV B,A
MUL AB ;求當前平方根的冪
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用減奇數法校正一個字節的平方根
MOV A,R4 ;當前平方根的兩倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于該奇數否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正結束,已達到一個字節的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;繼續校正
SQR5: MOV A,R4 ;將一個字節精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最終偏移量的最高位
MOV A,R3
MOV R5,A ;將最終偏移量的低八位存入R5中
MOV R4,#8 ;通過(R5R6/R2)求根的低字節
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 ;根的第二字節計算完,在R3中
MOV A,R7 ;取原被開方數的左規次數
JZ SQRE ;未左規,開方結束
SQR9: CLR C ;按左規次數右移平方根,得到實際根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
(14) 標號: HASC 功能:單字節十六進制數轉換成雙字節ASCII碼
入口條件:待轉換的單字節十六進制數在累加器A中。
出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。
影響資源:PSW、A、B 堆棧需求: 4字節
HASC: MOV B,A ;暫存待轉換的單字節十六進制數
LCALL HAS1 ;轉換低四位
XCH A,B ;存放低四位的ASCII碼
SWAP A ;準備轉換高四位
HAS1: ANL A,#0FH ;將累加器的低四位轉換成ASCII碼
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
(15) 標號: ASCH 功能:ASCII碼轉換成十六進制數
入口條件:待轉換的ASCII碼(30H~39H或41H~46H)在A中。
出口信息:轉換后的十六進制數(00H~0FH)仍在累加器A中。
影響資源:PSW、A 堆棧需求: 2字節
ASCH: CLR C
SUBB A,#30H
JNB ACC.4,ASH1
SUBB A,#7
ASH1: RET
(16) 標號:HBCD 功能:單字節十六進制整數轉換成單字節BCD碼整數
入口條件:待轉換的單字節十六進制整數在累加器A中。
出口信息:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。
影響資源:PSW、A、B、R3 堆棧需求: 2字節
HBCD: MOV B,#100 ;分離出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余數繼續分離十位和個位
XCH A,B
DIV AB
SWAP A
ORL A,B ;將十位和個位拼裝成BCD碼
RET
(17) 標號: HB2 功能:雙字節十六進制整數轉換成雙字節BCD碼整數
入口條件:待轉換的雙字節十六進制整數在R6、R7中。
出口信息:轉換后的三字節BCD碼整數在R3、R4、R5中。
影響資源:PSW、A、R2~R7 堆棧需求: 2字節
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙字節十六進制整數
HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節十六進制數的萬位數不超過6,不用調整
DJNZ R2,HB3 ;處理完16bit
RET
(18) 標號: HBD 功能:單字節十六進制小數轉換成單字節BCD碼小數
入口條件:待轉換的單字節十六進制小數在累加器A中。
出口信息:CY=0時轉換后的BCD碼小數仍在A中。CY=1時原小數接近整數1。
影響資源:PSW、A、B 堆棧需求: 2字節
HBD: MOV B,#100 ;原小數擴大一百倍
MUL AB
RLC A ;余數部分四舍五入
CLR A
ADDC A,B
MOV B,#10 ;分離出十分位和百分位
DIV AB
SWAP A
ADD A,B ;拼裝成單字節BCD碼小數
DA A ;調整后若有進位,原小數接近整數1
RET
(19) 標號: HBD2 功能:雙字節十六進制小數轉換成雙字節BCD碼小數
入口條件:待轉換的雙字節十六進制小數在R2、R3中。
出口信息:轉換后的雙字節BCD碼小數仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求: 6字節
HBD2: MOV R4,#4 ;四位十進制碼
HBD3: MOV A,R3 ;原小數擴大十倍
MOV B,#10
MUL AB
MOV R3,A
MOV R5,B
MOV A,R2
MOV B,#10
MUL AB
ADD A,R5
MOV R2,A
CLR A
ADDC A,B
PUSH ACC ;保存溢出的一位十進制碼
DJNZ R4,HBD3 ;計算完四位十進制碼
POP ACC ;取出萬分位
MOV R3,A
POP ACC ;取出千分位
SWAP A
ORL A,R3 ;拼裝成低字節BCD碼小數
MOV R3,A
POP ACC ;取出百分位
MOV R2,A
POP ACC ;取出十分位
SWAP A
ORL A,R2 ;拼裝成高字節BCD碼小數
MOV R2,A
RET
(20)標號:BCDH 功能:單字節BCD碼整數轉換成單字節十六進制整數
入口條件:待轉換的單字節BCD碼整數在累加器A中。
出口信息:轉換后的單字節十六進制整數仍在累加器A中。
影響資源:PSW、A、B、R4 堆棧需求: 2字節
BCDH: MOV B,#10H ;分離十位和個位
DIV AB
MOV R4,B ;暫存個位
MOV B,#10 ;將十位轉換成十六進制
MUL AB
ADD A,R4 ;按十六進制加上個位
RET
(21)標號: BH2 功能:雙字節BCD碼整數轉換成雙字節十六進制整數
入口條件:待轉換的雙字節BCD碼整數在R2、R3中。
出口信息:轉換后的雙字節十六進制整數仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節
BH2: MOV A,R3 ;將低字節轉換成十六進制
LCALL BCDH
MOV R3,A
MOV A,R2 ;將高字節轉換成十六進制
LCALL BCDH
MOV B,#100 ;擴大一百倍
MUL AB
ADD A,R3 ;和低字節按十六進制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
(22)標號: BHD 功能:單字節BCD碼小數轉換成單字節十六進制小數
入口條件:待轉換的單字節BCD碼數在累加器A中。
出口信息:轉換后的單字節十六進制小數仍在累加器A中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節
BHD: MOV R2,#8 ;準備計算一個字節小數
BHD0: ADD A,ACC ;按十進制倍增
DA A
XCH A,R3
RLC A ;將進位標志移入結果中
XCH A,R3
DJNZ R2,BHD0 ;共計算8bit小數
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD1 ;四舍
INC R3 ;五入
BHD1: MOV A,R3 ;取結果
RET
(23)標號: BHD2 功能:雙字節BCD碼小數轉換成雙字節十六進制小數
入口條件:待轉換的雙字節BCD碼小數在R4、R5中。
出口信息:轉換后的雙字節十六進制小數在R2、R3中。*
影響資源:PSW、A、R2~R6 堆棧需求: 2字節
BHD2: MOV R6,#10H ;準備計算兩個字節小數
BHD3: MOV A,R5 ;按十進制倍增
ADD A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3 ;將進位標志移入結果中
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,BHD3 ;共計算16bit小數
MOV A,R4
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD4 ;四舍
INC R3 ;五入
MOV A,R3
JNZ BHD4
INC R2
BHD4: RET
(24) 標號: MM 功能:求單字節十六進制無符號數據塊的極值
入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節
MM: MOV B,R7 ;保存數據個數
MOVX A,@DPTR ;讀取第一個數據
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數據的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數據個數
DEC A ;減一,得到需要比較的次數
JZ MME ;只有一個數據,不需要比較
MOV R1,A ;保存比較次數
PUSH DPL ;保護數據塊的首址
PUSH DPH
MM1: INC DPTR ;指向一個新的數據
MOVX A,@DPTR ;讀取這個數據
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JC MM2 ;不超過當前最大值,保持當前最大值
MOV R6,B ;超過當前最大值,更新最大值存放地址
MOV R2,DPH ;同時更新最大值存放地址
MOV R3,DPL
SJMP MM3
MM2: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNC MM3 ;大于或等于當前最小值,保持當前最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MM3: DJNZ R1,MM1 ;處理完全部數據
POP DPH ;恢復數據首址
POP DPL
MME: RET
(25) 標號: MMS 功能:求單字節十六進制有符號數據塊的極值
入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節
MMS: MOV B,R7 ;保存數據個數
MOVX A,@DPTR ;讀取第一個數據
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數據的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數據個數
DEC A ;減一,得到需要比較的次數
JZ MMSE ;只有一個數據,不需要比較
MOV R1,A ;保存比較次數
PUSH DPL ;保護數據塊的首址
PUSH DPH
MMS1: INC DPTR ;調整數據指針
MOVX A,@DPTR ;讀取一個數據
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JZ MMS4 ;相同,不更新最大值
JNB OV,MMS2 ;差未溢出,符號位有效
CPL ACC.7 ;差溢出,符號位取反
MMS2: JB ACC.7,MMS4;差為負,不更新最大值
MOV R6,B ;更新最大值
MOV R2,DPH ;更新最大值存放地址
MOV R3,DPL
SJMP MMS7
MMS4: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNB OV,MMS6 ;差未溢出,符號位有效
CPL ACC.7 ;差溢出,符號位取反
MMS6: JNB ACC.7,MMS7;差為正,不更新最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MMS7: DJNZ R1,MMS1 ;處理完全部數據
POP DPH ;恢復數據首址
POP DPL
MMSE: RET
(26) 標號: FDS1 功能:順序查找(ROM)單字節表格
入口條件:待查找的內容在A中,表格首址在DPTR中,表格的字節數在R7中。
出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。
影響資源:PSW、A、B、R2、R6 堆棧需求: 2字節
FDS1: MOV B,A ;保存待查找的內容
MOV R2,#0 ;順序號初始化(指向表首)
MOV A,R7 ;保存表格的長度
MOV R6,A
FD11: MOV A,R2 ;按順序號讀取表格內容
MOVC A,@A+DPTR
CJNE A,B,FD12;與待查找的內容比較
CLR OV ;相同,查找成功
MOV A,R2 ;取對應的順序號
RET
FD12: INC R2 ;指向表格中的下一個內容
DJNZ R6,FD11 ;查完全部表格內容
SETB OV ;未查找到,失敗
RET
(27) 標號: FDS2 功能:順序查找(ROM)雙字節表格
入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據總個數在R7中。
出口信息:OV=0時順序號在累加器A中,地址在DPTR中;OV=1時未找到。
影響資源:PSW、A、R2、R6、DPTR 堆棧需求: 2字節
FDS2: MOV A,R7 ;保存表格中數據的個數
MOV R6,A
MOV R2,#0 ;順序號初始化(指向表首)
FD21: CLR A ;讀取表格內容的高字節
MOVC A,@A+DPTR
XRL A,R4 ;與待查找內容的高字節比較
JNZ FD22
MOV A,#1 ;讀取表格內容的低字節
MOVC A,@A+DPTR
XRL A,R5 ;與待查找內容的低字節比較
JNZ FD22
CLR OV ;相同,查找成功
MOV A,R2 ;取對應的順序號
RET
FD22: INC DPTR ;指向下一個數據
INC DPTR
INC R2 ;順序號加一
DJNZ R6,FD21 ;查完全部數據
SETB OV ;未查找到,失敗
RET
(28) 標號:FDD1 功能:對分查找(ROM)單字節無符號增序數據表格
入口條件:待查找的內容在累加器A中,表格首址在DPTR中,字節數在R7中。
出口信息:OV=0 時,順序號在累加器A中;OV=1 時,未找到。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 2字節
FDD1: MOV B,A ;保存待查找的內容
MOV R2,#0 ;區間低端指針初始化(指向第一個數據)
MOV A,R7
DEC A
MOV R3,A ;區間高端指針初始化(指向最后一個數據)
FD61: CLR C ;判斷區間大小
MOV A,R3
SUBB A,R2
JC FD69 ;區間消失,查找失敗
RRC A ;取區間大小的一半
ADD A,R2 ;加上區間的低端
MOV R4,A ;得到區間的中心
MOVC A,@A+DPTR;讀取該點的內容
CJNE A,B,FD65;與待查找的內容比較
CLR OV ;相同,查找成功
MOV A,R4 ;取順序號
RET
FD65: JC FD68 ;該點的內容比待查找的內容大否?
MOV A,R4 ;偏大,取該點位置
DEC A ;減一
MOV R3,A ;作為新的區間高端
SJMP FD61 ;繼續查找
FD68: MOV A,R4 ;偏小,取該點位置
INC A ;加一
MOV R2,A ;作為新的區間低端
SJMP FD61 ;繼續查找
FD69: SETB OV ;查找失敗
RET
(29) 標號:FDD2 功能:對分查找(ROM)雙字節無符號增序數據表格
入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據個數在R7中。
出口信息:OV=0 時順序號在累加器A中,址在DPTR中;OV=1 時未找到。
影響資源:PSW、A、B、R1~R7、DPTR 堆棧需求: 2字節
FDD2: MOV R2,#0 ;區間低端指針初始化(指向第一個數據)
MOV A,R7
DEC A
MOV R3,A ;區間高端指針初始化,指向最后一個數據
MOV R6,DPH ;保存表格首址
MOV R7,DPL
FD81: CLR C ;判斷區間大小
MOV A,R3
SUBB A,R2
JC FD89 ;區間消失,查找失敗
RRC A ;取區間大小的一半
ADD A,R2 ;加上區間的低端
MOV R1,A ;得到區間的中心
MOV DPH,R6
CLR C ;計算區間中心的地址
RLC A
JNC FD82
INC DPH
FD82: ADD A,R7
MOV DPL,A
JNC FD83
INC DPH
FD83: CLR A ;讀取該點的內容的高字節
MOVC A,@A+DPTR
MOV B,R4 ;與待查找內容的高字節比較
CJNE A,B,FD84;不相同
MOV A,#1 ;讀取該點的內容的低字節
MOVC A,@A+DPTR
MOV B,R5
CJNE A,B,FD84;與待查找內容的低字節比較
MOV A,R1 ;取順序號
CLR OV ;查找成功
RET
FD84: JC FD86 ;該點的內容比待查找的內容大否?
MOV A,R1 ;偏大,取該點位置
DEC A ;減一
MOV R3,A ;作為新的區間高端
SJMP FD81 ;繼續查找
FD86: MOV A,R1 ;偏小,取該點位置
INC A ;加一
MOV R2,A ;作為新的區間低端
SJMP FD81 ;繼續查找
FD89: MOV DPH,R6 ;相同,恢復首址
MOV DPL,R7
SETB OV ;查找失敗
RET
(30) 標號: DDM1 功能:求單字節十六進制無符號數據塊的平均值
入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:平均值在累加器A中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節
DDM1: MOV A,R7 ;保存數據個數
MOV R2,A
PUSH DPH
PUSH DPL
CLR A ;初始化累加和
MOV R4,A
MOV R5,A
DM11: MOVX A,@DPTR ;讀取一個數據
ADD A,R5 ;累加到累加和中
MOV R5,A
JNC DM12
INC R4
DM12: INC DPTR ;調整指針
DJNZ R2,DM11 ;累加完全部數據
LCALL D457 ;求平均值(R4R5/R7-→R3)
MOV A,R3 ;取平均值
POP DPL
POP DPH
RET
(31) 標號: DDM2 功能:求雙字節十六進制無符號數據塊的平均值
入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R7中。
出口信息:平均值在R4、R5中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節
DDM2: MOV A,R7 ;保存數據個數
MOV R2,A ;初始化數據指針
PUSH DPL ;保持首址
PUSH DPH
CLR A ;初始化累加和
MOV R3,A
MOV R4,A
MOV R5,A
DM20: MOVX A,@DPTR ;讀取一個數據的高字節
MOV B,A
INC DPTR
MOVX A,@DPTR ;讀取一個數據的低字節
INC DPTR
ADD A,R5 ;累加到累加和中
MOV R5,A
MOV A,B
ADDC A,R4
MOV R4,A
JNC DM21
INC R3
DM21: DJNZ R2,DM20 ;累加完全部數據
POP DPH ;恢復首址
POP DPL
LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值
(32) 標號: XR1 功能:求單字節數據塊的(異或)校驗和
入口條件:數據塊的首址在DPTR中,數據的個數在R6、R7中。
出口信息:校驗和在累加器A中。
影響資源:PSW、A、B、R4~R7 堆棧需求: 2字節
XR1: MOV R4,DPH ;保存數據塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節計數器調整
JZ XR10
INC R6
XR10: MOV B,#0 ;校驗和初始化
XR11: MOVX A,@DPTR ;讀取一個數據
XRL B,A ;異或運算
INC DPTR ;指向下一個數據
DJNZ R7,XR11 ;雙字節計數器減一
DJNZ R6,XR11
MOV DPH,R4 ;恢復數據首址
MOV DPL,R5
MOV A,B ;取校驗和
RET
(33) 標號: XR2 功能:求雙字節數據塊的(異或)校驗和
入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R6、R7中。
出口信息:校驗和在R2、R3中。
影響資源:PSW、A、R2~R7 堆棧需求: 2字節
XR2: MOV R4,DPH ;保存數據塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節計數器調整
JZ XR20
INC R6
XR20: CLR A ;校驗和初始化
MOV R2,A
MOV R3,A
XR21: MOVX A,@DPTR ;讀取一個數據的高字節
XRL A,R2 ;異或運算
MOV R2,A
INC DPTR
MOVX A,@DPTR ;讀取一個數據的低字節
XRL A,R3 ;異或運算
MOV R3,A
INC DPTR ;指向下一個數據
DJNZ R7,XR21 ;雙字節計數器減一
DJNZ R6,XR21
MOV DPH,R4 ;恢復數據首址
MOV DPL,R5
RET
(34) 標號: SORT 功能:單字節無符號數據塊排序(增序)
入口條件:數據塊的首址在R0中,字節數在R7中。
出口信息:完成排序(增序)
影響資源:PSW、A、R2~R6 堆棧需求: 2字節
SORT: MOV A,R7
MOV R5,A ;比較次數初始化
SRT1: CLR F0 ;交換標志初始化
MOV A,R5 ;取上遍比較次數
DEC A ;本遍比上遍減少一次
MOV R5,A ;保存本遍次數
MOV R2,A ;復制到計數器中
JZ SRT5 ;若為零,排序結束
MOV A,R0 ;保存數據指針
MOV R6,A
SRT2: MOV A,@R0 ;讀取一個數據
MOV R3,A
INC R0 ;指向下一個數據
MOV A,@R0 ;再讀取一個數據
MOV R4,A
CLR C
SUBB A,R3 ;比較兩個數據的大小
JNC SRT4 ;順序正確(增序或相同),不必交換
SETB F0 ;設立交換標志
MOV A,R3 ;將兩個數據交換位置
MOV @R0,A
DEC R0
MOV A,R4
MOV @R0,A
INC R0 ;指向下一個數據
SRT4: DJNZ R2,SRT2 ;完成本遍的比較次數
MOV A,R6 ;恢復數據首址
MOV R0,A
JB F0,SRT1 ;本遍若進行過交換,則需繼續排序
SRT5: RET ;排序結束
END
(二) MCS-51 浮點運算子程序庫及其使用說明
本浮點子程序庫有三個不同層次的版本,以便適應不同的應用場合:
1.小型庫(FQ51A.ASM):只包含浮點加、減、乘、除子程序。
2.中型庫(FQ51B.ASM):在小型庫的基礎上再增加絕對值、倒數、比較、平方、開平方、
數制轉換等子程序。
3.大型庫(FQ51.ASM):包含本說明書中的全部子程序。
為便于讀者使用本程序庫,先將有關約定說明如下:
1.雙字節定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續單元中的數
據,地址小的單元存放高字節。如果[R0]=1234H,若(R0)=30H,則(30H)=12H,(31H)=34H。
2.二進制浮點操作數:用三個字節表示,第一個字節的最高位為數符,其余七位為
階碼(補碼形式),第二字節為尾數的高字節,第三字節為尾數的低字節,尾數用雙字節
純小數(原碼)來表示。當尾數的最高位為1時,便稱為規格化浮點數,簡稱操作數。在
程序說明中,也用[R0]或[R1]來表示R0或R1指示的浮點操作數,例如:當[R0]=-6.000時,
則二進制浮點數表示為83C000H。若(R0)=30H,則(30H)=83H,(31H)=0C0H,(32H)=00H。
3.十進制浮點操作數:用三個字節表示,第一個字節的最高位為數符,其余七位為
階碼(二進制補碼形式),第二字節為尾數的高字節,第三字節為尾數的低字節,尾數用
雙字節BCD碼純小數(原碼)來表示。當十進制數的絕對值大于1時,階碼就等于整數
部分的位數,如 876.5 的階碼是03H,-876.5 的階碼是 83H;當十進制數的絕對值小于1
時,階碼就等于 80H 減去小數點后面零的個數,例如 0.00382 的階碼是 7EH,-0.00382
的階碼是 0FEH。在程序說明中,用[R0]或[R1]來表示R0或R1指示的十進制浮點操作數。例
如有一個十進制浮點操作數存放在30H、31H、32H中,數值是 -0.07315,即-0.7315乘以10
的-1次方,則(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]來指向它,則應使(R0)=30H。
4.運算精度:單次定點運算精度為結果最低位的當量值;單次二進制浮點算術運算
的精度優于十萬分之三;單次二進制浮點超越函數運算的精度優于萬分之一;BCD碼浮
點數本身的精度比較低(萬分之一到千分之一),不宜作為運算的操作數,僅用于輸入或
輸出時的數制轉換。不管那種數據格式,隨著連續運算的次數增加,精度都會下降。
5.工作區:數據工作區固定在A、B、R2~R7,數符或標志工作區固定在PSW和23H單
元(位1CH~1FH)。在浮點系統中,R2、R3、R4和位1FH為第一工作區,R5、R6、R7和位1EH
為第二工作區。用戶只要不在工作區中存放無關的或非消耗性的信息,程序就具有較好的
透明性。
6.子程序調用范例:由于本程序庫特別注意了各子程序接口的相容性,很容易采用
積木方式(或流水線方式)完成一個公式的計算。以浮點運算為例:
計算 y = Ln √ | Sin (ab/c+d) |
已知:a=-123.4;b=0.7577;c=56.34;d=1.276; 它們分別存放在30H、33H、36H、
39H開始的連續三個單元中。用BCD碼浮點數表示時,分別為a=831234H;b=007577H;
c=025634H;d=011276H。
求解過程:通過調用BTOF子程序,將各變量轉換成二進制浮點操作數,再進行各
種運算,最后調用FTOB子程序,還原成十進制形式,供輸出使用。程序如下:
TEST: MOV R0,#39H ;指向BCD碼浮點操作數d
LCALL BTOF ;將其轉換成二進制浮點操作數
MOV R0,#36H ;指向BCD碼浮點操作數c
LCALL BTOF ;將其轉換成二進制浮點操作數
MOV R0,#33H ;指向BCD碼浮點操作數b
LCALL BTOF ;將其轉換成二進制浮點操作數
MOV R0,#30H ;指向BCD碼浮點操作數a
LCALL BTOF ;將其轉換成二進制浮點操作數
MOV R1,#33H ;指向二進制浮點操作數b
LCALL FMUL ;進行浮點乘法運算
MOV R1,#36H ;指向二進制浮點操作數c
LCALL FDIV ;進行浮點除法運算
MOV R1,#39H ;指向二進制浮點操作數d
LCALL FADD ;進行浮點加法運算
LCALL FSIN ;進行浮點正弦運算
LCALL FABS ;進行浮點絕對值運算
LCALL FSQR ;進行浮點開平方運算
LCALL FLN ;進行浮點對數運算
LCALL FTOB ;將結果轉換成BCD碼浮點數
STOP: LJMP STOP
END
運行結果,[R0]=804915H,即y=-0.4915,比較精確的結果應該是-0.491437。
(1) 標號: FSDT 功能:浮點數格式化
入口條件:待格式化浮點操作數在[R0]中。
出口信息:已格式化浮點操作數仍在[R0]中。
影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節
FSDT: LCALL MVR0 ;將待格式化操作數傳送到第一工作區中
LCALL RLN ;通過左規完成格式化
LJMP MOV0 ;將已格式化浮點操作數傳回到[R0]中
(2) 標號: FADD 功能:浮點數加法
入口條件:被加數在[R0]中,加數在[R1]中。
出口信息:OV=0時,和仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 6字節
FADD: CLR F0 ;設立加法標志
SJMP AS ;計算代數和
(3) 標號: FSUB 功能:浮點數減法
入口條件:被減數在[R0]中,減數在[R1]中。
出口信息:OV=0時,差仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
FSUB: SETB F0 ;設立減法標志
AS: LCALL MVR1 ;計算代數和。先將[R1]傳送到第二工作區
MOV C,F0 ;用加減標志來校正第二操作數的有效符號
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV 1EH,C ;將第二操作數的有效符號存入位1EH中
XRL A,@R0 ;與第一操作數的符號比較
RLC A
MOV F0,C ;保存比較結果
LCALL MVR0 ;將[R0]傳送到第一工作區中
LCALL AS1 ;在工作寄存器中完成代數運算
MOV0: INC R0 ;將結果傳回到[R0]中的子程序入口
INC R0
MOV A,R4 ;傳回尾數的低字節
MOV @R0,A
DEC R0
MOV A,R3 ;傳回尾數的高字節
MOV @R0,A
DEC R0
MOV A,R2 ;取結果的階碼
MOV C,1FH ;取結果的數符
MOV ACC.7,C ;拼入階碼中
MOV @R0,A
CLR ACC.7 ;不考慮數符
CLR OV ;清除溢出標志
CJNE A,#3FH,MV01;階碼是否上溢?
SETB OV ;設立溢出標志
MV01: MOV A,@R0 ;取出帶數符的階碼
RET
MVR0: MOV A,@R0 ;將[R0]傳送到第一工作區中的子程序
MOV C,ACC.7 ;將數符保存在位1FH中
MOV 1FH,C
MOV C,ACC.6 ;將階碼擴充為8bit補碼
MOV ACC.7,C
MOV R2,A ;存放在R2中
INC R0
MOV A,@R0 ;將尾數高字節存放在R3中
MOV R3,A
INC R0
MOV A,@R0 ;將尾數低字節存放在R4中
MOV R4,A
DEC R0 ;恢復數據指針
DEC R0
RET
MVR1: MOV A,@R1 ;將[R1]傳送到第二工作區中的子程序
MOV C,ACC.7 ;將數符保存在位1EH中
MOV 1EH,C
MOV C,ACC.6 ;將階碼擴充為8bit補碼
MOV ACC.7,C
MOV R5,A ;存放在R5中
INC R1
MOV A,@R1 ;將尾數高字節存放在R6中
MOV R6,A
INC R1
MOV A,@R1 ;將尾數低字節存放在R7中
MOV R7,A
DEC R1 ;恢復數據指針
DEC R1
RET
AS1: MOV A,R6 ;讀取第二操作數尾數高字節
ORL A,R7
JZ AS2 ;第二操作數為零,不必運算
MOV A,R3 ;讀取第一操作數尾數高字節
ORL A,R4
JNZ EQ1
MOV A,R6 ;第一操作數為零,結果以第二操作數為準
MOV R3,A
MOV A,R7
MOV R4,A
MOV A,R5
MOV R2,A
MOV C,1EH
MOV 1FH,C
AS2: RET
EQ1: MOV A,R2 ;對階,比較兩個操作數的階碼
XRL A,R5
JZ AS4 ;階碼相同,對階結束
JB ACC.7,EQ3;階符互異
MOV A,R2 ;階符相同,比較大小
CLR C
SUBB A,R5
JC EQ4
EQ2: CLR C ;第二操作數右規一次
MOV A,R6 ;尾數縮小一半
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC R5 ;階碼加一
ORL A,R6 ;尾數為零否?
JNZ EQ1 ;尾數不為零,繼續對階
MOV A,R2 ;尾數為零,提前結束對階
MOV R5,A
SJMP AS4
EQ3: MOV A,R2 ;判斷第一操作數階符
JNB ACC.7,EQ2;如為正,右規第二操作數
EQ4: CLR C
LCALL RR1 ;第一操作數右規一次
ORL A,R3 ;尾數為零否?
JNZ EQ1 ;不為零,繼續對階
MOV A,R5 ;尾數為零,提前結束對階
MOV R2,A
AS4: JB F0,AS5 ;尾數加減判斷
MOV A,R4 ;尾數相加
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC AS2
LJMP RR1 ;有進位,右規一次
AS5: CLR C ;比較絕對值大小
MOV A,R4
SUBB A,R7
MOV B,A
MOV A,R3
SUBB A,R6
JC AS6
MOV R4,B ;第一尾數減第二尾數
MOV R3,A
LJMP RLN ;結果規格化
AS6: CPL 1FH ;結果的符號與第一操作數相反
CLR C ;結果的絕對值為第二尾數減第一尾數
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3 ;浮點數規格化
ORL A,R4 ;尾數為零否?
JNZ RLN1
MOV R2,#0C1H;階碼取最小值
RET
RLN1: MOV A,R3
JB ACC.7,RLN2;尾數最高位為一否?
CLR C ;不為一,左規一次
LCALL RL1
SJMP RLN ;繼續判斷
RLN2: CLR OV ;規格化結束
RET
RL1: MOV A,R4 ;第一操作數左規一次
RLC A ;尾數擴大一倍
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2 ;階碼減一
CJNE R2,#0C0H,RL1E;階碼下溢否?
CLR A
MOV R3,A ;階碼下溢,操作數以零計
MOV R4,A
MOV R2,#0C1H
RL1E: CLR OV
RET
RR1: MOV A,R3 ;第一操作數右規一次
RRC A ;尾數縮小一半
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
INC R2 ;階碼加一
CLR OV ;清溢出標志
CJNE R2,#40H,RR1E;階碼上溢否?
MOV R2,#3FH ;階碼溢出
SETB OV
RR1E: RET
(4) 標號: FMUL 功能:浮點數乘法
入口條件:被乘數在[R0]中,乘數在[R1]中。
出口信息:OV=0時,積仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
FMUL: LCALL MVR0 ;將[R0]傳送到第一工作區中
MOV A,@R0
XRL A,@R1 ;比較兩個操作數的符號
RLC A
MOV 1FH,C ;保存積的符號
LCALL MUL0 ;計算積的絕對值
LJMP MOV0 ;將結果傳回到[R0]中
MUL0: LCALL MVR1 ;將[R1]傳送到第二工作區中
MUL1: MOV A,R3 ;第一尾數為零否?
ORL A,R4
JZ MUL6
MOV A,R6 ;第二尾數為零否?
ORL A,R7
JZ MUL5
MOV A,R7 ;計算R3R4×R6R7-→R3R4
MOV B,R4
MUL AB
MOV A,B
XCH A,R7
MOV B,R3
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
XCH A,R4
MOV B,R6
MUL AB
ADD A,R7
MOV R7,A
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
RLC A
XCH A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
JB ACC.7,MUL2;積為規格化數否?
MOV A,R7 ;左規一次
RLC A
MOV R7,A
LCALL RL1
MUL2: MOV A,R7
JNB ACC.7,MUL3
INC R4
MOV A,R4
JNZ MUL3
INC R3
MOV A,R3
JNZ MUL3
MOV R3,#80H
INC R2
MUL3: MOV A,R2 ;求積的階碼
ADD A,R5
MD: MOV R2,A ;階碼溢出判斷
JB ACC.7,MUL4
JNB ACC.6,MUL6
MOV R2,#3FH ;階碼上溢,設立標志
SETB OV
RET
MUL4: JB ACC.6,MUL6
MUL5: CLR A ;結果清零(因子為零或階碼下溢)
MOV R3,A
MOV R4,A
MOV R2,#41H
MUL6: CLR OV
RET
(5) 標號: FDIV 功能:浮點數除法
入口條件:被除數在[R0]中,除數在[R1]中。
出口信息:OV=0時,商仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節
FDIV: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ DIV1
MOV @R0,#41H;被除數為零,不必運算
CLR OV
RET
DIV1: INC R1
MOV A,@R1
INC R1
ORL A,@R1
DEC R1
DEC R1
JNZ DIV2
SETB OV ;除數為零,溢出
RET
DIV2: LCALL MVR0 ;將[R0]傳送到第一工作區中
MOV A,@R0
XRL A,@R1 ;比較兩個操作數的符號
RLC A
MOV 1FH,C ;保存結果的符號
LCALL MVR1 ;將[R1]傳送到第二工作區中
LCALL DIV3 ;調用工作區浮點除法
LJMP MOV0 ;回傳結果
DIV3: CLR C ;比較尾數的大小
MOV A,R4
SUBB A,R7
MOV A,R3
SUBB A,R6
JC DIV4
LCALL RR1 ;被除數右規一次
SJMP DIV3
DIV4: CLR A ;借用R0R1R2作工作寄存器
XCH A,R0 ;清零并保護之
PUSH ACC
CLR A
XCH A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV B,#10H ;除法運算,R3R4/R6R7-→R0R1
DIV5: CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R4
RLC A
MOV R4,A
XCH A,R3
RLC A
XCH A,R3
MOV F0,C
CLR C
SUBB A,R7
MOV R2,A
MOV A,R3
SUBB A,R6
ANL C,/F0
JC DIV6
MOV R3,A
MOV A,R2
MOV R4,A
INC R1
DIV6: DJNZ B,DIV5
MOV A,R6 ;四舍五入
CLR C
RRC A
SUBB A,R3
CLR A
ADDC A,R1 ;將結果存回R3R4
MOV R4,A
CLR A
ADDC A,R0
MOV R3,A
POP ACC ;恢復R0R1R2
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
MOV A,R2 ;計算商的階碼
CLR C
SUBB A,R5
LCALL MD ;階碼檢驗
LJMP RLN ;規格化
(6) 標號: FCLR 功能:浮點數清零
入口條件:操作數在[R0]中。
出口信息:操作數被清零。
影響資源:A 堆棧需求: 2字節
FCLR: INC R0
INC R0
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
DEC R0
MOV @R0,#41H
RET
(7) 標號: FZER 功能:浮點數判零
入口條件:操作數在[R0]中。
出口信息:若累加器A為零,則操作數[R0]為零,否則不為零。
影響資源:A 堆棧需求: 2字節
FZER: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ ZERO
MOV @R0,#41H
ZERO: RET
(8) 標號: FMOV 功能:浮點數傳送
入口條件:源操作數在[R1]中,目標地址為[R0]。
出口信息:[R0]=[R1],[R1]不變。
影響資源:A 堆棧需求: 2字節
FMOV: INC R0
INC R0
INC R1
INC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
RET
(9) 標號: FPUS 功能:浮點數壓棧
入口條件:操作數在[R0]中。
出口信息:操作數壓入棧頂。
影響資源:A、R2、R3 堆棧需求: 5字節
FPUS: POP ACC ;將返回地址保存在R2R3中
MOV R2,A
POP ACC
MOV R3,A
MOV A,@R0 ;將操作數壓入堆棧
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
DEC R0
DEC R0
MOV A,R3 ;將返回地址壓入堆棧
PUSH ACC
MOV A,R2
PUSH ACC
RET ;返回主程序
(10) 標號: FPOP 功能:浮點數出棧
入口條件:操作數處于棧頂。
出口信息:操作數彈至[R0]中。
影響資源:A、R2、R3 堆棧需求: 2字節
FPOP: POP ACC ;將返回地址保存在R2R3中
MOV R2,A
POP ACC
MOV R3,A
INC R0
INC R0
POP ACC ;將操作數彈出堆棧,傳送到[R0]中
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
MOV A,R3 ;將返回地址壓入堆棧
PUSH ACC
MOV A,R2
PUSH ACC
RET ;返回主程序
(11) 標號: FCMP 功能:浮點數代數值比較(不影響待比較操作數)
入口條件:待比較操作數分別在[R0]和[R1]中。
出口信息:若CY=1,則[R0] < [R1],若CY=0且A=0則 [R0] = [R1],否則[R0] > [R1]。
影響資源:A、B、PSW 堆棧需求: 2字節
FCMP: MOV A,@R0 ;數符比較
XRL A,@R1
JNB ACC.7,CMP2
MOV A,@R0 ;兩數異號,以[R0]數符為準
RLC A
MOV A,#0FFH
RET
CMP2: MOV A,@R1 ;兩數同號,準備比較階碼
MOV C,ACC.6
MOV ACC.7,C
MOV B,A
MOV A,@R0
MOV C,ACC.7
MOV F0,C ;保存[R0]的數符
MOV C,ACC.6
MOV ACC.7,C
CLR C ;比較階碼
SUBB A,B
JZ CMP6
RLC A ;取階碼之差的符號
JNB F0,CMP5
CPL C ;[R0]為負時,結果取反
CMP5: MOV A,#0FFH ;兩數不相等
RET
CMP6: INC R0 ;階碼相同時,準備比較尾數
INC R0
INC R1
INC R1
CLR C
MOV A,@R0
SUBB A,@R1
MOV B,A ;保存部分差
DEC R0
DEC R1
MOV A,@R0
SUBB A,@R1
DEC R0
DEC R1
ORL A,B ;生成是否相等信息
JZ CMP7
JNB F0,CMP7
CPL C ;[R0]為負時,結果取反
CMP7: RET
(12) 標號: FABS 功能:浮點絕對值函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:A 堆棧需求: 2字節
FABS: MOV A,@R0 ;讀取操作數的階碼
CLR ACC.7 ;清除數符
MOV @R0,A ;回傳階碼
RET
(13) 標號: FSGN 功能:浮點符號函數
入口條件:操作數在[R0]中。
出口信息:累加器 A=1 時為正數,A=0FFH時為負數,A=0 時為零。
影響資源:PSW、A 堆棧需求: 2字節
FSGN: INC R0 ;讀尾數
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ SGN
RET ;尾數為零,結束
SGN: MOV A,@R0 ;讀取操作數的階碼
RLC A ;取數符
MOV A,#1 ;按正數初始化
JNC SGN1 ;是正數,結束
MOV A,#0FFH ;是負數,改變標志
SGN1: RET
(14) 標號: FINT 功能:浮點取整函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節
FINT: LCALL MVR0 ;將[R0]傳送到第一工作區中
LCALL INT ;在工作寄存器中完成取整運算
LJMP MOV0 ;將結果傳回到[R0]中
INT: MOV A,R3
ORL A,R4
JNZ INTA
CLR 1FH ;尾數為零,階碼也清零,結束取整
MOV R2,#41H
RET
INTA: MOV A,R2
JZ INTB ;階碼為零否?
JB ACC.7,INTB;階符為負否?
CLR C
SUBB A,#10H ;階碼小于16否?
JC INTD
RET ;階碼大于16,已經是整數
INTB: CLR A ;絕對值小于一,取整后正數為零,負數為負一
MOV R4,A
MOV C,1FH
RRC A
MOV R3,A
RL A
MOV R2,A
JNZ INTC
MOV R2,#41H
INTC: RET
INTD: CLR F0 ;舍尾標志初始化
INTE: CLR C
LCALL RR1 ;右規一次
ORL C,F0 ;記憶舍尾情況
MOV F0,C
CJNE R2,#10H,INTE;階碼達到16(尾數完全為整數)否?
JNB F0,INTF ;舍去部分為零否?
JNB 1FH,INTF;操作數為正數否?
INC R4 ;對于帶小數的負數,向下取整
MOV A,R4
JNZ INTF
INC R3
INTF: LJMP RLN ;將結果規格化
(15) 標號: FRCP 功能:浮點倒數函數
入口條件:操作數在[R0]中。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節
FRCP: MOV A,@R0
MOV C,ACC.7
MOV 1FH,C ;保存數符
MOV C,ACC.6 ;絕對值傳送到第二工作區
MOV ACC.7,C
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
DEC R0
DEC R0
ORL A,R6
JNZ RCP
SETB OV ;零不能求倒數,設立溢出標志
RET
RCP: MOV A,R6
JB ACC.7,RCP2;操作數格式化否?
CLR C ;格式化之
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R5
SJMP RCP
RCP2: MOV R2,#1 ;將數值1.00傳送到第一工作區
MOV R3,#80H
MOV R4,#0
LCALL DIV3 ;調用工作區浮點除法,求得倒數
LJMP MOV0 ;回傳結果
(16) 標號: FSQU 功能:浮點數平方
入口條件:操作數在[R0]中。
出口信息:OV=0時,平方值仍然在[R0]中,OV=1時溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 9字節
FSQU: MOV A,R0 ;將操作數
XCH A,R1 ;同時作為乘數
PUSH ACC ;保存R1指針
LCALL FMUL ;進行乘法運算
POP ACC
MOV R1,A ;恢復R1指針
RET
(17) 標號: FSQR 功能:浮點數開平方(快速逼近算法)
入口條件:操作數在[R0]中。
出口信息:OV=0時,平方根仍在[R0]中,OV=1時,負數開平方出錯。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV ;負數開平方,出錯
RET
SQR: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ SQ
MOV @R0,#41H;尾數為零,不必運算
CLR OV
RET
SQ: MOV A,@R0
MOV C,ACC.6 ;將階碼擴展成8bit補碼
MOV ACC.7,C
INC A ;加一
CLR C
RRC A ;除二
MOV @R0,A ;得到平方根的階碼,回存之
INC R0 ;指向被開方數尾數的高字節
JC SQR0 ;原被開方數的階碼是奇數嗎?
MOV A,@R0 ;是奇數,尾數右規一次
RRC A
MOV @R0,A
INC R0
MOV A,@R0
RRC A
MOV @R0,A
DEC R0
SQR0: MOV A,@R0
JZ SQR9 ;尾數為零,不必運算
MOV R2,A ;將尾數傳送到R2R3中
INC R0
MOV A,@R0
MOV R3,A
MOV A,R2 ;快速開方,參閱定點子程序說明
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
SJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
SJMP SQR3
SQR2: MOV B,#8DH
MOV R4,#0D0H
SQR3: MUL AB
MOV A,B
ADD A,R4
MOV R4,A
MOV B,A
MUL AB
XCH A,R3
CLR C
SUBB A,R3
MOV R3,A
MOV A,B
XCH A,R2
SUBB A,R2
MOV R2,A
SQR4: SETB C
MOV A,R4
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5
INC R4
MOV R2,A
MOV R3,B
SJMP SQR4
SQR5: MOV A,R4
XCH A,R2
RRC A
MOV F0,C
MOV A,R3
MOV R5,A
MOV R4,#8
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6
MOV A,R3 ;將平方根的尾數回傳到[R0]中
MOV @R0,A
DEC R0
MOV A,R2
MOV @R0,A
SQR9: DEC R0 ;數據指針回歸原位
CLR OV ;開方結果有效
RET
(18) 標號: FPLN 功能:浮點數多項式計算
入口條件:自變量在[R0]中,多項式系數在調用指令之后,以40H結束。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 4字節
FPLN: POP DPH ;取出多項式系數存放地址
POP DPL
XCH A,R0 ;R0、R1交換角色,自變量在[R1]中
XCH A,R1
XCH A,R0
CLR A ;清第一工作區
MOV R2,A
MOV R3,A
MOV R4,A
CLR 1FH
PLN1: CLR A ;讀取一個系數,并裝入第二工作區
MOVC A,@A+DPTR
MOV C,ACC.7
MOV 1EH,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R6,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R7,A
INC DPTR ;指向下一個系數
MOV C,1EH ;比較兩個數符
RRC A
XRL A,23H
RLC A
MOV F0,C ;保存比較結果
LCALL AS1 ;進行代數加法運算
CLR A ;讀取下一個系數的第一個字節
MOVC A,@A+DPTR
CJNE A,#40H,PLN2;是結束標志嗎?
XCH A,R0 ;運算結束,恢復R0、R1原來的角色
XCH A,R1
XCH A,R0
LCALL MOV0 ;將結果回傳到[R0]中
CLR A
INC DPTR
JMP @A+DPTR ;返回主程序
PLN2: MOV A,@R1 ;比較自變量和中間結果的符號
XRL A,23H
RLC A
MOV 1FH,C ;保存比較結果
LCALL MUL0 ;進行乘法運算
SJMP PLN1 ;繼續下一項運算
(19) 標號: FLOG 功能:以10為底的浮點對數函數
入口條件:操作數在[R0]中。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,負數或零求對數出錯。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:9字節
FLOG: LCALL FLN ;先以e為底求對數
JNB OV,LOG
RET ;如溢出則停止計算
LOG: MOV R5,#0FFH;系數0.43430(1/Ln10)
MOV R6,#0DEH
MOV R7,#5CH
LCALL MUL1 ;通過相乘來換底
LJMP MOV0 ;傳回結果
(20) 標號: FLN 功能:以e為底的浮點對數函數
入口條件:操作數在[R0]中。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,負數或零求對數出錯。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 7字節
FLN: LCALL MVR0 ;將[R0]傳送到第一工作區
JB 1FH,LNOV;負數或零求對數,出錯
MOV A,R3
ORL A,R4
JNZ LN0
LNOV: SETB OV
RET
LN0: CLR C
LCALL RL1 ;左規一次
CLR A
XCH A,R2 ;保存原階碼,清零工作區的階碼
PUSH ACC
LCALL RLN ;規格化
LCALL MOV0 ;回傳
LCALL FPLN ;用多項式計算尾數的對數
DB 7BH,0F4H,30H;0.029808
DB 0FEH,85H,13H;-0.12996
DB 7FH,91H,51H;0.28382
DB 0FFH,0FAH,0BAH;-0.4897
DB 0,0FFH,0CAH;0.99918
DB 70H,0C0H,0;1.1442×10-5
DB 40H ;結束
POP ACC ;取出原階碼
JNZ LN1
RET ;如為零,則結束
LN1: CLR 1EH ;清第二區數符
MOV C,ACC.7
MOV F0,C ;保存階符
JNC LN2
CPL A ;當階碼為負時,求其絕對值
INC A
LN2: MOV R2,A ;階碼的絕對值乘以0.69315
MOV B,#72H
MUL AB
XCH A,R2
MOV R7,B
MOV B,#0B1H
MUL AB
ADD A,R7
MOV R7,A ;乘積的尾數在R6R7R2中
CLR A
ADDC A,B
MOV R6,A
MOV R5,#8 ;乘積的階碼初始化(整數部分為一字節)
LN3: JB ACC.7,LN4;乘積格式化
MOV A,R2
RLC A
MOV R2,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R5
SJMP LN3
LN4: MOV C,F0 ;取出階符,作為乘積的數符
MOV ACC.7,C
LJMP ASN ;與尾數的對數合并,得原操作數的對數
(21) 標號: FE10 功能:以10為底的浮點指數函數
入口條件:操作數在[R0]中。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
FE10: MOV R5,#2 ;加權系數為3.3219(Log210)
MOV R6,#0D4H
MOV R7,#9AH
SJMP EXP ;先進行加權運算,后以2為底統一求冪
(22) 標號: FEXP 功能:以e為底的浮點指數函數
入口條件:操作數在[R0]中。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
FEXP: MOV R5,#1 ;加權系數為1.44272(Lng2e)
MOV R6,#0B8H
MOV R7,#0ABH
EXP: CLR 1EH ;加權系數為正數
LCALL MVR0 ;將[R0]傳送到第一工作區
LCALL MUL1 ;進行加權運算
SJMP E20 ;以2為底統一求冪
(23) 標號: FE2 功能:以2為底的浮點指數函數
入口條件:操作數在[R0]中。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
FE2: LCALL MVR0 ;將[R0]傳送到第一工作區
E20: MOV A,R3
ORL A,R4
JZ EXP1 ;尾數為零
MOV A,R2
JB ACC.7,EXP2;階符為負?
SETB C
SUBB A,#6 ;階碼大于6否?
JC EXP2
JB 1FH,EXP0;數符為負否?
MOV @R0,#3FH;正指數過大,冪溢出
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
SETB OV
RET
EXP0: MOV @R0,#41H;負指數過大,冪下溢,清零處理
CLR A
INC R0
MOV @R0,A
INC R0
MOV @R0,A
DEC R0
DEC R0
CLR OV
RET
EXP1: MOV @R0,#1 ;指數為零,冪為1.00
INC R0
MOV @R0,#80H
INC R0
MOV @R0,#0
DEC R0
DEC R0
CLR OV
RET
EXP2: MOV A,R2 ;將指數復制到第二工作區
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
MOV C,1FH
MOV 1EH,C
LCALL INT ;對第一區取整
MOV A,R3
JZ EXP4
EXP3: CLR C ;使尾數高字節R3對應一個字節整數
RRC A
INC R2
CJNE R2,#8,EXP3
EXP4: MOV R3,A
JNB 1FH,EXP5
CPL A ;并用補碼表示
INC A
EXP5: PUSH ACC ;暫時保存之
LCALL RLN ;重新規格化
CPL 1FH
SETB F0
LCALL AS1 ;求指數的小數部分
LCALL MOV0 ;回傳指數的小數部分
LCALL FPLN ;通過多項式計算指數的小數部分的冪
DB 77H,0B1H,0C9H;1.3564×10-3
DB 7AH,0A1H,68H;9.8514×10-3
DB 7CH,0E3H,4FH;0.055495
DB 7EH,0F5H,0E7H;0.24014
DB 0,0B1H,72H;0.69315
DB 1,80H,0 ;1.00000
DB 40H ;結束
POP ACC ;取出指數的整數部分
ADD A,R2 ;按補碼加到冪的階碼上
MOV R2,A
CLR 1FH ;冪的符號為正
LJMP MOV0 ;將冪傳回[R0]中
(24)標號: DTOF 功能:雙字節十六進制定點數轉換成格式化浮點數
入口條件:雙字節定點數的絕對值在[R0]中,數符在位1FH中,整數部分的位數在A中。
出口信息:轉換成格式化浮點數在[R0]中(三字節)。
影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節
DTOF: MOV R2,A ;按整數的位數初始化階碼
MOV A,@R0 ;將定點數作尾數
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
LCALL RLN ;進行規格化
LJMP MOV0 ;傳送結果到[R0]中
(25) 標號: FTOD 功能:格式化浮點數轉換成雙字節定點數
入口條件:格式化浮點操作數在[R0]中。
出口信息:OV=1時溢出,OV=0時轉換成功:定點數的絕對值在[R0]中(雙字節),數符
在位1FH中,F0=1 時為整數,CY=1時為一字節整數一字節小數,否則為純小數。
影響資源:PSW、A、B、R2、R3、R4、位1FH 堆棧需求: 6字節
FTOD: LCALL MVR0 ;將[R0]傳送到第一工作區
MOV A,R2
JZ FTD4 ;階碼為零,純小數
JB ACC.7,FTD4;階碼為負,純小數
SETB C
SUBB A,#10H
JC FTD1
SETB OV ;階碼大于16,溢出
RET
FTD1: SETB C
MOV A,R2
SUBB A,#8 ;階碼大于8否?
JC FTD3
FTD2: MOV B,#10H ;階碼大于8,按雙字節整數轉換
LCALL FTD8
SETB F0 ;設立雙字節整數標志
CLR C
CLR OV
RET
FTD3: MOV B,#8 ;按一字節整數一字節小數轉換
LCALL FTD8
SETB C ;設立一字節整數一字節小數標志
CLR F0
CLR OV
RET
FTD4: MOV B,#0 ;按純小數轉換
LCALL FTD8
CLR OV ;設立純小數標志
CLR F0
CLR C
RET
FTD8: MOV A,R2 ;按規定的整數位數進行右規
CJNE A,B,FTD9
MOV A,R3 ;將雙字節結果傳送到[R0]中
MOV @R0,A
INC R0
MOV A,R4
MOV @R0,A
DEC R0
RET
FTD9: CLR C
LCALL RR1 ;右規一次
SJMP FTD8
(26) 標號: BTOF 功能:浮點BCD碼轉換成格式化浮點數
入口條件:浮點BCD碼操作數在[R0]中。
出口信息:轉換成的格式化浮點數仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1DH~1FH 堆棧需求:6字節
BTOF: INC R0 ;判斷是否為零。
INC R0
MOV A,@R0
MOV R7,A
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
ORL A,R7
JNZ BTF0
MOV @R0,#41H;為零,轉換結束。
RET
BTF0: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存數符。
CLR 1FH ;以絕對值進行轉換。
MOV C,ACC.6 ;擴充階碼為八位。
MOV ACC.7,C
MOV @R0,A
JNC BTF1
ADD A,#19 ;是否小于1E-19?
JC BTF2
MOV @R0,#41H;小于1E-19時以0計。
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
DEC R0
DEC R0
RET
BTF1: SUBB A,#19
JC BTF2
MOV A,#3FH ;大于1E19時封頂。
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
RET
BTF2: CLR A ;準備將BCD碼尾數轉換成十六進制浮點數。
MOV R4,A
MOV R3,A
MOV R2,#10H ;至少兩個字節。
BTF3: MOV A,R7
ADD A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
JNB ACC.7,BTF3;直到尾數規格化。
MOV A,R6 ;四舍五入。
ADD A,#0B0H
CLR A
ADDC A,R4
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
JNC BTF4
MOV R3,#80H
INC R2
BTF4: MOV DPTR,#BTFL;準備查表得到十進制階碼對應的浮點數。
MOV A,@R0
ADD A,#19 ;計算表格偏移量。
MOV B,#3
MUL AB
ADD A,DPL
MOV DPL,A
JNC BTF5
INC DPH
BTF5: CLR A ;查表。
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
LCALL MUL1 ;將階碼對應的浮點數和尾數對應的浮點數相乘。
MOV C,1DH ;取出數符。
MOV 1FH,C
LJMP MOV0 ;傳送轉換結果。
(27) 標號: FTOB 功能:格式化浮點數轉換成浮點BCD碼
入口條件:格式化浮點操作數在[R0]中。
出口信息:轉換成的浮點BCD碼仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1DH~1FH 堆棧需求:6字節
FTOB: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ FTB0
MOV @R0,#41H
RET
FTB0: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C
CLR ACC.7
MOV @R0,A
LCALL MVR0
MOV DPTR,#BFL0;絕對值大于或等于1時的查表起點。
MOV B,#0 ;十的0次冪。
MOV A,R2
JNB ACC.7,FTB1
MOV DPTR,#BTFL;絕對值小于1E-6時的查表起點。
MOV B,#0EDH ;十的-19次冪。
ADD A,#16
JNC FTB1
MOV DPTR,#BFLN;絕對值大于或等于1E-6時的查表起點。
MOV B,#0FAH ;十的-6次冪。
FTB1: CLR A ;查表,找到一個比待轉換浮點數大的整數冪。
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
MOV A,R5 ;和待轉換浮點數比較。
CLR C
SUBB A,R2
JB ACC.7,FTB2;差為負數。
JNZ FTB3
MOV A,R6
CLR C
SUBB A,R3
JC FTB2
JNZ FTB3
MOV A,R7
CLR C
SUBB A,R4
JC FTB2
JNZ FTB3
MOV R5,B ;正好是表格中的數。
INC R5 ;冪加一。
MOV R6,#10H ;尾數為0·1000。
MOV R7,#0
SJMP FTB6 ;傳送轉換結果。
FTB2: INC DPTR ;準備表格下一項。
INC DPTR
INC DPTR
INC B ;冪加一。
SJMP FTB1 ;
FTB3: PUSH B ;保存冪值。
LCALL DIV3 ;相除,得到一個二進制浮點數的純小數。
FTB4: MOV A,R2 ;取階碼。
JZ FTB5 ;為零嗎?
CLR C
LCALL RR1 ;右規。
SJMP FTB4
FTB5: POP ACC ;取出冪值。
MOV R5,A ;作為十進制浮點數的階碼。
LCALL HB2 ;轉換尾數的十分位和百分位。
MOV R6,A
LCALL HB2 ;轉換尾數的千分位和萬分位。
MOV R7,A
MOV A,R3 ;四舍五入。
RLC A
CLR A
ADDC A,R7
DA A
MOV R7,A
CLR A
ADDC A,R6
DA A
MOV R6,A
JNC FTB6
MOV R6,#10H
INC R5
FTB6: INC R0 ;存放轉換結果。
INC R0
MOV A,R7
MOV @R0,A
DEC R0
MOV A,R6
MOV @R0,A
DEC R0
MOV A,R5
MOV C,1DH ;取出數符。
MOV ACC.7,C
MOV @R0,A
RET
HB2: MOV A,R4 ;尾數擴大100倍。
MOV B,#100
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#100
MUL AB
ADD A,R3
MOV R3,A
JNC HB21
INC B
HB21: MOV A,B ;將整數部分轉換成BCD碼。
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
BTFL: DB 41H,0ECH,1EH ;1.0000E-19
DB 45H,93H,93H ;1.0000E-18
DB 48H,0B8H,78H ;1.0000E-17
DB 4BH,0E6H,96H ;1.0000E-16
DB 4FH,90H,1DH ;1.0000E-15
DB 52H,0B4H,25H ;1.0000E-14
DB 55H,0E1H,2EH ;1.0000E-13
DB 59H,8CH,0BDH ;1.0000E-12
DB 5CH,0AFH,0ECH ;1.0000E-11
DB 5FH,0DBH,0E7H ;1.0000E-10
DB 63H,89H,70H ;1.0000E-9
DB 66H,0ABH,0CCH ;1.0000E-8
DB 69H,0D6H,0C0H ;1.0000E-7
BFLN: DB 6DH,86H,38H ;1.0000E-6
DB 70H,0A7H,0C6H ;1.0000E-5
DB 73H,0D1H,0B7H ;1.0000E-4
DB 77H,83H,12H ;1.0000E-3
DB 7AH,0A3H,0D7H ;1.0000E-2
DB 7DH,0CCH,0CDH ;1.0000E-1
BFL0: DB 1,80H,00H ;1.0000
DB 4,0A0H,00H ;1.0000E1
DB 7,0C8H,00H ;1.0000E2
DB 0AH,0FAH,00H ;1.0000E3
DB 0EH,9CH,40H ;1.0000E4
DB 11H,0C3H,50H ;1.0000E5
DB 14H,0F4H,24H ;1.0000E6
DB 18H,98H,97H ;1.0000E7
DB 1BH,0BEH,0BCH ;1.0000E8
DB 1EH,0EEH,6BH ;1.0000E9
DB 22H,95H,03H ;1.0000E10
DB 25H,0BAH,44H ;1.0000E11
DB 28H,0E8H,0D5H ;1.0000E12
DB 2CH,91H,85H ;1.0000E13
DB 2FH,0B5H,0E6H ;1.0000E14
DB 32H,0E3H,60H ;1.0000E15
DB 36H,8EH,1CH ;1.0000E16
DB 39H,31H,0A3H ;1.0000E17
DB 3CH,0DEH,0BH ;1.0000E18
DB 40H,8AH,0C7H ;1.0000E19
(28) 標號: FCOS 功能:浮點余弦函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆棧需求: 6字節
FCOS: LCALL FABS ;COS(-X) = COS X
MOV R5,#1 ;常數1.5708(π/2)
MOV R6,#0C9H
MOV R7,#10H
CLR 1EH
LCALL MVR0
CLR F0
LCALL AS1 ;x+(π/2)
LCALL MOV0 ;保存結果,接著運行下面的FSIN程序
(29) 標號: FSIN 功能:浮點正弦函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆棧需求: 6字節
FSIN: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存自變量的符號
CLR ACC.7 ;統一按正數計算
MOV @R0,A
LCALL MVR0 ;將[R0]傳送到第一工作區
MOV R5,#0 ;系數0.636627(2/π)
MOV R6,#0A2H
MOV R7,#0FAH
CLR 1EH
LCALL MUL1 ;相乘,自變量按(π/2)規一化
MOV A,R2 ;將結果復制到第二區
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
LCALL INT ;第一區取整,獲得象限信息
MOV A,R2
JZ SIN2
SIN1: CLR C ;將浮點象限數轉換成定點象限數
LCALL RR1
CJNE R2,#10H,SIN1
MOV A,R4
JNB ACC.1,SIN2
CPL 1DH ;對于第三、四象限,結果取反
SIN2: JB ACC.0,SIN3
CPL 1FH ;對于第一、三象限,直接求規一化的小數
SJMP SIN4
SIN3: MOV A,R4 ;對于第二、四象限,準備求其補數
INC A
MOV R4,A
JNZ SIN4
INC R3
SIN4: LCALL RLN ;規格化
SETB F0
LCALL AS1 ;求自變量歸一化等效值
LCALL MOV0 ;回傳
LCALL FPLN ;用多項式計算正弦值
DB 7DH,93H,28H;0.07185
DB 41H,0,0 ;0
DB 80H,0A4H,64H;-0.64215
DB 41H,0,0 ;0
DB 1,0C9H,2;1.5704
DB 41H,0,0 ;0
DB 40H ;結束
MOV A,@R0 ;結果的絕對值超過1.00嗎?
JZ SIN5
JB ACC.6,SIN5
INC R0 ;絕對值按1.00封頂
MOV @R0,#80H
INC R0
MOV @R0,#0
DEC R0
DEC R0
MOV A,#1
SIN5: MOV C,1DH ;將數符拼入結果中
MOV ACC.7,C
MOV @R0,A
RET
(30) 標號: FATN 功能:浮點反正切函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1CH~1FH 堆棧需求:7字節
FATN: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存自變量數符
CLR ACC.7 ;自變量取絕對值
MOV @R0,A
CLR 1CH ;清求余運算標志
JB ACC.6,ATN1;自變量為純小數否?
JZ ATN1
SETB 1CH ;置位求余運算標志
LCALL FRCP ;通過倒數運算,轉換成純小數
ATN1: LCALL FPLN ;通過多項式運算,計算反正切函數值
DB 0FCH,0E4H,91H;-0.055802
DB 7FH,8FH,37H;0.27922
DB 0FFH,0EDH,0E0H;-0.46460
DB 7BH,0E8H,77H;0.028377
DB 0,0FFH,68H;0.9977
DB 72H,85H,0ECH;3.1930×10-5
DB 40H ;結束
JNB 1CH,ATN2;需要求余運算否?
CPL 1FH ;準備運算標志
MOV C,1FH
MOV F0,C ;常數1.5708(π/2)
MOV R5,#1
MOV R6,#0C9H
MOV R7,#10H
LCALL AS1 ;求余運算
LCALL MOV0 ;回傳
ATN2: MOV A,@R0 ;拼入結果的數符
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
RET
(31) 標號: RTOD 功能:浮點弧度數轉換成浮點度數
入口條件:浮點弧度數在[R0]中。
出口信息:轉換成的浮點度數仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
RTOD: MOV R5,#6 ;系數(180/π)傳送到第二工作區
MOV R6,#0E5H
MOV R7,#2FH
SJMP DR ;通過乘法進行轉換
(32) 標號: DTOR 功能:浮點度數轉換成浮點弧度數
入口條件:浮點度數在[R0]中。
出口信息:轉換成的浮點弧度數仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
DTOR: MOV R5,#0FBH;系數(π/180)傳送到第二工作區
MOV R6,#8EH
MOV R7,#0FAH
DR: LCALL MVR0 ;將[R0]傳送到第一工作區
CLR 1EH ;系數為正
LCALL MUL1 ;通過乘法進行轉換
LJMP MOV0 ;結果傳送到[R0]中
END |