51挺好用的子程序匯總,有用拿走!
所有資料51hei提供下載:
MSC51PRO.rar
(19.76 KB, 下載次數: 120)
2018-1-12 18:06 上傳
點擊文件名下載附件
51子程序
單片機匯編語言源程序如下:
- ;MCS-51單片機實用子程序庫
- ;片內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
- ;單字節無符號除法程序(除數為4bit,1~15) (R3R4/R7)=R3R4 余數R7
- ;入口: R3,R4,R7
- ;占用資源: ACC,B,F0
- ;堆棧需求: 2字節
- ;出口: R3,R4,R7,OV
- NDIV24: MOV A,R3
- MOV B,R7
- DIV AB
- MOV R3,A
- MOV A,B
- SWAP A
- MOV B,A
- MOV A,R4
- ANL A,#0F0H
- SWAP A
- ORL A,B
- MOV B,R7
- DIV AB
- SWAP A
- PUSH ACC
- MOV A,B
- SWAP A
- MOV B,A
- MOV A,R4
- ANL A,#0FH
- ORL A,B
- MOV B,R7
- DIV AB
- MOV R7,B
- MOV B,A
- POP ACC
- ORL A,B
- MOV R4,A
- RET
- ;單字節無符號除法程序 (R3R4/R7)=(R3)R4 余數R7
- ;入口: R3,R4,R7
- ;占用資源: ACC,B,F0
- ;堆棧需求: 2字節
- ;出口: (R3),R4,R7,OV
- NDIV21: MOV A,R3
- MOV B,R7
- DIV AB
- PUSH ACC
- MOV R3,B
- MOV B,#08H
- NDV211: CLR C
- MOV A,R4
- RLC A
- MOV R4,A
- MOV A,R3
- RLC A
- MOV R3,A
- MOV F0,C
- CLR C
- SUBB A,R7
- JB F0,NDV212
- JC NDV213
- NDV212: MOV R3,A
- INC R4
- NDV213: DJNZ B,NDV211
- POP ACC
- CLR OV
- JZ NDV214
- SETB OV
- NDV214: XCH A,R3
- MOV R7,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 ACC
- 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 ACC
- 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 ACC
- 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 ACC
- 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 ACC
- 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 ACC
- CLR OV
- JNZ NDV426
- SETB OV
- NDV426 : XCH A,R2
- MOV R7,A
- MOV A,R5
- MOV R6,A
- POP ACC
- 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
- ;內部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 ACC
- 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 ACC
- 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 ACC
- MOV R7,#03H
- CLR A
- IBD221 : MOV @R0,A
- INC R0
- DJNZ R7,IBD221
- POP ACC
- MOV R0,A
- MOV R7,#10H
- IBD222 : PUSH ACC
- 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 ACC
- 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 ACC
- MOV R7,#04H
- CLR A
- IBD321 : MOV @R0,A
- INC R0
- DJNZ R7,IBD321
- POP ACC
- MOV R0,A
- MOV R7,#18H
- IBD322 : PUSH ACC
- 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 ACC
- 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
- ;(一) 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
- 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]中
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|