找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4989|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

MCS-51單片機(jī)實(shí)用匯編語言子程序庫

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:270854 發(fā)表于 2018-1-24 17:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
;片內(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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é)無符號(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 A
MOV R2,B
MOV B,#10H
NDV311 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 : XCH A,R2
MOV R7,A
RET
;單字節(jié)無符號(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 A
MOV R5,B
MOV B,#18H
NDV411 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV412
JC NDV413
NDV412 : MOV R5,A
INC R4
NDV413 : DJNZ B,NDV411
POP A
CLR OV
JZ NDV414
SETB OV
NDV414 : XCH A,R5
MOV R7,A
RET
;雙字節(jié)無符號(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 A
MOV B,#00H
NDV421 : MOV A,R2
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JC NDV422
MOV R5,A
MOV A,R1
MOV R2,A
INC B
SJMP NDV421
NDV422 : PUSH B
MOV B,#10H
NDV423 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
XCH A,R5
RLC A
XCH A,R5
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JB F0,NCV424
JC NDV425
NCV424 : MOV R5,A
MOV A,R1
MOV R2,A
INC R4
NDV425 : DJNZ B,NDV423
POP A
CLR OV
JNZ NDV426
SETB OV
NDV426 : XCH A,R2
MOV R7,A
MOV A,R5
MOV R6,A
POP A
MOV R1,A
RET
;N字節(jié)無符號(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é)無符號(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
NMUL21 : MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
CLR OV
RET
NDIV31 : MOV B,#10H
NDV311 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
RET
;內(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 A
PBD1 : MOV A,R4
MOV B,#0AH
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#0AH
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV @R0,A
INC R0
DJNZ R7,PBD1
POP A
MOV R7,A
MOV A,R0
CLR C
SUBB A,R7
MOV R0,A
RET
;二進(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 A
MOV R7,#03H
CLR A
IBD221 : MOV @R0,A
INC R0
DJNZ R7,IBD221
POP A
MOV R0,A
MOV R7,#10H
IBD222 : PUSH A
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV B,#03H
IBD223 : MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
DJNZ B,IBD223
POP A
MOV R0,A
DJNZ R7,IBD222
RET
;二進(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 A
MOV R7,#04H
CLR A
IBD321 : MOV @R0,A
INC R0
DJNZ R7,IBD321
POP A
MOV R0,A
MOV R7,#18H
IBD322 : PUSH A
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV B,#04H
IBD323 : MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
DJNZ B,IBD323
POP A
MOV R0,A
DJNZ R7,IBD322
RET
;二進(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
;附:
;三字節(jié)無符號(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 A
MOV R2,B
MOV B,#10H
NDV311 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 : XCH A,R2
MOV R7,A
RET
(一) MCS-51定點(diǎn)運(yùn)算子程序庫及其使用說明
定點(diǎn)運(yùn)算子程序庫文件名為DQ51.ASM,為便于使用,先將有關(guān)約定說明如下:
1.多字節(jié)定點(diǎn)操作數(shù):用[R0]或[R1]來表示存放在由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ū)中存放無關(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 ;通過[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)制無符號(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)制無符號(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)制無符號(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)制無符號(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)制無符號(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)制無符號(hào)數(shù)開平方(快速)
入口條件:被開方數(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 ;被開方數(shù)為零,不必運(yùn)算
SH20: MOV R7,#0 ;左規(guī)次數(shù)初始化
MOV A,R2
SH22: ANL A,#0C0H ;被開方數(shù)高字節(jié)小于40H否?
JNZ SQRH ;不小于40H,左規(guī)格化完成,轉(zhuǎn)開方過程
CLR C ;每左規(guī)一次,被開方數(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)制無符號(hào)數(shù)開平方(快速)
入口條件:被開方數(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 ;被開方數(shù)為零,不必運(yùn)算
SH40: MOV R7,#0 ;左規(guī)次數(shù)初始化
MOV A,R2
SH41: ANL A,#0C0H ;被開方數(shù)高字節(jié)小于40H否?
JNZ SQRH ;不小于40H,左規(guī)格化完成
MOV R6,#2 ;每左規(guī)一次,被開方數(shù)左移兩位
SH42: CLR C ;被開方數(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
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42 ;被開方數(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 ;通過(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 ;取原被開方數(shù)的左規(guī)次數(shù)
JZ SQRE ;未左規(guī),開方結(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ù)的萬位數(shù)不超過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 ;取出萬分位
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)制無符號(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 ;不超過當(dāng)前最大值,保持當(dāng)前最大值
MOV R6,B ;超過當(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é)無符號(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é)無符號(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)制無符號(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)制無符號(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é)無符號(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)行過交換,則需繼續(xù)排序
SRT5: RET ;排序結(jié)束
END
(二) MCS-51 浮點(diǎn)運(yùn)算子程序庫及其使用說明
本浮點(diǎn)子程序庫有三個(gè)不同層次的版本,以便適應(yīng)不同的應(yīng)用場(chǎng)合:
1.小型庫(FQ51A.ASM):只包含浮點(diǎn)加、減、乘、除子程序。
2.中型庫(FQ51B.ASM):在小型庫的基礎(chǔ)上再增加絕對(duì)值、倒數(shù)、比較、平方、開平方、
數(shù)制轉(zhuǎn)換等子程序。
3.大型庫(FQ51.ASM):包含本說明書中的全部子程序。
為便于讀者使用本程序庫,先將有關(guān)約定說明如下:
1.雙字節(jié)定點(diǎn)操作數(shù):用[R0]或[R1]來表示存放在由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ù)(原碼)來表示。當(dāng)尾數(shù)的最高位為1時(shí),便稱為規(guī)格化浮點(diǎn)數(shù),簡(jiǎn)稱操作數(shù)。在
程序說明中,也用[R0]或[R1]來表示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ù)(原碼)來表示。當(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。在程序說明中,用[R0]或[R1]來表示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]來指向它,則應(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)于十萬分之三;單次二進(jìn)制浮點(diǎn)超越函數(shù)運(yùn)算的精度優(yōu)于萬分之一;BCD碼浮
點(diǎn)數(shù)本身的精度比較低(萬分之一到千分之一),不宜作為運(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ū)中存放無關(guān)的或非消耗性的信息,程序就具有較好的
透明性。
6.子程序調(diào)用范例:由于本程序庫特別注意了各子程序接口的相容性,很容易采用
積木方式(或流水線方式)完成一個(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開始的連續(xù)三個(gè)單元中。用BCD碼浮點(diǎn)數(shù)表示時(shí),分別為a=831234H;b=007577H;
c=025634H;d=011276H。
求解過程:通過調(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)開平方運(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ī)完成格式化
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)志來校正第二操作數(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ù)開平方(快速逼近算法)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時(shí),平方根仍在[R0]中,OV=1時(shí),負(fù)數(shù)開平方出錯(cuò)。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV ;負(fù)數(shù)開平方,出錯(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 ;指向被開方數(shù)尾數(shù)的高字節(jié)
JC SQR0 ;原被開方數(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 ;快速開方,參閱定點(diǎn)子程序說明
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 ;開方結(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原來的角色
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 ;通過相乘來換底
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ù)過大,冪溢出
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
SETB OV
RET
EXP0: MOV @R0,#41H;負(fù)指數(shù)過大,冪下溢,清零處理
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 ;通過多項(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]中
(25) 標(biāo)號(hào): FTOD 功能:格式化浮點(diǎn)數(shù)轉(zhuǎn)換成雙字節(jié)定點(diǎn)數(shù)
入口條件:格式化浮點(diǎn)操作數(shù)在[R0]中。
出口信息:OV=1時(shí)溢出,OV=0時(shí)轉(zhuǎn)換成功:定點(diǎn)數(shù)的絕對(duì)值在[R0]中(雙字節(jié)),數(shù)符
在位1FH中,F(xiàn)0=1 時(shí)為整數(shù),CY=1時(shí)為一字節(jié)整數(shù)一字節(jié)小數(shù),否則為純小數(shù)。
影響資源:PSW、A、B、R2、R3、R4、位1FH 堆棧需求: 6字節(jié)
FTOD: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)
MOV A,R2
JZ FTD4 ;階碼為零,純小數(shù)
JB ACC.7,FTD4;階碼為負(fù),純小數(shù)
SETB C
SUBB A,#10H
JC FTD1
SETB OV ;階碼大于16,溢出
RET
FTD1: SETB C
MOV A,R2
SUBB A,#8 ;階碼大于8否?
JC FTD3
FTD2: MOV B,#10H ;階碼大于8,按雙字節(jié)整數(shù)轉(zhuǎn)換
LCALL FTD8
SETB F0 ;設(shè)立雙字節(jié)整數(shù)標(biāo)志
CLR C
CLR OV
RET
FTD3: MOV B,#8 ;按一字節(jié)整數(shù)一字節(jié)小數(shù)轉(zhuǎn)換
LCALL FTD8
SETB C ;設(shè)立一字節(jié)整數(shù)一字節(jié)小數(shù)標(biāo)志
CLR F0
CLR OV
RET
FTD4: MOV B,#0 ;按純小數(shù)轉(zhuǎn)換
LCALL FTD8
CLR OV ;設(shè)立純小數(shù)標(biāo)志
CLR F0
CLR C
RET
FTD8: MOV A,R2 ;按規(guī)定的整數(shù)位數(shù)進(jìn)行右規(guī)
CJNE A,B,FTD9
MOV A,R3 ;將雙字節(jié)結(jié)果傳送到[R0]中
MOV @R0,A
INC R0
MOV A,R4
MOV @R0,A
DEC R0
RET
FTD9: CLR C
LCALL RR1 ;右規(guī)一次
SJMP FTD8
(26) 標(biāo)號(hào): BTOF 功能:浮點(diǎn)BCD碼轉(zhuǎn)換成格式化浮點(diǎn)數(shù)
入口條件:浮點(diǎn)BCD碼操作數(shù)在[R0]中。
出口信息:轉(zhuǎn)換成的格式化浮點(diǎn)數(shù)仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1DH~1FH 堆棧需求:6字節(jié)
BTOF: INC R0 ;判斷是否為零。
INC R0
MOV A,@R0
MOV R7,A
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
ORL A,R7
JNZ BTF0
MOV @R0,#41H;為零,轉(zhuǎn)換結(jié)束。
RET
BTF0: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存數(shù)符。
CLR 1FH ;以絕對(duì)值進(jìn)行轉(zhuǎn)換。
MOV C,ACC.6 ;擴(kuò)充階碼為八位。
MOV ACC.7,C
MOV @R0,A
JNC BTF1
ADD A,#19 ;是否小于1E-19?
JC BTF2
MOV @R0,#41H;小于1E-19時(shí)以0計(jì)。
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
DEC R0
DEC R0
RET
BTF1: SUBB A,#19
JC BTF2
MOV A,#3FH ;大于1E19時(shí)封頂。
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
RET
BTF2: CLR A ;準(zhǔn)備將BCD碼尾數(shù)轉(zhuǎn)換成十六進(jìn)制浮點(diǎn)數(shù)。
MOV R4,A
MOV R3,A
MOV R2,#10H ;至少兩個(gè)字節(jié)。
BTF3: MOV A,R7
ADD A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
JNB ACC.7,BTF3;直到尾數(shù)規(guī)格化。
MOV A,R6 ;四舍五入。
ADD A,#0B0H
CLR A
ADDC A,R4
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
JNC BTF4
MOV R3,#80H
INC R2
BTF4: MOV DPTR,#BTFL;準(zhǔn)備查表得到十進(jìn)制階碼對(duì)應(yīng)的浮點(diǎn)數(shù)。
MOV A,@R0
ADD A,#19 ;計(jì)算表格偏移量。
MOV B,#3
MUL AB
ADD A,DPL
MOV DPL,A
JNC BTF5
INC DPH
BTF5: CLR A ;查表。
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
LCALL MUL1 ;將階碼對(duì)應(yīng)的浮點(diǎn)數(shù)和尾數(shù)對(duì)應(yīng)的浮點(diǎn)數(shù)相乘。
MOV C,1DH ;取出數(shù)符。
MOV 1FH,C
LJMP MOV0 ;傳送轉(zhuǎn)換結(jié)果。
(27) 標(biāo)號(hào): FTOB 功能:格式化浮點(diǎn)數(shù)轉(zhuǎn)換成浮點(diǎn)BCD碼
入口條件:格式化浮點(diǎn)操作數(shù)在[R0]中。
出口信息:轉(zhuǎn)換成的浮點(diǎn)BCD碼仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1DH~1FH 堆棧需求:6字節(jié)
FTOB: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ FTB0
MOV @R0,#41H
RET
FTB0: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C
CLR ACC.7
MOV @R0,A
LCALL MVR0
MOV DPTR,#BFL0;絕對(duì)值大于或等于1時(shí)的查表起點(diǎn)。
MOV B,#0 ;十的0次冪。
MOV A,R2
JNB ACC.7,FTB1
MOV DPTR,#BTFL;絕對(duì)值小于1E-6時(shí)的查表起點(diǎn)。
MOV B,#0EDH ;十的-19次冪。
ADD A,#16
JNC FTB1
MOV DPTR,#BFLN;絕對(duì)值大于或等于1E-6時(shí)的查表起點(diǎn)。
MOV B,#0FAH ;十的-6次冪。
FTB1: CLR A ;查表,找到一個(gè)比待轉(zhuǎn)換浮點(diǎn)數(shù)大的整數(shù)冪。
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
MOV A,R5 ;和待轉(zhuǎn)換浮點(diǎn)數(shù)比較。
CLR C
SUBB A,R2
JB ACC.7,FTB2;差為負(fù)數(shù)。
JNZ FTB3
MOV A,R6
CLR C
SUBB A,R3
JC FTB2
JNZ FTB3
MOV A,R7
CLR C
SUBB A,R4
JC FTB2
JNZ FTB3
MOV R5,B ;正好是表格中的數(shù)。
INC R5 ;冪加一。
MOV R6,#10H ;尾數(shù)為0·1000。
MOV R7,#0
SJMP FTB6 ;傳送轉(zhuǎn)換結(jié)果。
FTB2: INC DPTR ;準(zhǔn)備表格下一項(xiàng)。
INC DPTR
INC DPTR
INC B ;冪加一。
SJMP FTB1 ;
FTB3: PUSH B ;保存冪值。
LCALL DIV3 ;相除,得到一個(gè)二進(jìn)制浮點(diǎn)數(shù)的純小數(shù)。
FTB4: MOV A,R2 ;取階碼。
JZ FTB5 ;為零嗎?
CLR C
LCALL RR1 ;右規(guī)。
SJMP FTB4
FTB5: POP ACC ;取出冪值。
MOV R5,A ;作為十進(jìn)制浮點(diǎn)數(shù)的階碼。
LCALL HB2 ;轉(zhuǎn)換尾數(shù)的十分位和百分位。
MOV R6,A
LCALL HB2 ;轉(zhuǎn)換尾數(shù)的千分位和萬分位。
MOV R7,A
MOV A,R3 ;四舍五入。
RLC A
CLR A
ADDC A,R7
DA A
MOV R7,A
CLR A
ADDC A,R6
DA A
MOV R6,A
JNC FTB6
MOV R6,#10H
INC R5
FTB6: INC R0 ;存放轉(zhuǎn)換結(jié)果。
INC R0
MOV A,R7
MOV @R0,A
DEC R0
MOV A,R6
MOV @R0,A
DEC R0
MOV A,R5
MOV C,1DH ;取出數(shù)符。
MOV ACC.7,C
MOV @R0,A
RET
HB2: MOV A,R4 ;尾數(shù)擴(kuò)大100倍。
MOV B,#100
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#100
MUL AB
ADD A,R3
MOV R3,A
JNC HB21
INC B
HB21: MOV A,B ;將整數(shù)部分轉(zhuǎn)換成BCD碼。
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
BTFL: DB 41H,0ECH,1EH ;1.0000E-19
DB 45H,93H,93H ;1.0000E-18
DB 48H,0B8H,78H ;1.0000E-17
DB 4BH,0E6H,96H ;1.0000E-16
DB 4FH,90H,1DH ;1.0000E-15
DB 52H,0B4H,25H ;1.0000E-14
DB 55H,0E1H,2EH ;1.0000E-13
DB 59H,8CH,0BDH ;1.0000E-12
DB 5CH,0AFH,0ECH ;1.0000E-11
DB 5FH,0DBH,0E7H ;1.0000E-10
DB 63H,89H,70H ;1.0000E-9
DB 66H,0ABH,0CCH ;1.0000E-8
DB 69H,0D6H,0C0H ;1.0000E-7
BFLN: DB 6DH,86H,38H ;1.0000E-6
DB 70H,0A7H,0C6H ;1.0000E-5
DB 73H,0D1H,0B7H ;1.0000E-4
DB 77H,83H,12H ;1.0000E-3
DB 7AH,0A3H,0D7H ;1.0000E-2
DB 7DH,0CCH,0CDH ;1.0000E-1
BFL0: DB 1,80H,00H ;1.0000
DB 4,0A0H,00H ;1.0000E1
DB 7,0C8H,00H ;1.0000E2
DB 0AH,0FAH,00H ;1.0000E3
DB 0EH,9CH,40H ;1.0000E4
DB 11H,0C3H,50H ;1.0000E5
DB 14H,0F4H,24H ;1.0000E6
DB 18H,98H,97H ;1.0000E7
DB 1BH,0BEH,0BCH ;1.0000E8
DB 1EH,0EEH,6BH ;1.0000E9
DB 22H,95H,03H ;1.0000E10
DB 25H,0BAH,44H ;1.0000E11
DB 28H,0E8H,0D5H ;1.0000E12
DB 2CH,91H,85H ;1.0000E13
DB 2FH,0B5H,0E6H ;1.0000E14
DB 32H,0E3H,60H ;1.0000E15
DB 36H,8EH,1CH ;1.0000E16
DB 39H,31H,0A3H ;1.0000E17
DB 3CH,0DEH,0BH ;1.0000E18
DB 40H,8AH,0C7H ;1.0000E19
(28) 標(biāo)號(hào): FCOS 功能:浮點(diǎn)余弦函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:結(jié)果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆棧需求: 6字節(jié)
FCOS: LCALL FABS ;COS(-X) = COS X
MOV R5,#1 ;常數(shù)1.5708(π/2)
MOV R6,#0C9H
MOV R7,#10H
CLR 1EH
LCALL MVR0
CLR F0
LCALL AS1 ;x+(π/2)
LCALL MOV0 ;保存結(jié)果,接著運(yùn)行下面的FSIN程序
(29) 標(biāo)號(hào): FSIN 功能:浮點(diǎn)正弦函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:結(jié)果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆棧需求: 6字節(jié)
FSIN: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存自變量的符號(hào)
CLR ACC.7 ;統(tǒng)一按正數(shù)計(jì)算
MOV @R0,A
LCALL MVR0 ;將[R0]傳送到第一工作區(qū)
MOV R5,#0 ;系數(shù)0.636627(2/π)
MOV R6,#0A2H
MOV R7,#0FAH
CLR 1EH
LCALL MUL1 ;相乘,自變量按(π/2)規(guī)一化
MOV A,R2 ;將結(jié)果復(fù)制到第二區(qū)
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
LCALL INT ;第一區(qū)取整,獲得象限信息
MOV A,R2
JZ SIN2
SIN1: CLR C ;將浮點(diǎn)象限數(shù)轉(zhuǎn)換成定點(diǎn)象限數(shù)
LCALL RR1
CJNE R2,#10H,SIN1
MOV A,R4
JNB ACC.1,SIN2
CPL 1DH ;對(duì)于第三、四象限,結(jié)果取反
SIN2: JB ACC.0,SIN3
CPL 1FH ;對(duì)于第一、三象限,直接求規(guī)一化的小數(shù)
SJMP SIN4
SIN3: MOV A,R4 ;對(duì)于第二、四象限,準(zhǔn)備求其補(bǔ)數(shù)
INC A
MOV R4,A
JNZ SIN4
INC R3
SIN4: LCALL RLN ;規(guī)格化
SETB F0
LCALL AS1 ;求自變量歸一化等效值
LCALL MOV0 ;回傳
LCALL FPLN ;用多項(xiàng)式計(jì)算正弦值
DB 7DH,93H,28H;0.07185
DB 41H,0,0 ;0
DB 80H,0A4H,64H;-0.64215
DB 41H,0,0 ;0
DB 1,0C9H,2;1.5704
DB 41H,0,0 ;0
DB 40H ;結(jié)束
MOV A,@R0 ;結(jié)果的絕對(duì)值超過1.00嗎?
JZ SIN5
JB ACC.6,SIN5
INC R0 ;絕對(duì)值按1.00封頂
MOV @R0,#80H
INC R0
MOV @R0,#0
DEC R0
DEC R0
MOV A,#1
SIN5: MOV C,1DH ;將數(shù)符拼入結(jié)果中
MOV ACC.7,C
MOV @R0,A
RET
(30) 標(biāo)號(hào): FATN 功能:浮點(diǎn)反正切函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:結(jié)果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1CH~1FH 堆棧需求:7字節(jié)
FATN: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存自變量數(shù)符
CLR ACC.7 ;自變量取絕對(duì)值
MOV @R0,A
CLR 1CH ;清求余運(yùn)算標(biāo)志
JB ACC.6,ATN1;自變量為純小數(shù)否?
JZ ATN1
SETB 1CH ;置位求余運(yùn)算標(biāo)志
LCALL FRCP ;通過倒數(shù)運(yùn)算,轉(zhuǎn)換成純小數(shù)
ATN1: LCALL FPLN ;通過多項(xiàng)式運(yùn)算,計(jì)算反正切函數(shù)值
DB 0FCH,0E4H,91H;-0.055802
DB 7FH,8FH,37H;0.27922
DB 0FFH,0EDH,0E0H;-0.46460
DB 7BH,0E8H,77H;0.028377
DB 0,0FFH,68H;0.9977
DB 72H,85H,0ECH;3.1930×10-5
DB 40H ;結(jié)束
JNB 1CH,ATN2;需要求余運(yùn)算否?
CPL 1FH ;準(zhǔn)備運(yùn)算標(biāo)志
MOV C,1FH
MOV F0,C ;常數(shù)1.5708(π/2)
MOV R5,#1
MOV R6,#0C9H
MOV R7,#10H
LCALL AS1 ;求余運(yùn)算
LCALL MOV0 ;回傳
ATN2: MOV A,@R0 ;拼入結(jié)果的數(shù)符
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
RET
(31) 標(biāo)號(hào): RTOD 功能:浮點(diǎn)弧度數(shù)轉(zhuǎn)換成浮點(diǎn)度數(shù)
入口條件:浮點(diǎn)弧度數(shù)在[R0]中。
出口信息:轉(zhuǎn)換成的浮點(diǎn)度數(shù)仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
RTOD: MOV R5,#6 ;系數(shù)(180/π)傳送到第二工作區(qū)
MOV R6,#0E5H
MOV R7,#2FH
SJMP DR ;通過乘法進(jìn)行轉(zhuǎn)換
(32) 標(biāo)號(hào): DTOR 功能:浮點(diǎn)度數(shù)轉(zhuǎn)換成浮點(diǎn)弧度數(shù)
入口條件:浮點(diǎn)度數(shù)在[R0]中。
出口信息:轉(zhuǎn)換成的浮點(diǎn)弧度數(shù)仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
DTOR: MOV R5,#0FBH;系數(shù)(π/180)傳送到第二工作區(qū)
MOV R6,#8EH
MOV R7,#0FAH
DR: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)
CLR 1EH ;系數(shù)為正
LCALL MUL1 ;通過乘法進(jìn)行轉(zhuǎn)換
LJMP MOV0 ;結(jié)果傳送到[R0]中
END

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:158375 發(fā)表于 2018-1-25 08:16 | 只看該作者
匯編語言
遙遠(yuǎn)的回憶。
回復(fù)

使用道具 舉報(bào)

板凳
ID:126422 發(fā)表于 2018-5-27 21:41 | 只看該作者
匯編計(jì)算經(jīng)典,可以直接引用。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表