51挺好用的子程序匯總,有用拿走!
所有資料51hei提供下載:
MSC51PRO.rar
(19.76 KB, 下載次數(shù): 120)
2018-1-12 18:06 上傳
點(diǎn)擊文件名下載附件
51子程序
單片機(jī)匯編語(yǔ)言源程序如下:
- ;MCS-51單片機(jī)實(shí)用子程序庫(kù)
- ;片內(nèi)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初始化子程序(雙字節(jié)個(gè)單元)
- 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
- ;內(nèi)部RAM數(shù)據(jù)復(fù)制程序
- ;入口: R0,R7
- ;占用資源: A
- ;堆棧需求: 2字節(jié)
- ;出口: 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數(shù)據(jù)復(fù)制程序
- ;入口: ADDPH,ADDPL,R7
- ;占用資源: ACC
- ;堆棧需求: 2字節(jié)
- ;出口: 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數(shù)據(jù)復(fù)制程序
- ;入口: ADDPH,ADDPL,R6,R7
- ;占用資源: ACC
- ;堆棧需求: 2字節(jié)
- ;出口: 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數(shù)據(jù)復(fù)制到內(nèi)部RAM程序
- ;入口: ADDPH,ADDPL,R7
- ;占用資源: ACC
- ;堆棧需求: 2字節(jié)
- ;出口: 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字節(jié)
- ;出口: 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字節(jié)
- ;出口: 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點(diǎn)算術(shù)平均濾波
- ;入口: ADDPH,ADDPL,N
- ;占用資源: B,R3,R4
- ;堆棧需求: 2字節(jié)
- ;出口: 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點(diǎn)加權(quán)平均濾波
- ;入口: ADDPH,ADDPL,N
- ;占用資源: B,R3,R4
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;一階加權(quán)滯后濾波程序
- ;入口: A,DELTY
- ;占用資源: B,R3,R4
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;雙字節(jié)取補(bǔ)程序 /(R3R4)=(R3R4)
- ;入口: R3,R4
- ;占用資源: ACC
- ;堆棧需求: 2字節(jié)
- ;出口: 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節(jié)取補(bǔ)程序 /([R0])=([R0])
- ;入口: R0,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;雙字節(jié)無(wú)符號(hào)數(shù)加法程序 (R3R4+R6R7)=(R3R4)
- ;入口: R3,R4,R6,R7
- ;占用資源: ACC
- ;堆棧需求: 2字節(jié)
- ;出口: R3,R4,CF
- NADD: MOV A,R4
- ADD A,R7
- MOV R4,A
- MOV A,R3
- ADDC A,R6
- MOV R3,A
- RET
- ;N字節(jié)無(wú)符號(hào)數(shù)加法程序 ([R0]+[R1])=([R0])
- ;入口: R0,R1,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;雙字節(jié)無(wú)符號(hào)數(shù)減法程序 (R3R4-R6R7)=(R3R4)
- ;入口: R3,R4,R6,R7
- ;占用資源: ACC
- ;堆棧需求: 2字節(jié)
- ;出口: 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字節(jié)無(wú)符號(hào)數(shù)減法程序 ([R0]-[R1])=([R0])
- ;入口: R0,R1,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;單字節(jié)無(wú)符號(hào)數(shù)乘法程序 (R3R4*R7)=(R2R3R4)
- ;入口: R3,R4,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;單字節(jié)無(wú)符號(hào)數(shù)乘法程序 (R2R3R4*R7)=(R5R2R3R4)
- ;入口: R2,R3,R4,R6,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;單字節(jié)無(wú)符號(hào)數(shù)乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)
- ;入口: R5,R2,R3,R4,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;雙字節(jié)無(wú)符號(hào)數(shù)乘法程序 (R3R4*R6R7)=(R5R2R3R4)
- ;入口: R3,R4,R6,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;雙字節(jié)無(wú)符號(hào)數(shù)乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)
- ;入口: R2,R3,R4,R6,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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字節(jié)無(wú)符號(hào)數(shù)乘法程序 ([R0]*[R1])=([R0])
- ;入口: R0,R1,M,N
- ;占用資源: ACC,B,R2,R5,R6,R7,NCNT
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;單字節(jié)無(wú)符號(hào)除法程序(除數(shù)為4bit,1~15) (R3R4/R7)=R3R4 余數(shù)R7
- ;入口: R3,R4,R7
- ;占用資源: ACC,B,F0
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;單字節(jié)無(wú)符號(hào)除法程序 (R3R4/R7)=(R3)R4 余數(shù)R7
- ;入口: R3,R4,R7
- ;占用資源: ACC,B,F0
- ;堆棧需求: 2字節(jié)
- ;出口: (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
- ;單字節(jié)無(wú)符號(hào)除法程序 (R2R3R4/R7)=(R2)R3R4 余數(shù)R7
- ;入口: R2,R3,R4,R7
- ;占用資源: ACC,B,F0
- ;堆棧需求: 3字節(jié)
- ;出口: (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
- ;單字節(jié)無(wú)符號(hào)除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余數(shù)R7
- ;入口: R2,R3,R4,R7
- ;占用資源: ACC,B,F0
- ;堆棧需求: 3字節(jié)
- ;出口: (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
- ;雙字節(jié)無(wú)符號(hào)除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余數(shù)R6R7
- ;入口: R5,R2,R3,R4,R6,R7
- ;占用資源: ACC,B,F0
- ;堆棧需求: 4字節(jié)
- ;出口: (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字節(jié)無(wú)符號(hào)除法程序(組合) ([R0]/[R1])=([R0])
- ;入口: R0,R1,M,N
- ;占用資源: ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN
- ;堆棧需求: 4字節(jié)
- ;出口: 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字節(jié)無(wú)符號(hào)除法程序(集成) ([R0]/R[1])=([R0])
- ;入口: R0,R1,M,N
- ;占用資源: ACC,R2,R3,R4,R5,R7,F0
- ;堆棧需求: 2字節(jié)
- ;出口: 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字節(jié)數(shù)據(jù)左移程序 RLC([R0])=(CF[R0])
- ;入口: R0,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;原碼有符號(hào)雙字節(jié)減法程序 (R3R4-R6R7)=R3R4
- ;入口: R3,R4,R6,R7
- ;占用資源: ACC,DADD
- ;堆棧需求: 6字節(jié)
- ;出口: R3,R4,OV
- DSUB : MOV A,R6
- CPL ACC.7
- MOV R6,A
- LCALL DADD
- RET
- ;原碼有符號(hào)雙字節(jié)加法程序 (R3R4+R6R7)=R3R4
- ;入口: R3,R4,R6,R7
- ;占用資源: ACC,SR0,NADD,NSUB,CMPT
- ;堆棧需求: 4字節(jié)
- ;出口: 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
- ;原碼有符號(hào)雙字節(jié)乘法程序 (R3R4*R6R7)=(R5R2R3R4)
- ;入口: R3,R4,R6,R7
- ;占用資源: ACC,SR0,NMUL22
- ;堆棧需求: 4字節(jié)
- ;出口: 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
- ;原碼有符號(hào)雙字節(jié)除法程序 (R5R2R3R4/R6R7)=(R3R4) 余數(shù)(R6R7)
- ;入口: R5,R2,R3,R4
- ;占用資源: ACC,SR0,NDIV42
- ;堆棧需求: 6字節(jié)
- ;出口: 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
- ;單字節(jié)順序查找程序
- ;入口: R0,R1,A,R7
- ;占用資源: B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;單字節(jié)順序查找程序
- ;入口: R0,R1,A,R6,R7
- ;占用資源: B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;雙字節(jié)字符串順序查找程序
- ;入口: R0,R1,R3,R4,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;雙字節(jié)字符串順序查找程序
- ;入口: R0,R1,R3,R4,R6,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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字節(jié)字符串順序查找程序
- ;入口: ADDPH,ADDPL,R0,R6,R7,N
- ;占用資源: ACC,B,R2,NCNT
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;單字節(jié)最值查找程序
- ;入口: R0,R1,R6,R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;浮點(diǎn)數(shù)順序查找程序
- ;入口: R0,R1,R2,R3,R4,R6,R7
- ;占用資源: B,NCNT,FCMP
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;浮點(diǎn)數(shù)最值查找程序
- ;入口: ADDPH,ADDPL,R6,R7
- ;占用資源: ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP
- ;堆棧需求: 5字節(jié)
- ;出口: [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
- ;單字節(jié)折半查找程序
- ;入口: A,R0,R1,R6,R7
- ;占用資源: B,R2
- ;堆棧需求: 2字節(jié)
- ;出口: 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字節(jié)
- ;出口: 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
- ;內(nèi)部RAM數(shù)據(jù)排序程序(升序)
- ;入口: R0(起始地址),N(數(shù)據(jù)個(gè)數(shù))
- ;占用資源: ACC,B,R5,R6,R7
- ;堆棧需求: 2字節(jié)
- ;出口: 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數(shù)據(jù)排序程序(升序)
- ;入口: ADDPH,ADDPL(起始地址),N(數(shù)據(jù)個(gè)數(shù))
- ;占用資源: ACC,B,R0,R1,R5,R7
- ;堆棧需求: 2字節(jié)
- ;出口: 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浮點(diǎn)數(shù)排序程序(升序)
- ;入口: ADDPH,ADDPL(起始地址),N(數(shù)據(jù)個(gè)數(shù))
- ;占用資源: ACC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT
- ;堆棧需求: 5字節(jié)
- ;出口: 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小數(shù)轉(zhuǎn)換為二進(jìn)制小數(shù)(2位)
- ;入口: R0(低位首址),R7
- ;占用資源: ACC,B,R5
- ;堆棧需求: 2字節(jié)
- ;出口: 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小數(shù)轉(zhuǎn)換為二進(jìn)制小數(shù)(N位)
- ;入口: R1(低位首址),M,N
- ;占用資源: ACC,B,R2,R3,R7
- ;堆棧需求: 2字節(jié)
- ;出口: 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整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù)(1位)
- ;入口: R0(高位地址),R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù)(2位)
- ;入口: R0(高位地址),R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù)(3位)
- ;入口: R0(高位地址),R7
- ;占用資源: ACC,B
- ;堆棧需求: 2字節(jié)
- ;出口: 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整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù)(N位)
- ;入口: R1(高位地址),M,N
- ;占用資源: ACC,B,R2,R7,NCNT,F0
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;二進(jìn)制小數(shù)(2位)轉(zhuǎn)換為十進(jìn)制小數(shù)(分離BCD碼)
- ;入口: R3,R4,R7
- ;占用資源: ACC,B
- ;堆棧需求: 3字節(jié)
- ;出口: 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
- ;二進(jìn)制小數(shù)(M位)轉(zhuǎn)換為十進(jìn)制小數(shù)(分離BCD碼)
- ;入口: R1,M,N
- ;占用資源: ACC,B,R2,R3,R7,NCNT
- ;堆棧需求: 2字節(jié)
- ;出口: 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
- ;二進(jìn)制整數(shù)(2位)轉(zhuǎn)換為十進(jìn)制整數(shù)(分離BCD碼)
- ;入口: R3,R4
- ;占用資源: ACC,R2,NDIV31
- ;堆棧需求: 5字節(jié)
- ;出口: 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
- ;二進(jìn)制整數(shù)(2位)轉(zhuǎn)換為十進(jìn)制整數(shù)(組合BCD碼)
- ;入口: R3,R4
- ;占用資源: ACC,B,R7
- ;堆棧需求: 3字節(jié)
- ;出口: 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
- ;二進(jìn)制整數(shù)(3位)轉(zhuǎn)換為十進(jìn)制整數(shù)(分離BCD碼)
- ;入口: R2,R3,R4
- ;占用資源: ACC,R2,NDIV31
- ;堆棧需求: 5字節(jié)
- ;出口: 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
- ;二進(jìn)制整數(shù)(3位)轉(zhuǎn)換為十進(jìn)制整數(shù)(組合BCD碼)
- ;入口: R2,R3,R4
- ;占用資源: ACC,B,R7
- ;堆棧需求: 3字節(jié)
- ;出口: 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
- ;二進(jìn)制整數(shù)(M位)轉(zhuǎn)換為十進(jìn)制整數(shù)(組合BCD碼)
- ;入口: R1,M,N
- ;占用資源: ACC,B,R2,R3,R7
- ;堆棧需求: 2字節(jié)
- ;出口: 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定點(diǎn)運(yùn)算子程序庫(kù)及其使用說(shuō)明
- ;定點(diǎn)運(yùn)算子程序庫(kù)文件名為DQ51.ASM,為便于使用,先將有關(guān)約定說(shuō)明如下:
- ;1.多字節(jié)定點(diǎn)操作數(shù):用[R0]或[R1]來(lái)表示存放在由R0或R1指示的連續(xù)單元中的數(shù)
- ;據(jù)。地址小的單元存放數(shù)據(jù)的高字節(jié)。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,
- ;(31H)=34H,(32H)=56H。
- ;2.運(yùn)算精度:?jiǎn)未味c(diǎn)運(yùn)算精度為結(jié)果最低位的當(dāng)量值。
- ;3.工作區(qū):數(shù)據(jù)工作區(qū)固定在PSW、A、B、R2~R7,用戶只要不在工作區(qū)中存放無(wú)關(guān)的或非消耗性的信息,程序就具
- ;有較好的透明性。
- ;(1) 標(biāo)號(hào): BCDA 功能:多字節(jié)BCD碼加法
- ;入口條件:字節(jié)數(shù)在R7中,被加數(shù)在[R0]中,加數(shù)在[R1]中。
- ;出口信息:和在[R0]中,最高位進(jìn)位在CY中。
- ;影響資源:PSW、A、R2 堆棧需求: 2字節(jié)
- BCDA: MOV A,R7 ;取字節(jié)數(shù)至R2中
- MOV R2,A
- ADD A,R0 ;初始化數(shù)據(jù)指針
- MOV R0,A
- MOV A,R2
- ADD A,R1
- MOV R1,A
- CLR C
- BCD1: DEC R0 ;調(diào)整數(shù)據(jù)指針
- DEC R1
- MOV A,@R0
- ADDC A,@R1 ;按字節(jié)相加
- DA A ;十進(jìn)制調(diào)整
- MOV @R0,A ;和存回[R0]中
- DJNZ R2,BCD1 ;處理完所有字節(jié)
- RET
- ;(2) 標(biāo)號(hào): BCDB 功能:多字節(jié)BCD碼減法
- ;入口條件:字節(jié)數(shù)在R7中,被減數(shù)在[R0]中,減數(shù)在[R1]中。
- ;出口信息:差在[R0]中,最高位借位在CY中。
- ;影響資源:PSW、A、R2、R3 堆棧需求: 6字節(jié)
- BCDB: LCALL NEG1 ;減數(shù)[R1]十進(jìn)制取補(bǔ)
- LCALL BCDA ;按多字節(jié)BCD碼加法處理
- CPL C ;將補(bǔ)碼加法的進(jìn)位標(biāo)志轉(zhuǎn)換成借位標(biāo)志
- MOV F0,C ;保護(hù)借位標(biāo)志
- LCALL NEG1 ;恢復(fù)減數(shù)[R1]的原始值
- MOV C,F0 ;恢復(fù)借位標(biāo)志
- RET
- NEG1: MOV A,R0 ;[R1]十進(jìn)制取補(bǔ)子程序入口
- XCH A,R1 ;交換指針
- XCH A,R0
- LCALL NEG ;通過(guò)[R0]實(shí)現(xiàn)[R1]取補(bǔ)
- MOV A,R0
- XCH A,R1 ;換回指針
- XCH A,R0
- RET
- ;(3) 標(biāo)號(hào): NEG 功能:多字節(jié)BCD碼取補(bǔ)
- ;入口條件:字節(jié)數(shù)在R7中,操作數(shù)在[R0]中。
- ;出口信息:結(jié)果仍在[R0]中。
- ;影響資源:PSW、A、R2、R3 堆棧需求: 2字節(jié)
- NEG: MOV A,R7 ;取(字節(jié)數(shù)減一)至R2中
- DEC A
- MOV R2,A
- MOV A,R0 ;保護(hù)指針
- MOV R3,A
- NEG0: CLR C
- MOV A,#99H
- SUBB A,@R0 ;按字節(jié)十進(jìn)制取補(bǔ)
- MOV @R0,A ;存回[R0]中
- INC R0 ;調(diào)整數(shù)據(jù)指針
- DJNZ R2,NEG0 ;處理完(R2)字節(jié)
- MOV A,#9AH ;最低字節(jié)單獨(dú)取補(bǔ)
- SUBB A,@R0
- MOV @R0,A
- MOV A,R3 ;恢復(fù)指針
- MOV R0,A
- RET
- ;(4) 標(biāo)號(hào): BRLN 功能:多字節(jié)BCD碼左移十進(jìn)制一位(乘十)
- ;入口條件:字節(jié)數(shù)在R7中,操作數(shù)在[R0]中。
- ;出口信息:結(jié)果仍在[R0]中,移出的十進(jìn)制最高位在R3中。
- ;影響資源:PSW、A、R2、R3 堆棧需求: 2字節(jié)
- BRLN: MOV A,R7 ;取字節(jié)數(shù)至R2中
- MOV R2,A
- ADD A,R0 ;初始化數(shù)據(jù)指針
- MOV R0,A
- MOV R3,#0 ;工作單元初始化
- BRL1: DEC R0 ;調(diào)整數(shù)據(jù)指針
- MOV A,@R0 ;取一字節(jié)
- SWAP A ;交換十進(jìn)制高低位
- MOV @R0,A ;存回
- MOV A,R3 ;取低字節(jié)移出的十進(jìn)制高位
- XCHD A,@R0 ;換出本字節(jié)的十進(jìn)制高位
- MOV R3,A ;保存本字節(jié)的十進(jìn)制高位
- DJNZ R2,BRL1 ;處理完所有字節(jié)
- RET
- ;(5) 標(biāo)號(hào): MULD 功能:雙字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)乘法
- ;入口條件:被乘數(shù)在R2、R3中,乘數(shù)在R6、R7中。
- ;出口信息:乘積在R2、R3、R4、R5中。
- ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
- MULD: MOV A,R3 ;計(jì)算R3乘R7
- MOV B,R7
- MUL AB
- MOV R4,B ;暫存部分積
- MOV R5,A
- MOV A,R3 ;計(jì)算R3乘R6
- MOV B,R6
- MUL AB
- ADD A,R4 ;累加部分積
- MOV R4,A
- CLR A
- ADDC A,B
- MOV R3,A
- MOV A,R2 ;計(jì)算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 ;計(jì)算R2乘R6
- MOV B,R6
- MUL AB
- ADD A,R3 ;累加部分積
- MOV R3,A
- MOV A,R2
- ADDC A,B
- MOV R2,A
- RET
- ;(6) 標(biāo)號(hào): MUL2 功能:雙字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)平方
- ;入口條件:待平方數(shù)在R2、R3中。
- ;出口信息:結(jié)果在R2、R3、R4、R5中。
- ;影響資源:PSW、A、B、R2~R5 堆棧需求: 2字節(jié)
- MUL2: MOV A,R3 ;計(jì)算R3平方
- MOV B,A
- MUL AB
- MOV R4,B ;暫存部分積
- MOV R5,A
- MOV A,R2 ;計(jì)算R2平方
- MOV B,A
- MUL AB
- XCH A,R3 ;暫存部分積,并換出R2和R3
- XCH A,B
- XCH A,R2
- MUL AB ;計(jì)算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) 標(biāo)號(hào): DIVD 功能:雙字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)除法
- ;入口條件:被除數(shù)在R2、R3、R4、R5中,除數(shù)在R6、R7中。
- ;出口信息:OV=0 時(shí),雙字節(jié)商在R2、R3中,OV=1 時(shí)溢出。
- ;影響資源:PSW、A、B、R1~R7 堆棧需求: 2字節(jié)
- DIVD: CLR C ;比較被除數(shù)和除數(shù)
- MOV A,R3
- SUBB A,R7
- MOV A,R2
- SUBB A,R6
- JC DVD1
- SETB OV ;溢出
- RET
- DVD1: MOV B,#10H ;計(jì)算雙字節(jié)商
- DVD2: CLR C ;部分商和余數(shù)同時(shí)左移一位
- 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 ;計(jì)算(R2R3-R6R7)
- MOV R1,A
- MOV A,R2
- SUBB A,R6
- ANL C,/F0 ;結(jié)果判斷
- JC DVD3
- MOV R2,A ;夠減,存放新的余數(shù)
- MOV A,R1
- MOV R3,A
- INC R5 ;商的低位置一
- DVD3: DJNZ B,DVD2 ;計(jì)算完十六位商(R4R5)
- MOV A,R4 ;將商移到R2R3中
- MOV R2,A
- MOV A,R5
- MOV R3,A
- CLR OV ;設(shè)立成功標(biāo)志
- RET
- ;(8) 標(biāo)號(hào): D457 功能:雙字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)除以單字節(jié)二進(jìn)制數(shù)
- ;入口條件:被除數(shù)在R4、R5中,除數(shù)在R7中。
- ;出口信息:OV=0 時(shí),單字節(jié)商在R3中,OV=1 時(shí)溢出。
- ;影響資源:PSW、A、R3~R7 堆棧需求: 2字節(jié)
- 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) 標(biāo)號(hào): DV31 功能:三字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)除以單字節(jié)二進(jìn)制數(shù)
- ;入口條件:被除數(shù)在R3、R4、R5中,除數(shù)在R7中。
- ;出口信息:OV=0 時(shí),雙字節(jié)商在R4、R5中,OV=1 時(shí)溢出。
- ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
- 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) 標(biāo)號(hào): MULS 功能:雙字節(jié)二進(jìn)制有符號(hào)數(shù)乘法(補(bǔ)碼)
- ;入口條件:被乘數(shù)在R2、R3中,乘數(shù)在R6、R7中。
- ;出口信息:乘積在R2、R3、R4、R5中。
- ;影響資源:PSW、A、B、R2~R7 堆棧需求: 4字節(jié)
- MULS: MOV R4,#0 ;清零R4R5
- MOV R5,#0
- LCALL MDS ;計(jì)算結(jié)果的符號(hào)和兩個(gè)操作數(shù)的絕對(duì)值
- LCALL MULD ;計(jì)算兩個(gè)絕對(duì)值的乘積
- SJMP MDSE ;用補(bǔ)碼表示結(jié)果
- ;(11) 標(biāo)號(hào): DIVS 功能:雙字節(jié)二進(jìn)制有符號(hào)數(shù)除法(補(bǔ)碼)
- ;入口條件:被除數(shù)在R2、R3、R4、R5中,除數(shù)在R6、R7中。
- ;出口信息:OV=0時(shí)商在R2、R3中,OV=1時(shí)溢出。
- ;影響資源:PSW、A、B、R1~R7 堆棧需求: 5字節(jié)
- DIVS: LCALL MDS ;計(jì)算結(jié)果的符號(hào)和兩個(gè)操作數(shù)的絕對(duì)值
- PUSH PSW ;保存結(jié)果的符號(hào)
- LCALL DIVD ;計(jì)算兩個(gè)絕對(duì)值的商
- JNB OV,DVS1 ;溢出否?
- POP ACC ;溢出,放去結(jié)果的符號(hào),保留溢出標(biāo)志
- RET
- DVS1: POP PSW ;未溢出,取出結(jié)果的符號(hào)
- MOV R4,#0
- MOV R5,#0
- MDSE: JB F0,MDS2 ;用補(bǔ)碼表示結(jié)果
- CLR OV ;結(jié)果為正,原碼即補(bǔ)碼,計(jì)算成功
- RET
- MDS: CLR F0 ;結(jié)果符號(hào)初始化
- MOV A,R6 ;判斷第二操作數(shù)的符號(hào)
- JNB ACC.7,MDS1;為正,不必處理
- CPL F0 ;為負(fù),結(jié)果符號(hào)取反
- XCH A,R7 ;第二操作數(shù)取補(bǔ),得到其絕對(duì)值
- CPL A
- ADD A,#1
- XCH A,R7
- CPL A
- ADDC A,#0
- MOV R6,A
- MDS1: MOV A,R2 ;判斷第一操作數(shù)或運(yùn)算結(jié)果的符號(hào)
- JNB ACC.7,MDS3;為正,不必處理
- CPL F0 ;為負(fù),結(jié)果符號(hào)取反
- MDS2: MOV A,R5 ;求第一操作數(shù)的絕對(duì)值或運(yùn)算結(jié)果的補(bǔ)碼
- 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 ;運(yùn)算成功
- RET
- ;(12) 標(biāo)號(hào): SH2 功能:雙字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)開(kāi)平方(快速)
- ;入口條件:被開(kāi)方數(shù)在R2、R3中。
- ;出口信息:平方根仍在R2、R3中,整數(shù)部分的位數(shù)為原數(shù)的一半,其余為小數(shù)。
- ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
- SH2: MOV A,R2
- ORL A,R3
- JNZ SH20
- RET ;被開(kāi)方數(shù)為零,不必運(yùn)算
- SH20: MOV R7,#0 ;左規(guī)次數(shù)初始化
- MOV A,R2
- SH22: ANL A,#0C0H ;被開(kāi)方數(shù)高字節(jié)小于40H否?
- JNZ SQRH ;不小于40H,左規(guī)格化完成,轉(zhuǎn)開(kāi)方過(guò)程
- CLR C ;每左規(guī)一次,被開(kāi)方數(shù)左移兩位
- 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 ;左規(guī)次數(shù)加一
- SJMP SH22 ;繼續(xù)左規(guī)
- ;(13) 標(biāo)號(hào): SH4 功能:四字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)開(kāi)平方(快速)
- ;口條件:被開(kāi)方數(shù)在R2、R3、R4、R5中。
- ;出口信息:平方根在R2、R3中,整數(shù)部分的位數(shù)為原數(shù)的一半,其余為小數(shù)。
- ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
- SH4: MOV A,R2
- ORL A,R3
- ORL A,R4
- ORL A,R5
- JNZ SH40
- RET ;被開(kāi)方數(shù)為零,不必運(yùn)算
- SH40: MOV R7,#0 ;左規(guī)次數(shù)初始化
- MOV A,R2
- SH41: ANL A,#0C0H ;被開(kāi)方數(shù)高字節(jié)小于40H否?
- JNZ SQRH ;不小于40H,左規(guī)格化完成
- MOV R6,#2 ;每左規(guī)一次,被開(kāi)方數(shù)左移兩位
- SH42: CLR C ;被開(kāi)方數(shù)左移一位
- 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 ;被開(kāi)方數(shù)左移完兩位
- INC R7 ;左規(guī)次數(shù)加一
- SJMP SH41 ;繼續(xù)左規(guī)
- SQRH: MOV A,R2 ;規(guī)格化后高字節(jié)按折線法分為三個(gè)區(qū)間
- ADD A,#57H
- JC SQR2
- ADD A,#45H
- JC SQR1
- ADD A,#24H
- MOV B,#0E3H ;第一區(qū)間的斜率
- MOV R4,#80H ;第一區(qū)間的平方根基數(shù)
- SJMP SQR3
- SQR1: MOV B,#0B2H ;第二區(qū)間的斜率
- MOV R4,#0A0H;第二區(qū)間的平方根基數(shù)
- SJMP SQR3
- SQR2: MOV B,#8DH ;第三區(qū)間的斜率
- MOV R4,#0D0H;第三區(qū)間的平方根基數(shù)
- SQR3: MUL AB ;與區(qū)間基點(diǎn)的偏移量乘區(qū)間斜率
- MOV A,B
- ADD A,R4 ;累加到平方根的基數(shù)上
- MOV R4,A
- MOV B,A
- MUL AB ;求當(dāng)前平方根的冪
- XCH A,R3 ;求偏移量(存放在R2R3中)
- CLR C
- SUBB A,R3
- MOV R3,A
- MOV A,R2
- SUBB A,B
- MOV R2,A
- SQR4: SETB C ;用減奇數(shù)法校正一個(gè)字節(jié)的平方根
- MOV A,R4 ;當(dāng)前平方根的兩倍加一存入R5R6中
- RLC A
- MOV R6,A
- CLR A
- RLC A
- MOV R5,A
- MOV A,R3 ;偏移量小于該奇數(shù)否?
- SUBB A,R6
- MOV B,A
- MOV A,R2
- SUBB A,R5
- JC SQR5 ;小于,校正結(jié)束,已達(dá)到一個(gè)字節(jié)的精度
- INC R4 ;不小于,平方根加一
- MOV R2,A ;保存新的偏移量
- MOV R3,B
- SJMP SQR4 ;繼續(xù)校正
- SQR5: MOV A,R4 ;將一個(gè)字節(jié)精度的根存入R2
- XCH A,R2
- RRC A
- MOV F0,C ;保存最終偏移量的最高位
- MOV A,R3
- MOV R5,A ;將最終偏移量的低八位存入R5中
- MOV R4,#8 ;通過(guò)(R5R6/R2)求根的低字節(jié)
- 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 ;根的第二字節(jié)計(jì)算完,在R3中
- MOV A,R7 ;取原被開(kāi)方數(shù)的左規(guī)次數(shù)
- JZ SQRE ;未左規(guī),開(kāi)方結(jié)束
- SQR9: CLR C ;按左規(guī)次數(shù)右移平方根,得到實(shí)際根
- MOV A,R2
- RRC A
- MOV R2,A
- MOV A,R3
- RRC A
- MOV R3,A
- DJNZ R7,SQR9
- SQRE: RET
- ;(14) 標(biāo)號(hào): HASC 功能:?jiǎn)巫止?jié)十六進(jìn)制數(shù)轉(zhuǎn)換成雙字節(jié)ASCII碼
- ;入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制數(shù)在累加器A中。
- ;出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。
- ;影響資源:PSW、A、B 堆棧需求: 4字節(jié)
- HASC: MOV B,A ;暫存待轉(zhuǎn)換的單字節(jié)十六進(jìn)制數(shù)
- LCALL HAS1 ;轉(zhuǎn)換低四位
- XCH A,B ;存放低四位的ASCII碼
- SWAP A ;準(zhǔn)備轉(zhuǎn)換高四位
- HAS1: ANL A,#0FH ;將累加器的低四位轉(zhuǎn)換成ASCII碼
- ADD A,#90H
- DA A
- ADDC A,#40H
- DA A
- RET
- ;(15) 標(biāo)號(hào): ASCH 功能:ASCII碼轉(zhuǎn)換成十六進(jìn)制數(shù)
- ;入口條件:待轉(zhuǎn)換的ASCII碼(30H~39H或41H~46H)在A中。
- ;出口信息:轉(zhuǎn)換后的十六進(jìn)制數(shù)(00H~0FH)仍在累加器A中。
- ;影響資源:PSW、A 堆棧需求: 2字節(jié)
- ASCH: CLR C
- SUBB A,#30H
- JNB ACC.4,ASH1
- SUBB A,#7
- ASH1: RET
- ;(16) 標(biāo)號(hào):HBCD 功能:?jiǎn)巫止?jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成單字節(jié)BCD碼整數(shù)
- ;入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制整數(shù)在累加器A中。
- ;出口信息:轉(zhuǎn)換后的BCD碼整數(shù)(十位和個(gè)位)仍在累加器A中,百位在R3中。
- ;影響資源:PSW、A、B、R3 堆棧需求: 2字節(jié)
- HBCD: MOV B,#100 ;分離出百位,存放在R3中
- DIV AB
- MOV R3,A
- MOV A,#10 ;余數(shù)繼續(xù)分離十位和個(gè)位
- XCH A,B
- DIV AB
- SWAP A
- ORL A,B ;將十位和個(gè)位拼裝成BCD碼
- RET
- ;(17) 標(biāo)號(hào): HB2 功能:雙字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)
- ;入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在R6、R7中。
- ;出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。
- ;影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié)
- HB2: CLR A ;BCD碼初始化
- MOV R3,A
- MOV R4,A
- MOV R5,A
- MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進(jìn)制整數(shù)
- HB3: MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
- RLC A
- MOV R7,A
- MOV A,R6
- RLC A
- MOV R6,A
- MOV A,R5 ;BCD碼帶進(jìn)位自身相加,相當(dāng)于乘2
- ADDC A,R5
- DA A ;十進(jìn)制調(diào)整
- MOV R5,A
- MOV A,R4
- ADDC A,R4
- DA A
- MOV R4,A
- MOV A,R3
- ADDC A,R3
- MOV R3,A ;雙字節(jié)十六進(jìn)制數(shù)的萬(wàn)位數(shù)不超過(guò)6,不用調(diào)整
- DJNZ R2,HB3 ;處理完16bit
- RET
- ;(18) 標(biāo)號(hào): HBD 功能:?jiǎn)巫止?jié)十六進(jìn)制小數(shù)轉(zhuǎn)換成單字節(jié)BCD碼小數(shù)
- ;入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制小數(shù)在累加器A中。
- ;出口信息:CY=0時(shí)轉(zhuǎn)換后的BCD碼小數(shù)仍在A中。CY=1時(shí)原小數(shù)接近整數(shù)1。
- ;影響資源:PSW、A、B 堆棧需求: 2字節(jié)
- HBD: MOV B,#100 ;原小數(shù)擴(kuò)大一百倍
- MUL AB
- RLC A ;余數(shù)部分四舍五入
- CLR A
- ADDC A,B
- MOV B,#10 ;分離出十分位和百分位
- DIV AB
- SWAP A
- ADD A,B ;拼裝成單字節(jié)BCD碼小數(shù)
- DA A ;調(diào)整后若有進(jìn)位,原小數(shù)接近整數(shù)1
- RET
- ;(19) 標(biāo)號(hào): HBD2 功能:雙字節(jié)十六進(jìn)制小數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼小數(shù)
- ;入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制小數(shù)在R2、R3中。
- ;出口信息:轉(zhuǎn)換后的雙字節(jié)BCD碼小數(shù)仍在R2、R3中。
- ;影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求: 6字節(jié)
- HBD2: MOV R4,#4 ;四位十進(jìn)制碼
- HBD3: MOV A,R3 ;原小數(shù)擴(kuò)大十倍
- 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 ;保存溢出的一位十進(jìn)制碼
- DJNZ R4,HBD3 ;計(jì)算完四位十進(jìn)制碼
- POP ACC ;取出萬(wàn)分位
- MOV R3,A
- POP ACC ;取出千分位
- SWAP A
- ORL A,R3 ;拼裝成低字節(jié)BCD碼小數(shù)
- MOV R3,A
- POP ACC ;取出百分位
- MOV R2,A
- POP ACC ;取出十分位
- SWAP A
- ORL A,R2 ;拼裝成高字節(jié)BCD碼小數(shù)
- MOV R2,A
- RET
- ;(20)標(biāo)號(hào):BCDH 功能:?jiǎn)巫止?jié)BCD碼整數(shù)轉(zhuǎn)換成單字節(jié)十六進(jìn)制整數(shù)
- ;入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼整數(shù)在累加器A中。
- ;出口信息:轉(zhuǎn)換后的單字節(jié)十六進(jìn)制整數(shù)仍在累加器A中。
- ;影響資源:PSW、A、B、R4 堆棧需求: 2字節(jié)
- BCDH: MOV B,#10H ;分離十位和個(gè)位
- DIV AB
- MOV R4,B ;暫存?zhèn)位
- MOV B,#10 ;將十位轉(zhuǎn)換成十六進(jìn)制
- MUL AB
- ADD A,R4 ;按十六進(jìn)制加上個(gè)位
- RET
- ;(21)標(biāo)號(hào): BH2 功能:雙字節(jié)BCD碼整數(shù)轉(zhuǎn)換成雙字節(jié)十六進(jìn)制整數(shù)
- ;入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼整數(shù)在R2、R3中。
- ;出口信息:轉(zhuǎn)換后的雙字節(jié)十六進(jìn)制整數(shù)仍在R2、R3中。
- ;影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節(jié)
- BH2: MOV A,R3 ;將低字節(jié)轉(zhuǎn)換成十六進(jìn)制
- LCALL BCDH
- MOV R3,A
- MOV A,R2 ;將高字節(jié)轉(zhuǎn)換成十六進(jìn)制
- LCALL BCDH
- MOV B,#100 ;擴(kuò)大一百倍
- MUL AB
- ADD A,R3 ;和低字節(jié)按十六進(jìn)制相加
- MOV R3,A
- CLR A
- ADDC A,B
- MOV R2,A
- RET
- ;(22)標(biāo)號(hào): BHD 功能:?jiǎn)巫止?jié)BCD碼小數(shù)轉(zhuǎn)換成單字節(jié)十六進(jìn)制小數(shù)
- ;入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼數(shù)在累加器A中。
- ;出口信息:轉(zhuǎn)換后的單字節(jié)十六進(jìn)制小數(shù)仍在累加器A中。
- ;影響資源:PSW、A、R2、R3 堆棧需求: 2字節(jié)
- BHD: MOV R2,#8 ;準(zhǔn)備計(jì)算一個(gè)字節(jié)小數(shù)
- BHD0: ADD A,ACC ;按十進(jìn)制倍增
- DA A
- XCH A,R3
- RLC A ;將進(jìn)位標(biāo)志移入結(jié)果中
- XCH A,R3
- DJNZ R2,BHD0 ;共計(jì)算8bit小數(shù)
- ADD A,#0B0H ;剩余部分達(dá)到0.50否?
- JNC BHD1 ;四舍
- INC R3 ;五入
- BHD1: MOV A,R3 ;取結(jié)果
- RET
- ;(23)標(biāo)號(hào): BHD2 功能:雙字節(jié)BCD碼小數(shù)轉(zhuǎn)換成雙字節(jié)十六進(jìn)制小數(shù)
- ;入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼小數(shù)在R4、R5中。
- ;出口信息:轉(zhuǎn)換后的雙字節(jié)十六進(jìn)制小數(shù)在R2、R3中。
- ;影響資源:PSW、A、R2~R6 堆棧需求: 2字節(jié)
- BHD2: MOV R6,#10H ;準(zhǔn)備計(jì)算兩個(gè)字節(jié)小數(shù)
- BHD3: MOV A,R5 ;按十進(jìn)制倍增
- ADD A,R5
- DA A
- MOV R5,A
- MOV A,R4
- ADDC A,R4
- DA A
- MOV R4,A
- MOV A,R3 ;將進(jìn)位標(biāo)志移入結(jié)果中
- RLC A
- MOV R3,A
- MOV A,R2
- RLC A
- MOV R2,A
- DJNZ R6,BHD3 ;共計(jì)算16bit小數(shù)
- MOV A,R4
- ADD A,#0B0H ;剩余部分達(dá)到0.50否?
- JNC BHD4 ;四舍
- INC R3 ;五入
- MOV A,R3
- JNZ BHD4
- INC R2
- BHD4: RET
- ;(24) 標(biāo)號(hào): MM 功能:求單字節(jié)十六進(jìn)制無(wú)符號(hào)數(shù)據(jù)塊的極值
- ;入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。
- ;出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
- ;影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節(jié)
- MM: MOV B,R7 ;保存數(shù)據(jù)個(gè)數(shù)
- MOVX A,@DPTR ;讀取第一個(gè)數(shù)據(jù)
- MOV R6,A ;作為最大值的初始值
- MOV R7,A ;也作為最小值的初始值
- MOV A,DPL ;取第一個(gè)數(shù)據(jù)的地址
- MOV R3,A ;作為最大值存放地址的初始值
- MOV R5,A ;也作為最小值存放地址的初始值
- MOV A,DPH
- MOV R2,A
- MOV R4,A
- MOV A,B ;取數(shù)據(jù)個(gè)數(shù)
- DEC A ;減一,得到需要比較的次數(shù)
- JZ MME ;只有一個(gè)數(shù)據(jù),不需要比較
- MOV R1,A ;保存比較次數(shù)
- PUSH DPL ;保護(hù)數(shù)據(jù)塊的首址
- PUSH DPH
- MM1: INC DPTR ;指向一個(gè)新的數(shù)據(jù)
- MOVX A,@DPTR ;讀取這個(gè)數(shù)據(jù)
- MOV B,A ;保存
- SETB C ;與最大值比較
- SUBB A,R6
- JC MM2 ;不超過(guò)當(dāng)前最大值,保持當(dāng)前最大值
- MOV R6,B ;超過(guò)當(dāng)前最大值,更新最大值存放地址
- MOV R2,DPH ;同時(shí)更新最大值存放地址
- MOV R3,DPL
- SJMP MM3
- MM2: MOV A,B ;與最小值比較
- CLR C
- SUBB A,R7
- JNC MM3 ;大于或等于當(dāng)前最小值,保持當(dāng)前最小值
- MOV R7,B ;更新最小值
- MOV R4,DPH ;更新最小值存放地址
- MOV R5,DPL
- MM3: DJNZ R1,MM1 ;處理完全部數(shù)據(jù)
- POP DPH ;恢復(fù)數(shù)據(jù)首址
- POP DPL
- MME: RET
- ;(25) 標(biāo)號(hào): MMS 功能:求單字節(jié)十六進(jìn)制有符號(hào)數(shù)據(jù)塊的極值
- ;入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。
- ;出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
- ;影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節(jié)
- MMS: MOV B,R7 ;保存數(shù)據(jù)個(gè)數(shù)
- MOVX A,@DPTR ;讀取第一個(gè)數(shù)據(jù)
- MOV R6,A ;作為最大值的初始值
- MOV R7,A ;也作為最小值的初始值
- MOV A,DPL ;取第一個(gè)數(shù)據(jù)的地址
- MOV R3,A ;作為最大值存放地址的初始值
- MOV R5,A ;也作為最小值存放地址的初始值
- MOV A,DPH
- MOV R2,A
- MOV R4,A
- MOV A,B ;取數(shù)據(jù)個(gè)數(shù)
- DEC A ;減一,得到需要比較的次數(shù)
- JZ MMSE ;只有一個(gè)數(shù)據(jù),不需要比較
- MOV R1,A ;保存比較次數(shù)
- PUSH DPL ;保護(hù)數(shù)據(jù)塊的首址
- PUSH DPH
- MMS1: INC DPTR ;調(diào)整數(shù)據(jù)指針
- MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)
- MOV B,A ;保存
- SETB C ;與最大值比較
- SUBB A,R6
- JZ MMS4 ;相同,不更新最大值
- JNB OV,MMS2 ;差未溢出,符號(hào)位有效
- CPL ACC.7 ;差溢出,符號(hào)位取反
- MMS2: JB ACC.7,MMS4;差為負(fù),不更新最大值
- MOV R6,B ;更新最大值
- MOV R2,DPH ;更新最大值存放地址
- MOV R3,DPL
- SJMP MMS7
- MMS4: MOV A,B ;與最小值比較
- CLR C
- SUBB A,R7
- JNB OV,MMS6 ;差未溢出,符號(hào)位有效
- CPL ACC.7 ;差溢出,符號(hào)位取反
- MMS6: JNB ACC.7,MMS7;差為正,不更新最小值
- MOV R7,B ;更新最小值
- MOV R4,DPH ;更新最小值存放地址
- MOV R5,DPL
- MMS7: DJNZ R1,MMS1 ;處理完全部數(shù)據(jù)
- POP DPH ;恢復(fù)數(shù)據(jù)首址
- POP DPL
- MMSE: RET
- ;(26) 標(biāo)號(hào): FDS1 功能:順序查找(ROM)單字節(jié)表格
- ;入口條件:待查找的內(nèi)容在A中,表格首址在DPTR中,表格的字節(jié)數(shù)在R7中。
- ;出口信息:OV=0時(shí),順序號(hào)在累加器A中;OV=1時(shí),未找到。
- ;影響資源:PSW、A、B、R2、R6 堆棧需求: 2字節(jié)
- FDS1: MOV B,A ;保存待查找的內(nèi)容
- MOV R2,#0 ;順序號(hào)初始化(指向表首)
- MOV A,R7 ;保存表格的長(zhǎng)度
- MOV R6,A
- FD11: MOV A,R2 ;按順序號(hào)讀取表格內(nèi)容
- MOVC A,@A+DPTR
- CJNE A,B,FD12;與待查找的內(nèi)容比較
- CLR OV ;相同,查找成功
- MOV A,R2 ;取對(duì)應(yīng)的順序號(hào)
- RET
- FD12: INC R2 ;指向表格中的下一個(gè)內(nèi)容
- DJNZ R6,FD11 ;查完全部表格內(nèi)容
- SETB OV ;未查找到,失敗
- RET
- ;(27) 標(biāo)號(hào): FDS2 功能:順序查找(ROM)雙字節(jié)表格
- ;入口條件:查找內(nèi)容在R4、R5中,表格首址在DPTR中,數(shù)據(jù)總個(gè)數(shù)在R7中。
- ;出口信息:OV=0時(shí)順序號(hào)在累加器A中,地址在DPTR中;OV=1時(shí)未找到。
- ;影響資源:PSW、A、R2、R6、DPTR 堆棧需求: 2字節(jié)
- FDS2: MOV A,R7 ;保存表格中數(shù)據(jù)的個(gè)數(shù)
- MOV R6,A
- MOV R2,#0 ;順序號(hào)初始化(指向表首)
- FD21: CLR A ;讀取表格內(nèi)容的高字節(jié)
- MOVC A,@A+DPTR
- XRL A,R4 ;與待查找內(nèi)容的高字節(jié)比較
- JNZ FD22
- MOV A,#1 ;讀取表格內(nèi)容的低字節(jié)
- MOVC A,@A+DPTR
- XRL A,R5 ;與待查找內(nèi)容的低字節(jié)比較
- JNZ FD22
- CLR OV ;相同,查找成功
- MOV A,R2 ;取對(duì)應(yīng)的順序號(hào)
- RET
- FD22: INC DPTR ;指向下一個(gè)數(shù)據(jù)
- INC DPTR
- INC R2 ;順序號(hào)加一
- DJNZ R6,FD21 ;查完全部數(shù)據(jù)
- SETB OV ;未查找到,失敗
- RET
- ;(28) 標(biāo)號(hào):FDD1 功能:對(duì)分查找(ROM)單字節(jié)無(wú)符號(hào)增序數(shù)據(jù)表格
- ;入口條件:待查找的內(nèi)容在累加器A中,表格首址在DPTR中,字節(jié)數(shù)在R7中。
- ;出口信息:OV=0 時(shí),順序號(hào)在累加器A中;OV=1 時(shí),未找到。
- ;影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 2字節(jié)
- FDD1: MOV B,A ;保存待查找的內(nèi)容
- MOV R2,#0 ;區(qū)間低端指針初始化(指向第一個(gè)數(shù)據(jù))
- MOV A,R7
- DEC A
- MOV R3,A ;區(qū)間高端指針初始化(指向最后一個(gè)數(shù)據(jù))
- FD61: CLR C ;判斷區(qū)間大小
- MOV A,R3
- SUBB A,R2
- JC FD69 ;區(qū)間消失,查找失敗
- RRC A ;取區(qū)間大小的一半
- ADD A,R2 ;加上區(qū)間的低端
- MOV R4,A ;得到區(qū)間的中心
- MOVC A,@A+DPTR;讀取該點(diǎn)的內(nèi)容
- CJNE A,B,FD65;與待查找的內(nèi)容比較
- CLR OV ;相同,查找成功
- MOV A,R4 ;取順序號(hào)
- RET
- FD65: JC FD68 ;該點(diǎn)的內(nèi)容比待查找的內(nèi)容大否?
- MOV A,R4 ;偏大,取該點(diǎn)位置
- DEC A ;減一
- MOV R3,A ;作為新的區(qū)間高端
- SJMP FD61 ;繼續(xù)查找
- FD68: MOV A,R4 ;偏小,取該點(diǎn)位置
- INC A ;加一
- MOV R2,A ;作為新的區(qū)間低端
- SJMP FD61 ;繼續(xù)查找
- FD69: SETB OV ;查找失敗
- RET
- ;(29) 標(biāo)號(hào):FDD2 功能:對(duì)分查找(ROM)雙字節(jié)無(wú)符號(hào)增序數(shù)據(jù)表格
- ;入口條件:查找內(nèi)容在R4、R5中,表格首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。
- ;出口信息:OV=0 時(shí)順序號(hào)在累加器A中,址在DPTR中;OV=1 時(shí)未找到。
- ;影響資源:PSW、A、B、R1~R7、DPTR 堆棧需求: 2字節(jié)
- FDD2: MOV R2,#0 ;區(qū)間低端指針初始化(指向第一個(gè)數(shù)據(jù))
- MOV A,R7
- DEC A
- MOV R3,A ;區(qū)間高端指針初始化,指向最后一個(gè)數(shù)據(jù)
- MOV R6,DPH ;保存表格首址
- MOV R7,DPL
- FD81: CLR C ;判斷區(qū)間大小
- MOV A,R3
- SUBB A,R2
- JC FD89 ;區(qū)間消失,查找失敗
- RRC A ;取區(qū)間大小的一半
- ADD A,R2 ;加上區(qū)間的低端
- MOV R1,A ;得到區(qū)間的中心
- MOV DPH,R6
- CLR C ;計(jì)算區(qū)間中心的地址
- RLC A
- JNC FD82
- INC DPH
- FD82: ADD A,R7
- MOV DPL,A
- JNC FD83
- INC DPH
- FD83: CLR A ;讀取該點(diǎn)的內(nèi)容的高字節(jié)
- MOVC A,@A+DPTR
- MOV B,R4 ;與待查找內(nèi)容的高字節(jié)比較
- CJNE A,B,FD84;不相同
- MOV A,#1 ;讀取該點(diǎn)的內(nèi)容的低字節(jié)
- MOVC A,@A+DPTR
- MOV B,R5
- CJNE A,B,FD84;與待查找內(nèi)容的低字節(jié)比較
- MOV A,R1 ;取順序號(hào)
- CLR OV ;查找成功
- RET
- FD84: JC FD86 ;該點(diǎn)的內(nèi)容比待查找的內(nèi)容大否?
- MOV A,R1 ;偏大,取該點(diǎn)位置
- DEC A ;減一
- MOV R3,A ;作為新的區(qū)間高端
- SJMP FD81 ;繼續(xù)查找
- FD86: MOV A,R1 ;偏小,取該點(diǎn)位置
- INC A ;加一
- MOV R2,A ;作為新的區(qū)間低端
- SJMP FD81 ;繼續(xù)查找
- FD89: MOV DPH,R6 ;相同,恢復(fù)首址
- MOV DPL,R7
- SETB OV ;查找失敗
- RET
- ;(30) 標(biāo)號(hào): DDM1 功能:求單字節(jié)十六進(jìn)制無(wú)符號(hào)數(shù)據(jù)塊的平均值
- ;入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。
- ;出口信息:平均值在累加器A中。
- ;影響資源:PSW、A、R2~R6 堆棧需求: 4字節(jié)
- DDM1: MOV A,R7 ;保存數(shù)據(jù)個(gè)數(shù)
- MOV R2,A
- PUSH DPH
- PUSH DPL
- CLR A ;初始化累加和
- MOV R4,A
- MOV R5,A
- DM11: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)
- ADD A,R5 ;累加到累加和中
- MOV R5,A
- JNC DM12
- INC R4
- DM12: INC DPTR ;調(diào)整指針
- DJNZ R2,DM11 ;累加完全部數(shù)據(jù)
- LCALL D457 ;求平均值(R4R5/R7-→R3)
- MOV A,R3 ;取平均值
- POP DPL
- POP DPH
- RET
- ;(31) 標(biāo)號(hào): DDM2 功能:求雙字節(jié)十六進(jìn)制無(wú)符號(hào)數(shù)據(jù)塊的平均值
- ;入口條件:數(shù)據(jù)塊的首址在DPTR中,雙字節(jié)數(shù)據(jù)總個(gè)數(shù)在R7中。
- ;出口信息:平均值在R4、R5中。
- ;影響資源:PSW、A、R2~R6 堆棧需求: 4字節(jié)
- DDM2: MOV A,R7 ;保存數(shù)據(jù)個(gè)數(shù)
- MOV R2,A ;初始化數(shù)據(jù)指針
- PUSH DPL ;保持首址
- PUSH DPH
- CLR A ;初始化累加和
- MOV R3,A
- MOV R4,A
- MOV R5,A
- DM20: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的高字節(jié)
- MOV B,A
- INC DPTR
- MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的低字節(jié)
- 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 ;累加完全部數(shù)據(jù)
- POP DPH ;恢復(fù)首址
- POP DPL
- LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值
- ;(32) 標(biāo)號(hào): XR1 功能:求單字節(jié)數(shù)據(jù)塊的(異或)校驗(yàn)和
- ;入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)的個(gè)數(shù)在R6、R7中。
- ;出口信息:校驗(yàn)和在累加器A中。
- ;影響資源:PSW、A、B、R4~R7 堆棧需求: 2字節(jié)
- XR1: MOV R4,DPH ;保存數(shù)據(jù)塊的首址
- MOV R5,DPL
- MOV A,R7 ;雙字節(jié)計(jì)數(shù)器調(diào)整
- JZ XR10
- INC R6
- XR10: MOV B,#0 ;校驗(yàn)和初始化
- XR11: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)
- XRL B,A ;異或運(yùn)算
- INC DPTR ;指向下一個(gè)數(shù)據(jù)
- DJNZ R7,XR11 ;雙字節(jié)計(jì)數(shù)器減一
- DJNZ R6,XR11
- MOV DPH,R4 ;恢復(fù)數(shù)據(jù)首址
- MOV DPL,R5
- MOV A,B ;取校驗(yàn)和
- RET
- ;(33) 標(biāo)號(hào): XR2 功能:求雙字節(jié)數(shù)據(jù)塊的(異或)校驗(yàn)和
- ;入口條件:數(shù)據(jù)塊的首址在DPTR中,雙字節(jié)數(shù)據(jù)總個(gè)數(shù)在R6、R7中。
- ;出口信息:校驗(yàn)和在R2、R3中。
- ;影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié)
- XR2: MOV R4,DPH ;保存數(shù)據(jù)塊的首址
- MOV R5,DPL
- MOV A,R7 ;雙字節(jié)計(jì)數(shù)器調(diào)整
- JZ XR20
- INC R6
- XR20: CLR A ;校驗(yàn)和初始化
- MOV R2,A
- MOV R3,A
- XR21: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的高字節(jié)
- XRL A,R2 ;異或運(yùn)算
- MOV R2,A
- INC DPTR
- MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的低字節(jié)
- XRL A,R3 ;異或運(yùn)算
- MOV R3,A
- INC DPTR ;指向下一個(gè)數(shù)據(jù)
- DJNZ R7,XR21 ;雙字節(jié)計(jì)數(shù)器減一
- DJNZ R6,XR21
- MOV DPH,R4 ;恢復(fù)數(shù)據(jù)首址
- MOV DPL,R5
- RET
- ;(34) 標(biāo)號(hào): SORT 功能:?jiǎn)巫止?jié)無(wú)符號(hào)數(shù)據(jù)塊排序(增序)
- ;入口條件:數(shù)據(jù)塊的首址在R0中,字節(jié)數(shù)在R7中。
- ;出口信息:完成排序(增序)
- ;影響資源:PSW、A、R2~R6 堆棧需求: 2字節(jié)
- SORT: MOV A,R7
- MOV R5,A ;比較次數(shù)初始化
- SRT1: CLR F0 ;交換標(biāo)志初始化
- MOV A,R5 ;取上遍比較次數(shù)
- DEC A ;本遍比上遍減少一次
- MOV R5,A ;保存本遍次數(shù)
- MOV R2,A ;復(fù)制到計(jì)數(shù)器中
- JZ SRT5 ;若為零,排序結(jié)束
- MOV A,R0 ;保存數(shù)據(jù)指針
- MOV R6,A
- SRT2: MOV A,@R0 ;讀取一個(gè)數(shù)據(jù)
- MOV R3,A
- INC R0 ;指向下一個(gè)數(shù)據(jù)
- MOV A,@R0 ;再讀取一個(gè)數(shù)據(jù)
- MOV R4,A
- CLR C
- SUBB A,R3 ;比較兩個(gè)數(shù)據(jù)的大小
- JNC SRT4 ;順序正確(增序或相同),不必交換
- SETB F0 ;設(shè)立交換標(biāo)志
- MOV A,R3 ;將兩個(gè)數(shù)據(jù)交換位置
- MOV @R0,A
- DEC R0
- MOV A,R4
- MOV @R0,A
- INC R0 ;指向下一個(gè)數(shù)據(jù)
- SRT4: DJNZ R2,SRT2 ;完成本遍的比較次數(shù)
- MOV A,R6 ;恢復(fù)數(shù)據(jù)首址
- MOV R0,A
- JB F0,SRT1 ;本遍若進(jìn)行過(guò)交換,則需繼續(xù)排序
- SRT5: RET ;排序結(jié)束
- END
- ;(二) MCS-51 浮點(diǎn)運(yùn)算子程序庫(kù)及其使用說(shuō)明
- ;本浮點(diǎn)子程序庫(kù)有三個(gè)不同層次的版本,以便適應(yīng)不同的應(yīng)用場(chǎng)合:
- ;1.小型庫(kù)(FQ51A.ASM):只包含浮點(diǎn)加、減、乘、除子程序。
- ;2.中型庫(kù)(FQ51B.ASM):在小型庫(kù)的基礎(chǔ)上再增加絕對(duì)值、倒數(shù)、比較、平方、開(kāi)平方、
- ;數(shù)制轉(zhuǎn)換等子程序。
- ;3.大型庫(kù)(FQ51.ASM):包含本說(shuō)明書(shū)中的全部子程序。
- ;為便于讀者使用本程序庫(kù),先將有關(guān)約定說(shuō)明如下:
- ;1.雙字節(jié)定點(diǎn)操作數(shù):用[R0]或[R1]來(lái)表示存放在由R0或R1指示的連續(xù)單元中的數(shù)
- ;據(jù),地址小的單元存放高字節(jié)。如果[R0]=1234H,若(R0)=30H,則(30H)=12H,(31H)=34H。
- ;2.二進(jìn)制浮點(diǎn)操作數(shù):用三個(gè)字節(jié)表示,第一個(gè)字節(jié)的最高位為數(shù)符,其余七位為
- ;階碼(補(bǔ)碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用雙字節(jié)
- ;純小數(shù)(原碼)來(lái)表示。當(dāng)尾數(shù)的最高位為1時(shí),便稱為規(guī)格化浮點(diǎn)數(shù),簡(jiǎn)稱操作數(shù)。在
- ;程序說(shuō)明中,也用[R0]或[R1]來(lái)表示R0或R1指示的浮點(diǎn)操作數(shù),例如:當(dāng)[R0]=-6.000時(shí),
- ;則二進(jìn)制浮點(diǎn)數(shù)表示為83C000H。若(R0)=30H,則(30H)=83H,(31H)=0C0H,(32H)=00H。
- ;3.十進(jìn)制浮點(diǎn)操作數(shù):用三個(gè)字節(jié)表示,第一個(gè)字節(jié)的最高位為數(shù)符,其余七位為
- ;階碼(二進(jìn)制補(bǔ)碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用
- ;雙字節(jié)BCD碼純小數(shù)(原碼)來(lái)表示。當(dāng)十進(jìn)制數(shù)的絕對(duì)值大于1時(shí),階碼就等于整數(shù)
- ;部分的位數(shù),如 876.5 的階碼是03H,-876.5 的階碼是 83H;當(dāng)十進(jìn)制數(shù)的絕對(duì)值小于1
- ;時(shí),階碼就等于 80H 減去小數(shù)點(diǎn)后面零的個(gè)數(shù),例如 0.00382 的階碼是 7EH,-0.00382
- ;的階碼是 0FEH。在程序說(shuō)明中,用[R0]或[R1]來(lái)表示R0或R1指示的十進(jìn)制浮點(diǎn)操作數(shù)。例
- ;如有一個(gè)十進(jìn)制浮點(diǎn)操作數(shù)存放在30H、31H、32H中,數(shù)值是 -0.07315,即-0.7315乘以10
- ;的-1次方,則(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]來(lái)指向它,則應(yīng)使(R0)=30H。
- ;4.運(yùn)算精度:?jiǎn)未味c(diǎn)運(yùn)算精度為結(jié)果最低位的當(dāng)量值;單次二進(jìn)制浮點(diǎn)算術(shù)運(yùn)算
- ;的精度優(yōu)于十萬(wàn)分之三;單次二進(jìn)制浮點(diǎn)超越函數(shù)運(yùn)算的精度優(yōu)于萬(wàn)分之一;BCD碼浮
- ;點(diǎn)數(shù)本身的精度比較低(萬(wàn)分之一到千分之一),不宜作為運(yùn)算的操作數(shù),僅用于輸入或
- ;輸出時(shí)的數(shù)制轉(zhuǎn)換。不管那種數(shù)據(jù)格式,隨著連續(xù)運(yùn)算的次數(shù)增加,精度都會(huì)下降。
- ;5.工作區(qū):數(shù)據(jù)工作區(qū)固定在A、B、R2~R7,數(shù)符或標(biāo)志工作區(qū)固定在PSW和23H單
- ;元(位1CH~1FH)。在浮點(diǎn)系統(tǒng)中,R2、R3、R4和位1FH為第一工作區(qū),R5、R6、R7和位1EH
- ;為第二工作區(qū)。用戶只要不在工作區(qū)中存放無(wú)關(guān)的或非消耗性的信息,程序就具有較好的
- ;透明性。
- ;6.子程序調(diào)用范例:由于本程序庫(kù)特別注意了各子程序接口的相容性,很容易采用
- ;積木方式(或流水線方式)完成一個(gè)公式的計(jì)算。以浮點(diǎn)運(yùn)算為例:
- ;計(jì)算 y = Ln √ | Sin (ab/c+d) |
- ;已知:a=-123.4;b=0.7577;c=56.34;d=1.276; 它們分別存放在30H、33H、36H、
- ;39H開(kāi)始的連續(xù)三個(gè)單元中。用BCD碼浮點(diǎn)數(shù)表示時(shí),分別為a=831234H;b=007577H;
- ;c=025634H;d=011276H。
- ;求解過(guò)程:通過(guò)調(diào)用BTOF子程序,將各變量轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù),再進(jìn)行各
- ;種運(yùn)算,最后調(diào)用FTOB子程序,還原成十進(jìn)制形式,供輸出使用。程序如下:
- TEST: MOV R0,#39H ;指向BCD碼浮點(diǎn)操作數(shù)d
- LCALL BTOF ;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
- MOV R0,#36H ;指向BCD碼浮點(diǎn)操作數(shù)c
- LCALL BTOF ;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
- MOV R0,#33H ;指向BCD碼浮點(diǎn)操作數(shù)b
- LCALL BTOF ;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
- MOV R0,#30H ;指向BCD碼浮點(diǎn)操作數(shù)a
- LCALL BTOF ;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
- MOV R1,#33H ;指向二進(jìn)制浮點(diǎn)操作數(shù)b
- LCALL FMUL ;進(jìn)行浮點(diǎn)乘法運(yùn)算
- MOV R1,#36H ;指向二進(jìn)制浮點(diǎn)操作數(shù)c
- LCALL FDIV ;進(jìn)行浮點(diǎn)除法運(yùn)算
- MOV R1,#39H ;指向二進(jìn)制浮點(diǎn)操作數(shù)d
- LCALL FADD ;進(jìn)行浮點(diǎn)加法運(yùn)算
- LCALL FSIN ;進(jìn)行浮點(diǎn)正弦運(yùn)算
- LCALL FABS ;進(jìn)行浮點(diǎn)絕對(duì)值運(yùn)算
- LCALL FSQR ;進(jìn)行浮點(diǎn)開(kāi)平方運(yùn)算
- LCALL FLN ;進(jìn)行浮點(diǎn)對(duì)數(shù)運(yùn)算
- LCALL FTOB ;將結(jié)果轉(zhuǎn)換成BCD碼浮點(diǎn)數(shù)
- STOP: LJMP STOP
- END
- ;運(yùn)行結(jié)果,[R0]=804915H,即y=-0.4915,比較精確的結(jié)果應(yīng)該是-0.491437。
- ;(1) 標(biāo)號(hào): FSDT 功能:浮點(diǎn)數(shù)格式化
- ;入口條件:待格式化浮點(diǎn)操作數(shù)在[R0]中。
- ;出口信息:已格式化浮點(diǎn)操作數(shù)仍在[R0]中。
- ;影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節(jié)
- FSDT: LCALL MVR0 ;將待格式化操作數(shù)傳送到第一工作區(qū)中
- LCALL RLN ;通過(guò)左規(guī)完成格式化
- LJMP MOV0 ;將已格式化浮點(diǎn)操作數(shù)傳回到[R0]中
- ;(2) 標(biāo)號(hào): FADD 功能:浮點(diǎn)數(shù)加法
- ;入口條件:被加數(shù)在[R0]中,加數(shù)在[R1]中。
- ;出口信息:OV=0時(shí),和仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 6字節(jié)
- FADD: CLR F0 ;設(shè)立加法標(biāo)志
- SJMP AS ;計(jì)算代數(shù)和
- ;(3) 標(biāo)號(hào): FSUB 功能:浮點(diǎn)數(shù)減法
- ;入口條件:被減數(shù)在[R0]中,減數(shù)在[R1]中。
- ;出口信息:OV=0時(shí),差仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
- FSUB: SETB F0 ;設(shè)立減法標(biāo)志
- AS: LCALL MVR1 ;計(jì)算代數(shù)和。先將[R1]傳送到第二工作區(qū)
- MOV C,F0 ;用加減標(biāo)志來(lái)校正第二操作數(shù)的有效符號(hào)
- RRC A
- XRL A,@R1
- MOV C,ACC.7
- ASN: MOV 1EH,C ;將第二操作數(shù)的有效符號(hào)存入位1EH中
- XRL A,@R0 ;與第一操作數(shù)的符號(hào)比較
- RLC A
- MOV F0,C ;保存比較結(jié)果
- LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中
- LCALL AS1 ;在工作寄存器中完成代數(shù)運(yùn)算
- MOV0: INC R0 ;將結(jié)果傳回到[R0]中的子程序入口
- INC R0
- MOV A,R4 ;傳回尾數(shù)的低字節(jié)
- MOV @R0,A
- DEC R0
- MOV A,R3 ;傳回尾數(shù)的高字節(jié)
- MOV @R0,A
- DEC R0
- MOV A,R2 ;取結(jié)果的階碼
- MOV C,1FH ;取結(jié)果的數(shù)符
- MOV ACC.7,C ;拼入階碼中
- MOV @R0,A
- CLR ACC.7 ;不考慮數(shù)符
- CLR OV ;清除溢出標(biāo)志
- CJNE A,#3FH,MV01;階碼是否上溢?
- SETB OV ;設(shè)立溢出標(biāo)志
- MV01: MOV A,@R0 ;取出帶數(shù)符的階碼
- RET
- MVR0: MOV A,@R0 ;將[R0]傳送到第一工作區(qū)中的子程序
- MOV C,ACC.7 ;將數(shù)符保存在位1FH中
- MOV 1FH,C
- MOV C,ACC.6 ;將階碼擴(kuò)充為8bit補(bǔ)碼
- MOV ACC.7,C
- MOV R2,A ;存放在R2中
- INC R0
- MOV A,@R0 ;將尾數(shù)高字節(jié)存放在R3中
- MOV R3,A
- INC R0
- MOV A,@R0 ;將尾數(shù)低字節(jié)存放在R4中
- MOV R4,A
- DEC R0 ;恢復(fù)數(shù)據(jù)指針
- DEC R0
- RET
- MVR1: MOV A,@R1 ;將[R1]傳送到第二工作區(qū)中的子程序
- MOV C,ACC.7 ;將數(shù)符保存在位1EH中
- MOV 1EH,C
- MOV C,ACC.6 ;將階碼擴(kuò)充為8bit補(bǔ)碼
- MOV ACC.7,C
- MOV R5,A ;存放在R5中
- INC R1
- MOV A,@R1 ;將尾數(shù)高字節(jié)存放在R6中
- MOV R6,A
- INC R1
- MOV A,@R1 ;將尾數(shù)低字節(jié)存放在R7中
- MOV R7,A
- DEC R1 ;恢復(fù)數(shù)據(jù)指針
- DEC R1
- RET
- AS1: MOV A,R6 ;讀取第二操作數(shù)尾數(shù)高字節(jié)
- ORL A,R7
- JZ AS2 ;第二操作數(shù)為零,不必運(yùn)算
- MOV A,R3 ;讀取第一操作數(shù)尾數(shù)高字節(jié)
- ORL A,R4
- JNZ EQ1
- MOV A,R6 ;第一操作數(shù)為零,結(jié)果以第二操作數(shù)為準(zhǔn)
- 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 ;對(duì)階,比較兩個(gè)操作數(shù)的階碼
- XRL A,R5
- JZ AS4 ;階碼相同,對(duì)階結(jié)束
- JB ACC.7,EQ3;階符互異
- MOV A,R2 ;階符相同,比較大小
- CLR C
- SUBB A,R5
- JC EQ4
- EQ2: CLR C ;第二操作數(shù)右規(guī)一次
- MOV A,R6 ;尾數(shù)縮小一半
- RRC A
- MOV R6,A
- MOV A,R7
- RRC A
- MOV R7,A
- INC R5 ;階碼加一
- ORL A,R6 ;尾數(shù)為零否?
- JNZ EQ1 ;尾數(shù)不為零,繼續(xù)對(duì)階
- MOV A,R2 ;尾數(shù)為零,提前結(jié)束對(duì)階
- MOV R5,A
- SJMP AS4
- EQ3: MOV A,R2 ;判斷第一操作數(shù)階符
- JNB ACC.7,EQ2;如為正,右規(guī)第二操作數(shù)
- EQ4: CLR C
- LCALL RR1 ;第一操作數(shù)右規(guī)一次
- ORL A,R3 ;尾數(shù)為零否?
- JNZ EQ1 ;不為零,繼續(xù)對(duì)階
- MOV A,R5 ;尾數(shù)為零,提前結(jié)束對(duì)階
- MOV R2,A
- AS4: JB F0,AS5 ;尾數(shù)加減判斷
- MOV A,R4 ;尾數(shù)相加
- ADD A,R7
- MOV R4,A
- MOV A,R3
- ADDC A,R6
- MOV R3,A
- JNC AS2
- LJMP RR1 ;有進(jìn)位,右規(guī)一次
- AS5: CLR C ;比較絕對(duì)值大小
- MOV A,R4
- SUBB A,R7
- MOV B,A
- MOV A,R3
- SUBB A,R6
- JC AS6
- MOV R4,B ;第一尾數(shù)減第二尾數(shù)
- MOV R3,A
- LJMP RLN ;結(jié)果規(guī)格化
- AS6: CPL 1FH ;結(jié)果的符號(hào)與第一操作數(shù)相反
- CLR C ;結(jié)果的絕對(duì)值為第二尾數(shù)減第一尾數(shù)
- MOV A,R7
- SUBB A,R4
- MOV R4,A
- MOV A,R6
- SUBB A,R3
- MOV R3,A
- RLN: MOV A,R3 ;浮點(diǎn)數(shù)規(guī)格化
- ORL A,R4 ;尾數(shù)為零否?
- JNZ RLN1
- MOV R2,#0C1H;階碼取最小值
- RET
- RLN1: MOV A,R3
- JB ACC.7,RLN2;尾數(shù)最高位為一否?
- CLR C ;不為一,左規(guī)一次
- LCALL RL1
- SJMP RLN ;繼續(xù)判斷
- RLN2: CLR OV ;規(guī)格化結(jié)束
- RET
- RL1: MOV A,R4 ;第一操作數(shù)左規(guī)一次
- RLC A ;尾數(shù)擴(kuò)大一倍
- MOV R4,A
- MOV A,R3
- RLC A
- MOV R3,A
- DEC R2 ;階碼減一
- CJNE R2,#0C0H,RL1E;階碼下溢否?
- CLR A
- MOV R3,A ;階碼下溢,操作數(shù)以零計(jì)
- MOV R4,A
- MOV R2,#0C1H
- RL1E: CLR OV
- RET
- RR1: MOV A,R3 ;第一操作數(shù)右規(guī)一次
- RRC A ;尾數(shù)縮小一半
- MOV R3,A
- MOV A,R4
- RRC A
- MOV R4,A
- INC R2 ;階碼加一
- CLR OV ;清溢出標(biāo)志
- CJNE R2,#40H,RR1E;階碼上溢否?
- MOV R2,#3FH ;階碼溢出
- SETB OV
- RR1E: RET
- ;(4) 標(biāo)號(hào): FMUL 功能:浮點(diǎn)數(shù)乘法
- ;入口條件:被乘數(shù)在[R0]中,乘數(shù)在[R1]中。
- ;出口信息:OV=0時(shí),積仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
- FMUL: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中
- MOV A,@R0
- XRL A,@R1 ;比較兩個(gè)操作數(shù)的符號(hào)
- RLC A
- MOV 1FH,C ;保存積的符號(hào)
- LCALL MUL0 ;計(jì)算積的絕對(duì)值
- LJMP MOV0 ;將結(jié)果傳回到[R0]中
- MUL0: LCALL MVR1 ;將[R1]傳送到第二工作區(qū)中
- MUL1: MOV A,R3 ;第一尾數(shù)為零否?
- ORL A,R4
- JZ MUL6
- MOV A,R6 ;第二尾數(shù)為零否?
- ORL A,R7
- JZ MUL5
- MOV A,R7 ;計(jì)算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;積為規(guī)格化數(shù)否?
- MOV A,R7 ;左規(guī)一次
- 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 ;階碼上溢,設(shè)立標(biāo)志
- SETB OV
- RET
- MUL4: JB ACC.6,MUL6
- MUL5: CLR A ;結(jié)果清零(因子為零或階碼下溢)
- MOV R3,A
- MOV R4,A
- MOV R2,#41H
- MUL6: CLR OV
- RET
- ;(5) 標(biāo)號(hào): FDIV 功能:浮點(diǎn)數(shù)除法
- ;入口條件:被除數(shù)在[R0]中,除數(shù)在[R1]中。
- ;出口信息:OV=0時(shí),商仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節(jié)
- FDIV: INC R0
- MOV A,@R0
- INC R0
- ORL A,@R0
- DEC R0
- DEC R0
- JNZ DIV1
- MOV @R0,#41H;被除數(shù)為零,不必運(yùn)算
- CLR OV
- RET
- DIV1: INC R1
- MOV A,@R1
- INC R1
- ORL A,@R1
- DEC R1
- DEC R1
- JNZ DIV2
- SETB OV ;除數(shù)為零,溢出
- RET
- DIV2: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中
- MOV A,@R0
- XRL A,@R1 ;比較兩個(gè)操作數(shù)的符號(hào)
- RLC A
- MOV 1FH,C ;保存結(jié)果的符號(hào)
- LCALL MVR1 ;將[R1]傳送到第二工作區(qū)中
- LCALL DIV3 ;調(diào)用工作區(qū)浮點(diǎn)除法
- LJMP MOV0 ;回傳結(jié)果
- DIV3: CLR C ;比較尾數(shù)的大小
- MOV A,R4
- SUBB A,R7
- MOV A,R3
- SUBB A,R6
- JC DIV4
- LCALL RR1 ;被除數(shù)右規(guī)一次
- SJMP DIV3
- DIV4: CLR A ;借用R0R1R2作工作寄存器
- XCH A,R0 ;清零并保護(hù)之
- PUSH ACC
- CLR A
- XCH A,R1
- PUSH ACC
- MOV A,R2
- PUSH ACC
- MOV B,#10H ;除法運(yùn)算,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 ;將結(jié)果存回R3R4
- MOV R4,A
- CLR A
- ADDC A,R0
- MOV R3,A
- POP ACC ;恢復(fù)R0R1R2
- MOV R2,A
- POP ACC
- MOV R1,A
- POP ACC
- MOV R0,A
- MOV A,R2 ;計(jì)算商的階碼
- CLR C
- SUBB A,R5
- LCALL MD ;階碼檢驗(yàn)
- LJMP RLN ;規(guī)格化
- ;(6) 標(biāo)號(hào): FCLR 功能:浮點(diǎn)數(shù)清零
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:操作數(shù)被清零。
- ;影響資源:A 堆棧需求: 2字節(jié)
- FCLR: INC R0
- INC R0
- CLR A
- MOV @R0,A
- DEC R0
- MOV @R0,A
- DEC R0
- MOV @R0,#41H
- RET
- ;(7) 標(biāo)號(hào): FZER 功能:浮點(diǎn)數(shù)判零
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:若累加器A為零,則操作數(shù)[R0]為零,否則不為零。
- ;影響資源:A 堆棧需求: 2字節(jié)
- FZER: INC R0
- INC R0
- MOV A,@R0
- DEC R0
- ORL A,@R0
- DEC R0
- JNZ ZERO
- MOV @R0,#41H
- ZERO: RET
- ;(8) 標(biāo)號(hào): FMOV 功能:浮點(diǎn)數(shù)傳送
- ;入口條件:源操作數(shù)在[R1]中,目標(biāo)地址為[R0]。
- ;出口信息:[R0]=[R1],[R1]不變。
- ;影響資源:A 堆棧需求: 2字節(jié)
- 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) 標(biāo)號(hào): FPUS 功能:浮點(diǎn)數(shù)壓棧
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:操作數(shù)壓入棧頂。
- ;影響資源:A、R2、R3 堆棧需求: 5字節(jié)
- FPUS: POP ACC ;將返回地址保存在R2R3中
- MOV R2,A
- POP ACC
- MOV R3,A
- MOV A,@R0 ;將操作數(shù)壓入堆棧
- 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) 標(biāo)號(hào): FPOP 功能:浮點(diǎn)數(shù)出棧
- ;入口條件:操作數(shù)處于棧頂。
- ;出口信息:操作數(shù)彈至[R0]中。
- ;影響資源:A、R2、R3 堆棧需求: 2字節(jié)
- FPOP: POP ACC ;將返回地址保存在R2R3中
- MOV R2,A
- POP ACC
- MOV R3,A
- INC R0
- INC R0
- POP ACC ;將操作數(shù)彈出堆棧,傳送到[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) 標(biāo)號(hào): FCMP 功能:浮點(diǎn)數(shù)代數(shù)值比較(不影響待比較操作數(shù))
- ;入口條件:待比較操作數(shù)分別在[R0]和[R1]中。
- ;出口信息:若CY=1,則[R0] < [R1],若CY=0且A=0則 [R0] = [R1],否則[R0] > [R1]。
- ;影響資源:A、B、PSW 堆棧需求: 2字節(jié)
- FCMP: MOV A,@R0 ;數(shù)符比較
- XRL A,@R1
- JNB ACC.7,CMP2
- MOV A,@R0 ;兩數(shù)異號(hào),以[R0]數(shù)符為準(zhǔn)
- RLC A
- MOV A,#0FFH
- RET
- CMP2: MOV A,@R1 ;兩數(shù)同號(hào),準(zhǔn)備比較階碼
- MOV C,ACC.6
- MOV ACC.7,C
- MOV B,A
- MOV A,@R0
- MOV C,ACC.7
- MOV F0,C ;保存[R0]的數(shù)符
- MOV C,ACC.6
- MOV ACC.7,C
- CLR C ;比較階碼
- SUBB A,B
- JZ CMP6
- RLC A ;取階碼之差的符號(hào)
- JNB F0,CMP5
- CPL C ;[R0]為負(fù)時(shí),結(jié)果取反
- CMP5: MOV A,#0FFH ;兩數(shù)不相等
- RET
- CMP6: INC R0 ;階碼相同時(shí),準(zhǔn)備比較尾數(shù)
- 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]為負(fù)時(shí),結(jié)果取反
- CMP7: RET
- ;(12) 標(biāo)號(hào): FABS 功能:浮點(diǎn)絕對(duì)值函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:結(jié)果仍在[R0]中。
- ;影響資源:A 堆棧需求: 2字節(jié)
- FABS: MOV A,@R0 ;讀取操作數(shù)的階碼
- CLR ACC.7 ;清除數(shù)符
- MOV @R0,A ;回傳階碼
- RET
- ;(13) 標(biāo)號(hào): FSGN 功能:浮點(diǎn)符號(hào)函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:累加器 A=1 時(shí)為正數(shù),A=0FFH時(shí)為負(fù)數(shù),A=0 時(shí)為零。
- ;影響資源:PSW、A 堆棧需求: 2字節(jié)
- FSGN: INC R0 ;讀尾數(shù)
- MOV A,@R0
- INC R0
- ORL A,@R0
- DEC R0
- DEC R0
- JNZ SGN
- RET ;尾數(shù)為零,結(jié)束
- SGN: MOV A,@R0 ;讀取操作數(shù)的階碼
- RLC A ;取數(shù)符
- MOV A,#1 ;按正數(shù)初始化
- JNC SGN1 ;是正數(shù),結(jié)束
- MOV A,#0FFH ;是負(fù)數(shù),改變標(biāo)志
- SGN1: RET
- ;(14) 標(biāo)號(hào): FINT 功能:浮點(diǎn)取整函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:結(jié)果仍在[R0]中。
- ;影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節(jié)
- FINT: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中
- LCALL INT ;在工作寄存器中完成取整運(yùn)算
- LJMP MOV0 ;將結(jié)果傳回到[R0]中
- INT: MOV A,R3
- ORL A,R4
- JNZ INTA
- CLR 1FH ;尾數(shù)為零,階碼也清零,結(jié)束取整
- MOV R2,#41H
- RET
- INTA: MOV A,R2
- JZ INTB ;階碼為零否?
- JB ACC.7,INTB;階符為負(fù)否?
- CLR C
- SUBB A,#10H ;階碼小于16否?
- JC INTD
- RET ;階碼大于16,已經(jīng)是整數(shù)
- INTB: CLR A ;絕對(duì)值小于一,取整后正數(shù)為零,負(fù)數(shù)為負(fù)一
- 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 ;舍尾標(biāo)志初始化
- INTE: CLR C
- LCALL RR1 ;右規(guī)一次
- ORL C,F0 ;記憶舍尾情況
- MOV F0,C
- CJNE R2,#10H,INTE;階碼達(dá)到16(尾數(shù)完全為整數(shù))否?
- JNB F0,INTF ;舍去部分為零否?
- JNB 1FH,INTF;操作數(shù)為正數(shù)否?
- INC R4 ;對(duì)于帶小數(shù)的負(fù)數(shù),向下取整
- MOV A,R4
- JNZ INTF
- INC R3
- INTF: LJMP RLN ;將結(jié)果規(guī)格化
- ;(15) 標(biāo)號(hào): FRCP 功能:浮點(diǎn)倒數(shù)函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節(jié)
- FRCP: MOV A,@R0
- MOV C,ACC.7
- MOV 1FH,C ;保存數(shù)符
- MOV C,ACC.6 ;絕對(duì)值傳送到第二工作區(qū)
- 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 ;零不能求倒數(shù),設(shè)立溢出標(biāo)志
- RET
- RCP: MOV A,R6
- JB ACC.7,RCP2;操作數(shù)格式化否?
- 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 ;將數(shù)值1.00傳送到第一工作區(qū)
- MOV R3,#80H
- MOV R4,#0
- LCALL DIV3 ;調(diào)用工作區(qū)浮點(diǎn)除法,求得倒數(shù)
- LJMP MOV0 ;回傳結(jié)果
- ;(16) 標(biāo)號(hào): FSQU 功能:浮點(diǎn)數(shù)平方
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),平方值仍然在[R0]中,OV=1時(shí)溢出。
- ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 9字節(jié)
- FSQU: MOV A,R0 ;將操作數(shù)
- XCH A,R1 ;同時(shí)作為乘數(shù)
- PUSH ACC ;保存R1指針
- LCALL FMUL ;進(jìn)行乘法運(yùn)算
- POP ACC
- MOV R1,A ;恢復(fù)R1指針
- RET
- ;(17) 標(biāo)號(hào): FSQR 功能:浮點(diǎn)數(shù)開(kāi)平方(快速逼近算法)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),平方根仍在[R0]中,OV=1時(shí),負(fù)數(shù)開(kāi)平方出錯(cuò)。
- ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
- FSQR: MOV A,@R0
- JNB ACC.7,SQR
- SETB OV ;負(fù)數(shù)開(kāi)平方,出錯(cuò)
- RET
- SQR: INC R0
- INC R0
- MOV A,@R0
- DEC R0
- ORL A,@R0
- DEC R0
- JNZ SQ
- MOV @R0,#41H;尾數(shù)為零,不必運(yùn)算
- CLR OV
- RET
- SQ: MOV A,@R0
- MOV C,ACC.6 ;將階碼擴(kuò)展成8bit補(bǔ)碼
- MOV ACC.7,C
- INC A ;加一
- CLR C
- RRC A ;除二
- MOV @R0,A ;得到平方根的階碼,回存之
- INC R0 ;指向被開(kāi)方數(shù)尾數(shù)的高字節(jié)
- JC SQR0 ;原被開(kāi)方數(shù)的階碼是奇數(shù)嗎?
- MOV A,@R0 ;是奇數(shù),尾數(shù)右規(guī)一次
- RRC A
- MOV @R0,A
- INC R0
- MOV A,@R0
- RRC A
- MOV @R0,A
- DEC R0
- SQR0: MOV A,@R0
- JZ SQR9 ;尾數(shù)為零,不必運(yùn)算
- MOV R2,A ;將尾數(shù)傳送到R2R3中
- INC R0
- MOV A,@R0
- MOV R3,A
- MOV A,R2 ;快速開(kāi)方,參閱定點(diǎn)子程序說(shuō)明
- 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 ;將平方根的尾數(shù)回傳到[R0]中
- MOV @R0,A
- DEC R0
- MOV A,R2
- MOV @R0,A
- SQR9: DEC R0 ;數(shù)據(jù)指針回歸原位
- CLR OV ;開(kāi)方結(jié)果有效
- RET
- ;(18) 標(biāo)號(hào): FPLN 功能:浮點(diǎn)數(shù)多項(xiàng)式計(jì)算
- ;入口條件:自變量在[R0]中,多項(xiàng)式系數(shù)在調(diào)用指令之后,以40H結(jié)束。
- ;出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 4字節(jié)
- FPLN: POP DPH ;取出多項(xiàng)式系數(shù)存放地址
- POP DPL
- XCH A,R0 ;R0、R1交換角色,自變量在[R1]中
- XCH A,R1
- XCH A,R0
- CLR A ;清第一工作區(qū)
- MOV R2,A
- MOV R3,A
- MOV R4,A
- CLR 1FH
- PLN1: CLR A ;讀取一個(gè)系數(shù),并裝入第二工作區(qū)
- 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 ;指向下一個(gè)系數(shù)
- MOV C,1EH ;比較兩個(gè)數(shù)符
- RRC A
- XRL A,23H
- RLC A
- MOV F0,C ;保存比較結(jié)果
- LCALL AS1 ;進(jìn)行代數(shù)加法運(yùn)算
- CLR A ;讀取下一個(gè)系數(shù)的第一個(gè)字節(jié)
- MOVC A,@A+DPTR
- CJNE A,#40H,PLN2;是結(jié)束標(biāo)志嗎?
- XCH A,R0 ;運(yùn)算結(jié)束,恢復(fù)R0、R1原來(lái)的角色
- XCH A,R1
- XCH A,R0
- LCALL MOV0 ;將結(jié)果回傳到[R0]中
- CLR A
- INC DPTR
- JMP @A+DPTR ;返回主程序
- PLN2: MOV A,@R1 ;比較自變量和中間結(jié)果的符號(hào)
- XRL A,23H
- RLC A
- MOV 1FH,C ;保存比較結(jié)果
- LCALL MUL0 ;進(jìn)行乘法運(yùn)算
- SJMP PLN1 ;繼續(xù)下一項(xiàng)運(yùn)算
- ;(19) 標(biāo)號(hào): FLOG 功能:以10為底的浮點(diǎn)對(duì)數(shù)函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),負(fù)數(shù)或零求對(duì)數(shù)出錯(cuò)。
- ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:9字節(jié)
- FLOG: LCALL FLN ;先以e為底求對(duì)數(shù)
- JNB OV,LOG
- RET ;如溢出則停止計(jì)算
- LOG: MOV R5,#0FFH;系數(shù)0.43430(1/Ln10)
- MOV R6,#0DEH
- MOV R7,#5CH
- LCALL MUL1 ;通過(guò)相乘來(lái)?yè)Q底
- LJMP MOV0 ;傳回結(jié)果
- ;(20) 標(biāo)號(hào): FLN 功能:以e為底的浮點(diǎn)對(duì)數(shù)函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),負(fù)數(shù)或零求對(duì)數(shù)出錯(cuò)。
- ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 7字節(jié)
- FLN: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)
- JB 1FH,LNOV;負(fù)數(shù)或零求對(duì)數(shù),出錯(cuò)
- MOV A,R3
- ORL A,R4
- JNZ LN0
- LNOV: SETB OV
- RET
- LN0: CLR C
- LCALL RL1 ;左規(guī)一次
- CLR A
- XCH A,R2 ;保存原階碼,清零工作區(qū)的階碼
- PUSH ACC
- LCALL RLN ;規(guī)格化
- LCALL MOV0 ;回傳
- LCALL FPLN ;用多項(xiàng)式計(jì)算尾數(shù)的對(duì)數(shù)
- 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 ;結(jié)束
- POP ACC ;取出原階碼
- JNZ LN1
- RET ;如為零,則結(jié)束
- LN1: CLR 1EH ;清第二區(qū)數(shù)符
- MOV C,ACC.7
- MOV F0,C ;保存階符
- JNC LN2
- CPL A ;當(dāng)階碼為負(fù)時(shí),求其絕對(duì)值
- INC A
- LN2: MOV R2,A ;階碼的絕對(duì)值乘以0.69315
- MOV B,#72H
- MUL AB
- XCH A,R2
- MOV R7,B
- MOV B,#0B1H
- MUL AB
- ADD A,R7
- MOV R7,A ;乘積的尾數(shù)在R6R7R2中
- CLR A
- ADDC A,B
- MOV R6,A
- MOV R5,#8 ;乘積的階碼初始化(整數(shù)部分為一字節(jié))
- 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 ;取出階符,作為乘積的數(shù)符
- MOV ACC.7,C
- LJMP ASN ;與尾數(shù)的對(duì)數(shù)合并,得原操作數(shù)的對(duì)數(shù)
- ;(21) 標(biāo)號(hào): FE10 功能:以10為底的浮點(diǎn)指數(shù)函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
- FE10: MOV R5,#2 ;加權(quán)系數(shù)為3.3219(Log210)
- MOV R6,#0D4H
- MOV R7,#9AH
- SJMP EXP ;先進(jìn)行加權(quán)運(yùn)算,后以2為底統(tǒng)一求冪
- ;(22) 標(biāo)號(hào): FEXP 功能:以e為底的浮點(diǎn)指數(shù)函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
- FEXP: MOV R5,#1 ;加權(quán)系數(shù)為1.44272(Lng2e)
- MOV R6,#0B8H
- MOV R7,#0ABH
- EXP: CLR 1EH ;加權(quán)系數(shù)為正數(shù)
- LCALL MVR0 ;將[R0]傳送到第一工作區(qū)
- LCALL MUL1 ;進(jìn)行加權(quán)運(yùn)算
- SJMP E20 ;以2為底統(tǒng)一求冪
- ;(23) 標(biāo)號(hào): FE2 功能:以2為底的浮點(diǎn)指數(shù)函數(shù)
- ;入口條件:操作數(shù)在[R0]中。
- ;出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),溢出。
- ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
- FE2: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)
- E20: MOV A,R3
- ORL A,R4
- JZ EXP1 ;尾數(shù)為零
- MOV A,R2
- JB ACC.7,EXP2;階符為負(fù)?
- SETB C
- SUBB A,#6 ;階碼大于6否?
- JC EXP2
- JB 1FH,EXP0;數(shù)符為負(fù)否?
- MOV @R0,#3FH;正指數(shù)過(guò)大,冪溢出
- INC R0
- MOV @R0,#0FFH
- INC R0
- MOV @R0,#0FFH
- DEC R0
- DEC R0
- SETB OV
- RET
- EXP0: MOV @R0,#41H;負(fù)指數(shù)過(guò)大,冪下溢,清零處理
- CLR A
- INC R0
- MOV @R0,A
- INC R0
- MOV @R0,A
- DEC R0
- DEC R0
- CLR OV
- RET
- EXP1: MOV @R0,#1 ;指數(shù)為零,冪為1.00
- INC R0
- MOV @R0,#80H
- INC R0
- MOV @R0,#0
- DEC R0
- DEC R0
- CLR OV
- RET
- EXP2: MOV A,R2 ;將指數(shù)復(fù)制到第二工作區(qū)
- MOV R5,A
- MOV A,R3
- MOV R6,A
- MOV A,R4
- MOV R7,A
- MOV C,1FH
- MOV 1EH,C
- LCALL INT ;對(duì)第一區(qū)取整
- MOV A,R3
- JZ EXP4
- EXP3: CLR C ;使尾數(shù)高字節(jié)R3對(duì)應(yīng)一個(gè)字節(jié)整數(shù)
- RRC A
- INC R2
- CJNE R2,#8,EXP3
- EXP4: MOV R3,A
- JNB 1FH,EXP5
- CPL A ;并用補(bǔ)碼表示
- INC A
- EXP5: PUSH ACC ;暫時(shí)保存之
- LCALL RLN ;重新規(guī)格化
- CPL 1FH
- SETB F0
- LCALL AS1 ;求指數(shù)的小數(shù)部分
- LCALL MOV0 ;回傳指數(shù)的小數(shù)部分
- LCALL FPLN ;通過(guò)多項(xiàng)式計(jì)算指數(shù)的小數(shù)部分的冪
- 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 ;結(jié)束
- POP ACC ;取出指數(shù)的整數(shù)部分
- ADD A,R2 ;按補(bǔ)碼加到冪的階碼上
- MOV R2,A
- CLR 1FH ;冪的符號(hào)為正
- LJMP MOV0 ;將冪傳回[R0]中
- ;(24)標(biāo)號(hào): DTOF 功能:雙字節(jié)十六進(jìn)制定點(diǎn)數(shù)轉(zhuǎn)換成格式化浮點(diǎn)數(shù)
- ;入口條件:雙字節(jié)定點(diǎn)數(shù)的絕對(duì)值在[R0]中,數(shù)符在位1FH中,整數(shù)部分的位數(shù)在A中。
- ;出口信息:轉(zhuǎn)換成格式化浮點(diǎn)數(shù)在[R0]中(三字節(jié))。
- ;影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節(jié)
- DTOF: MOV R2,A ;按整數(shù)的位數(shù)初始化階碼
- MOV A,@R0 ;將定點(diǎn)數(shù)作尾數(shù)
- MOV R3,A
- INC R0
- MOV A,@R0
- MOV R4,A
- DEC R0
- LCALL RLN ;進(jìn)行規(guī)格化
- LJMP MOV0 ;傳送結(jié)果到[R0]中
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
|