久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

MCS-51單片機實用匯編語言子程序庫

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:270854 發(fā)表于 2018-1-24 17:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
;片內(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é)個單元)
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ù)復制程序
;入口: 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ù)復制程序
;入口: 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ù)復制程序
;入口: 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ù)復制到內(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點算術平均濾波
;入口: 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點加權(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é)取補程序 /(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é)取補程序 /([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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號數(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é)無符號除法程序 (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é)無符號除法程序 (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é)無符號除法程序 (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é)無符號除法程序(組合) ([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é)無符號除法程序(集成) ([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
;原碼有符號雙字節(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
;原碼有符號雙字節(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
;原碼有符號雙字節(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
;原碼有符號雙字節(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
;浮點數(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
;浮點數(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ù)個數(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ù)個數(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浮點數(shù)排序程序(升序)
;入口: ADDPH,ADDPL(起始地址),N(數(shù)據(jù)個數(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)換為二進制小數(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)換為二進制小數(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)換為二進制整數(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)換為二進制整數(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)換為二進制整數(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)換為二進制整數(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
;二進制小數(shù)(2位)轉(zhuǎ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
;二進制小數(shù)(M位)轉(zhuǎ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
;二進制整數(shù)(2位)轉(zhuǎ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
;二進制整數(shù)(2位)轉(zhuǎ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
;二進制整數(shù)(3位)轉(zhuǎ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
;二進制整數(shù)(3位)轉(zhuǎ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
;二進制整數(shù)(M位)轉(zhuǎ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é)無符號除法程序(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定點運算子程序庫及其使用說明
定點運算子程序庫文件名為DQ51.ASM,為便于使用,先將有關約定說明如下:
1.多字節(jié)定點操作數(shù):用[R0]或[R1]來表示存放在由R0或R1指示的連續(xù)單元中的數(shù)
據(jù)。地址小的單元存放數(shù)據(jù)的高字節(jié)。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,
(31H)=34H,(32H)=56H。
2.運算精度:單次定點運算精度為結(jié)果最低位的當量值。
3.工作區(qū):數(shù)據(jù)工作區(qū)固定在PSW、A、B、R2~R7,用戶只要不在工作區(qū)中存放無關的或非消耗性的信息,程序就具有較好的透明性。
(1) 標號: BCDA 功能:多字節(jié)BCD碼加法
入口條件:字節(jié)數(shù)在R7中,被加數(shù)在[R0]中,加數(shù)在[R1]中。
出口信息:和在[R0]中,最高位進位在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 ;十進制調(diào)整
MOV @R0,A ;和存回[R0]中
DJNZ R2,BCD1 ;處理完所有字節(jié)
RET
(2) 標號: BCDB 功能:多字節(jié)BCD碼減法
入口條件:字節(jié)數(shù)在R7中,被減數(shù)在[R0]中,減數(shù)在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影響資源:PSW、A、R2、R3 堆棧需求: 6字節(jié)
BCDB: LCALL NEG1 ;減數(shù)[R1]十進制取補
LCALL BCDA ;按多字節(jié)BCD碼加法處理
CPL C ;將補碼加法的進位標志轉(zhuǎn)換成借位標志
MOV F0,C ;保護借位標志
LCALL NEG1 ;恢復減數(shù)[R1]的原始值
MOV C,F0 ;恢復借位標志
RET
NEG1: MOV A,R0 ;[R1]十進制取補子程序入口
XCH A,R1 ;交換指針
XCH A,R0
LCALL NEG ;通過[R0]實現(xiàn)[R1]取補
MOV A,R0
XCH A,R1 ;換回指針
XCH A,R0
RET
(3) 標號: NEG 功能:多字節(jié)BCD碼取補
入口條件:字節(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 ;保護指針
MOV R3,A
NEG0: CLR C
MOV A,#99H
SUBB A,@R0 ;按字節(jié)十進制取補
MOV @R0,A ;存回[R0]中
INC R0 ;調(diào)整數(shù)據(jù)指針
DJNZ R2,NEG0 ;處理完(R2)字節(jié)
MOV A,#9AH ;最低字節(jié)單獨取補
SUBB A,@R0
MOV @R0,A
MOV A,R3 ;恢復指針
MOV R0,A
RET
(4) 標號: BRLN 功能:多字節(jié)BCD碼左移十進制一位(乘十)
入口條件:字節(jié)數(shù)在R7中,操作數(shù)在[R0]中。
出口信息:結(jié)果仍在[R0]中,移出的十進制最高位在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 ;交換十進制高低位
MOV @R0,A ;存回
MOV A,R3 ;取低字節(jié)移出的十進制高位
XCHD A,@R0 ;換出本字節(jié)的十進制高位
MOV R3,A ;保存本字節(jié)的十進制高位
DJNZ R2,BRL1 ;處理完所有字節(jié)
RET
(5) 標號: MULD 功能:雙字節(jié)二進制無符號數(shù)乘法
入口條件:被乘數(shù)在R2、R3中,乘數(shù)在R6、R7中。
出口信息:乘積在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
MULD: MOV A,R3 ;計算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R3 ;計算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;計算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;計算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分積
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
(6) 標號: MUL2 功能:雙字節(jié)二進制無符號數(shù)平方
入口條件:待平方數(shù)在R2、R3中。
出口信息:結(jié)果在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R5 堆棧需求: 2字節(jié)
MUL2: MOV A,R3 ;計算R3平方
MOV B,A
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R2 ;計算R2平方
MOV B,A
MUL AB
XCH A,R3 ;暫存部分積,并換出R2和R3
XCH A,B
XCH A,R2
MUL AB ;計算2×R2×R3
CLR C
RLC A
XCH A,B
RLC A
JNC MU20
INC R2 ;累加溢出量
MU20: XCH A,B ;累加部分積
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
RET
(7) 標號: DIVD 功能:雙字節(jié)二進制無符號數(shù)除法
入口條件:被除數(shù)在R2、R3、R4、R5中,除數(shù)在R6、R7中。
出口信息:OV=0 時,雙字節(jié)商在R2、R3中,OV=1 時溢出。
影響資源: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 ;計算雙字節(jié)商
DVD2: 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
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結(jié)果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數(shù)
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
(8) 標號: D457 功能:雙字節(jié)二進制無符號數(shù)除以單字節(jié)二進制數(shù)
入口條件:被除數(shù)在R4、R5中,除數(shù)在R7中。
出口信息:OV=0 時,單字節(jié)商在R3中,OV=1 時溢出。
影響資源: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) 標號: DV31 功能:三字節(jié)二進制無符號數(shù)除以單字節(jié)二進制數(shù)
入口條件:被除數(shù)在R3、R4、R5中,除數(shù)在R7中。
出口信息:OV=0 時,雙字節(jié)商在R4、R5中,OV=1 時溢出。
影響資源: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) 標號: MULS 功能:雙字節(jié)二進制有符號數(shù)乘法(補碼)
入口條件:被乘數(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 ;計算結(jié)果的符號和兩個操作數(shù)的絕對值
LCALL MULD ;計算兩個絕對值的乘積
SJMP MDSE ;用補碼表示結(jié)果
(11) 標號: DIVS 功能:雙字節(jié)二進制有符號數(shù)除法(補碼)
入口條件:被除數(shù)在R2、R3、R4、R5中,除數(shù)在R6、R7中。
出口信息:OV=0時商在R2、R3中,OV=1時溢出。
影響資源:PSW、A、B、R1~R7 堆棧需求: 5字節(jié)
DIVS: LCALL MDS ;計算結(jié)果的符號和兩個操作數(shù)的絕對值
PUSH PSW ;保存結(jié)果的符號
LCALL DIVD ;計算兩個絕對值的商
JNB OV,DVS1 ;溢出否?
POP ACC ;溢出,放去結(jié)果的符號,保留溢出標志
RET
DVS1: POP PSW ;未溢出,取出結(jié)果的符號
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用補碼表示結(jié)果
CLR OV ;結(jié)果為正,原碼即補碼,計算成功
RET
MDS: CLR F0 ;結(jié)果符號初始化
MOV A,R6 ;判斷第二操作數(shù)的符號
JNB ACC.7,MDS1;為正,不必處理
CPL F0 ;為負,結(jié)果符號取反
XCH A,R7 ;第二操作數(shù)取補,得到其絕對值
CPL A
ADD A,#1
XCH A,R7
CPL A
ADDC A,#0
MOV R6,A
MDS1: MOV A,R2 ;判斷第一操作數(shù)或運算結(jié)果的符號
JNB ACC.7,MDS3;為正,不必處理
CPL F0 ;為負,結(jié)果符號取反
MDS2: MOV A,R5 ;求第一操作數(shù)的絕對值或運算結(jié)果的補碼
CPL A
ADD A,#1
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
MOV A,R3
CPL A
ADDC A,#0
MOV R3,A
MOV A,R2
CPL A
ADDC A,#0
MOV R2,A
MDS3: CLR OV ;運算成功
RET
(12) 標號: SH2 功能:雙字節(jié)二進制無符號數(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ù)為零,不必運算
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) 標號: SH4 功能:四字節(jié)二進制無符號數(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ù)為零,不必運算
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é)按折線法分為三個區(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ū)間基點的偏移量乘區(qū)間斜率
MOV A,B
ADD A,R4 ;累加到平方根的基數(shù)上
MOV R4,A
MOV B,A
MUL AB ;求當前平方根的冪
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用減奇數(shù)法校正一個字節(jié)的平方根
MOV A,R4 ;當前平方根的兩倍加一存入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é)束,已達到一個字節(jié)的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;繼續(xù)校正
SQR5: MOV A,R4 ;將一個字節(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é)計算完,在R3中
MOV A,R7 ;取原被開方數(shù)的左規(guī)次數(shù)
JZ SQRE ;未左規(guī),開方結(jié)束
SQR9: CLR C ;按左規(guī)次數(shù)右移平方根,得到實際根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
(14) 標號: HASC 功能:單字節(jié)十六進制數(shù)轉(zhuǎn)換成雙字節(jié)ASCII碼
入口條件:待轉(zhuǎn)換的單字節(jié)十六進制數(shù)在累加器A中。
出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。
影響資源:PSW、A、B 堆棧需求: 4字節(jié)
HASC: MOV B,A ;暫存待轉(zhuǎn)換的單字節(jié)十六進制數(shù)
LCALL HAS1 ;轉(zhuǎn)換低四位
XCH A,B ;存放低四位的ASCII碼
SWAP A ;準備轉(zhuǎn)換高四位
HAS1: ANL A,#0FH ;將累加器的低四位轉(zhuǎn)換成ASCII碼
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
(15) 標號: ASCH 功能:ASCII碼轉(zhuǎn)換成十六進制數(shù)
入口條件:待轉(zhuǎn)換的ASCII碼(30H~39H或41H~46H)在A中。
出口信息:轉(zhuǎ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) 標號:HBCD 功能:單字節(jié)十六進制整數(shù)轉(zhuǎn)換成單字節(jié)BCD碼整數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)十六進制整數(shù)在累加器A中。
出口信息:轉(zhuǎn)換后的BCD碼整數(shù)(十位和個位)仍在累加器A中,百位在R3中。
影響資源:PSW、A、B、R3 堆棧需求: 2字節(jié)
HBCD: MOV B,#100 ;分離出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余數(shù)繼續(xù)分離十位和個位
XCH A,B
DIV AB
SWAP A
ORL A,B ;將十位和個位拼裝成BCD碼
RET
(17) 標號: HB2 功能:雙字節(jié)十六進制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)十六進制整數(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é)十六進制整數(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碼帶進位自身相加,相當于乘2
ADDC A,R5
DA A ;十進制調(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é)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整
DJNZ R2,HB3 ;處理完16bit
RET
(18) 標號: HBD 功能:單字節(jié)十六進制小數(shù)轉(zhuǎn)換成單字節(jié)BCD碼小數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)十六進制小數(shù)在累加器A中。
出口信息:CY=0時轉(zhuǎn)換后的BCD碼小數(shù)仍在A中。CY=1時原小數(shù)接近整數(shù)1。
影響資源:PSW、A、B 堆棧需求: 2字節(jié)
HBD: MOV B,#100 ;原小數(shù)擴大一百倍
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)整后若有進位,原小數(shù)接近整數(shù)1
RET
(19) 標號: HBD2 功能:雙字節(jié)十六進制小數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼小數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)十六進制小數(shù)在R2、R3中。
出口信息:轉(zhuǎn)換后的雙字節(jié)BCD碼小數(shù)仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求: 6字節(jié)
HBD2: MOV R4,#4 ;四位十進制碼
HBD3: MOV A,R3 ;原小數(shù)擴大十倍
MOV B,#10
MUL AB
MOV R3,A
MOV R5,B
MOV A,R2
MOV B,#10
MUL AB
ADD A,R5
MOV R2,A
CLR A
ADDC A,B
PUSH ACC ;保存溢出的一位十進制碼
DJNZ R4,HBD3 ;計算完四位十進制碼
POP ACC ;取出萬分位
MOV R3,A
POP ACC ;取出千分位
SWAP A
ORL A,R3 ;拼裝成低字節(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)標號:BCDH 功能:單字節(jié)BCD碼整數(shù)轉(zhuǎn)換成單字節(jié)十六進制整數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼整數(shù)在累加器A中。
出口信息:轉(zhuǎn)換后的單字節(jié)十六進制整數(shù)仍在累加器A中。
影響資源:PSW、A、B、R4 堆棧需求: 2字節(jié)
BCDH: MOV B,#10H ;分離十位和個位
DIV AB
MOV R4,B ;暫存?zhèn)位
MOV B,#10 ;將十位轉(zhuǎn)換成十六進制
MUL AB
ADD A,R4 ;按十六進制加上個位
RET
(21)標號: BH2 功能:雙字節(jié)BCD碼整數(shù)轉(zhuǎn)換成雙字節(jié)十六進制整數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼整數(shù)在R2、R3中。
出口信息:轉(zhuǎn)換后的雙字節(jié)十六進制整數(shù)仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節(jié)
BH2: MOV A,R3 ;將低字節(jié)轉(zhuǎn)換成十六進制
LCALL BCDH
MOV R3,A
MOV A,R2 ;將高字節(jié)轉(zhuǎn)換成十六進制
LCALL BCDH
MOV B,#100 ;擴大一百倍
MUL AB
ADD A,R3 ;和低字節(jié)按十六進制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
(22)標號: BHD 功能:單字節(jié)BCD碼小數(shù)轉(zhuǎn)換成單字節(jié)十六進制小數(shù)
入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼數(shù)在累加器A中。
出口信息:轉(zhuǎn)換后的單字節(jié)十六進制小數(shù)仍在累加器A中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節(jié)
BHD: MOV R2,#8 ;準備計算一個字節(jié)小數(shù)
BHD0: ADD A,ACC ;按十進制倍增
DA A
XCH A,R3
RLC A ;將進位標志移入結(jié)果中
XCH A,R3
DJNZ R2,BHD0 ;共計算8bit小數(shù)
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD1 ;四舍
INC R3 ;五入
BHD1: MOV A,R3 ;取結(jié)果
RET
(23)標號: BHD2 功能:雙字節(jié)BCD碼小數(shù)轉(zhuǎn)換成雙字節(jié)十六進制小數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼小數(shù)在R4、R5中。
出口信息:轉(zhuǎn)換后的雙字節(jié)十六進制小數(shù)在R2、R3中。*
影響資源:PSW、A、R2~R6 堆棧需求: 2字節(jié)
BHD2: MOV R6,#10H ;準備計算兩個字節(jié)小數(shù)
BHD3: MOV A,R5 ;按十進制倍增
ADD A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3 ;將進位標志移入結(jié)果中
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,BHD3 ;共計算16bit小數(shù)
MOV A,R4
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD4 ;四舍
INC R3 ;五入
MOV A,R3
JNZ BHD4
INC R2
BHD4: RET
(24) 標號: MM 功能:求單字節(jié)十六進制無符號數(shù)據(jù)塊的極值
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個數(shù)在R7中。
出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節(jié)
MM: MOV B,R7 ;保存數(shù)據(jù)個數(shù)
MOVX A,@DPTR ;讀取第一個數(shù)據(jù)
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數(shù)據(jù)的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數(shù)據(jù)個數(shù)
DEC A ;減一,得到需要比較的次數(shù)
JZ MME ;只有一個數(shù)據(jù),不需要比較
MOV R1,A ;保存比較次數(shù)
PUSH DPL ;保護數(shù)據(jù)塊的首址
PUSH DPH
MM1: INC DPTR ;指向一個新的數(shù)據(jù)
MOVX A,@DPTR ;讀取這個數(shù)據(jù)
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JC MM2 ;不超過當前最大值,保持當前最大值
MOV R6,B ;超過當前最大值,更新最大值存放地址
MOV R2,DPH ;同時更新最大值存放地址
MOV R3,DPL
SJMP MM3
MM2: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNC MM3 ;大于或等于當前最小值,保持當前最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MM3: DJNZ R1,MM1 ;處理完全部數(shù)據(jù)
POP DPH ;恢復數(shù)據(jù)首址
POP DPL
MME: RET
(25) 標號: MMS 功能:求單字節(jié)十六進制有符號數(shù)據(jù)塊的極值
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個數(shù)在R7中。
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節(jié)
MMS: MOV B,R7 ;保存數(shù)據(jù)個數(shù)
MOVX A,@DPTR ;讀取第一個數(shù)據(jù)
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個數(shù)據(jù)的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數(shù)據(jù)個數(shù)
DEC A ;減一,得到需要比較的次數(shù)
JZ MMSE ;只有一個數(shù)據(jù),不需要比較
MOV R1,A ;保存比較次數(shù)
PUSH DPL ;保護數(shù)據(jù)塊的首址
PUSH DPH
MMS1: INC DPTR ;調(diào)整數(shù)據(jù)指針
MOVX A,@DPTR ;讀取一個數(shù)據(jù)
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JZ MMS4 ;相同,不更新最大值
JNB OV,MMS2 ;差未溢出,符號位有效
CPL ACC.7 ;差溢出,符號位取反
MMS2: JB ACC.7,MMS4;差為負,不更新最大值
MOV R6,B ;更新最大值
MOV R2,DPH ;更新最大值存放地址
MOV R3,DPL
SJMP MMS7
MMS4: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNB OV,MMS6 ;差未溢出,符號位有效
CPL ACC.7 ;差溢出,符號位取反
MMS6: JNB ACC.7,MMS7;差為正,不更新最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MMS7: DJNZ R1,MMS1 ;處理完全部數(shù)據(jù)
POP DPH ;恢復數(shù)據(jù)首址
POP DPL
MMSE: RET
(26) 標號: FDS1 功能:順序查找(ROM)單字節(jié)表格
入口條件:待查找的內(nèi)容在A中,表格首址在DPTR中,表格的字節(jié)數(shù)在R7中。
出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。
影響資源:PSW、A、B、R2、R6 堆棧需求: 2字節(jié)
FDS1: MOV B,A ;保存待查找的內(nèi)容
MOV R2,#0 ;順序號初始化(指向表首)
MOV A,R7 ;保存表格的長度
MOV R6,A
FD11: MOV A,R2 ;按順序號讀取表格內(nèi)容
MOVC A,@A+DPTR
CJNE A,B,FD12;與待查找的內(nèi)容比較
CLR OV ;相同,查找成功
MOV A,R2 ;取對應的順序號
RET
FD12: INC R2 ;指向表格中的下一個內(nèi)容
DJNZ R6,FD11 ;查完全部表格內(nèi)容
SETB OV ;未查找到,失敗
RET
(27) 標號: FDS2 功能:順序查找(ROM)雙字節(jié)表格
入口條件:查找內(nèi)容在R4、R5中,表格首址在DPTR中,數(shù)據(jù)總個數(shù)在R7中。
出口信息:OV=0時順序號在累加器A中,地址在DPTR中;OV=1時未找到。
影響資源:PSW、A、R2、R6、DPTR 堆棧需求: 2字節(jié)
FDS2: MOV A,R7 ;保存表格中數(shù)據(jù)的個數(shù)
MOV R6,A
MOV R2,#0 ;順序號初始化(指向表首)
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 ;取對應的順序號
RET
FD22: INC DPTR ;指向下一個數(shù)據(jù)
INC DPTR
INC R2 ;順序號加一
DJNZ R6,FD21 ;查完全部數(shù)據(jù)
SETB OV ;未查找到,失敗
RET
(28) 標號:FDD1 功能:對分查找(ROM)單字節(jié)無符號增序數(shù)據(jù)表格
入口條件:待查找的內(nèi)容在累加器A中,表格首址在DPTR中,字節(jié)數(shù)在R7中。
出口信息:OV=0 時,順序號在累加器A中;OV=1 時,未找到。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 2字節(jié)
FDD1: MOV B,A ;保存待查找的內(nèi)容
MOV R2,#0 ;區(qū)間低端指針初始化(指向第一個數(shù)據(jù))
MOV A,R7
DEC A
MOV R3,A ;區(qū)間高端指針初始化(指向最后一個數(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;讀取該點的內(nèi)容
CJNE A,B,FD65;與待查找的內(nèi)容比較
CLR OV ;相同,查找成功
MOV A,R4 ;取順序號
RET
FD65: JC FD68 ;該點的內(nèi)容比待查找的內(nèi)容大否?
MOV A,R4 ;偏大,取該點位置
DEC A ;減一
MOV R3,A ;作為新的區(qū)間高端
SJMP FD61 ;繼續(xù)查找
FD68: MOV A,R4 ;偏小,取該點位置
INC A ;加一
MOV R2,A ;作為新的區(qū)間低端
SJMP FD61 ;繼續(xù)查找
FD69: SETB OV ;查找失敗
RET
(29) 標號:FDD2 功能:對分查找(ROM)雙字節(jié)無符號增序數(shù)據(jù)表格
入口條件:查找內(nèi)容在R4、R5中,表格首址在DPTR中,數(shù)據(jù)個數(shù)在R7中。
出口信息:OV=0 時順序號在累加器A中,址在DPTR中;OV=1 時未找到。
影響資源:PSW、A、B、R1~R7、DPTR 堆棧需求: 2字節(jié)
FDD2: MOV R2,#0 ;區(qū)間低端指針初始化(指向第一個數(shù)據(jù))
MOV A,R7
DEC A
MOV R3,A ;區(qū)間高端指針初始化,指向最后一個數(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 ;計算區(qū)間中心的地址
RLC A
JNC FD82
INC DPH
FD82: ADD A,R7
MOV DPL,A
JNC FD83
INC DPH
FD83: CLR A ;讀取該點的內(nèi)容的高字節(jié)
MOVC A,@A+DPTR
MOV B,R4 ;與待查找內(nèi)容的高字節(jié)比較
CJNE A,B,FD84;不相同
MOV A,#1 ;讀取該點的內(nèi)容的低字節(jié)
MOVC A,@A+DPTR
MOV B,R5
CJNE A,B,FD84;與待查找內(nèi)容的低字節(jié)比較
MOV A,R1 ;取順序號
CLR OV ;查找成功
RET
FD84: JC FD86 ;該點的內(nèi)容比待查找的內(nèi)容大否?
MOV A,R1 ;偏大,取該點位置
DEC A ;減一
MOV R3,A ;作為新的區(qū)間高端
SJMP FD81 ;繼續(xù)查找
FD86: MOV A,R1 ;偏小,取該點位置
INC A ;加一
MOV R2,A ;作為新的區(qū)間低端
SJMP FD81 ;繼續(xù)查找
FD89: MOV DPH,R6 ;相同,恢復首址
MOV DPL,R7
SETB OV ;查找失敗
RET
(30) 標號: DDM1 功能:求單字節(jié)十六進制無符號數(shù)據(jù)塊的平均值
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個數(shù)在R7中。
出口信息:平均值在累加器A中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節(jié)
DDM1: MOV A,R7 ;保存數(shù)據(jù)個數(shù)
MOV R2,A
PUSH DPH
PUSH DPL
CLR A ;初始化累加和
MOV R4,A
MOV R5,A
DM11: MOVX A,@DPTR ;讀取一個數(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) 標號: DDM2 功能:求雙字節(jié)十六進制無符號數(shù)據(jù)塊的平均值
入口條件:數(shù)據(jù)塊的首址在DPTR中,雙字節(jié)數(shù)據(jù)總個數(shù)在R7中。
出口信息:平均值在R4、R5中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節(jié)
DDM2: MOV A,R7 ;保存數(shù)據(jù)個數(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 ;讀取一個數(shù)據(jù)的高字節(jié)
MOV B,A
INC DPTR
MOVX A,@DPTR ;讀取一個數(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 ;恢復首址
POP DPL
LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值
(32) 標號: XR1 功能:求單字節(jié)數(shù)據(jù)塊的(異或)校驗和
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)的個數(shù)在R6、R7中。
出口信息:校驗和在累加器A中。
影響資源:PSW、A、B、R4~R7 堆棧需求: 2字節(jié)
XR1: MOV R4,DPH ;保存數(shù)據(jù)塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節(jié)計數(shù)器調(diào)整
JZ XR10
INC R6
XR10: MOV B,#0 ;校驗和初始化
XR11: MOVX A,@DPTR ;讀取一個數(shù)據(jù)
XRL B,A ;異或運算
INC DPTR ;指向下一個數(shù)據(jù)
DJNZ R7,XR11 ;雙字節(jié)計數(shù)器減一
DJNZ R6,XR11
MOV DPH,R4 ;恢復數(shù)據(jù)首址
MOV DPL,R5
MOV A,B ;取校驗和
RET
(33) 標號: XR2 功能:求雙字節(jié)數(shù)據(jù)塊的(異或)校驗和
入口條件:數(shù)據(jù)塊的首址在DPTR中,雙字節(jié)數(shù)據(jù)總個數(shù)在R6、R7中。
出口信息:校驗和在R2、R3中。
影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié)
XR2: MOV R4,DPH ;保存數(shù)據(jù)塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節(jié)計數(shù)器調(diào)整
JZ XR20
INC R6
XR20: CLR A ;校驗和初始化
MOV R2,A
MOV R3,A
XR21: MOVX A,@DPTR ;讀取一個數(shù)據(jù)的高字節(jié)
XRL A,R2 ;異或運算
MOV R2,A
INC DPTR
MOVX A,@DPTR ;讀取一個數(shù)據(jù)的低字節(jié)
XRL A,R3 ;異或運算
MOV R3,A
INC DPTR ;指向下一個數(shù)據(jù)
DJNZ R7,XR21 ;雙字節(jié)計數(shù)器減一
DJNZ R6,XR21
MOV DPH,R4 ;恢復數(shù)據(jù)首址
MOV DPL,R5
RET
(34) 標號: SORT 功能:單字節(jié)無符號數(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 ;交換標志初始化
MOV A,R5 ;取上遍比較次數(shù)
DEC A ;本遍比上遍減少一次
MOV R5,A ;保存本遍次數(shù)
MOV R2,A ;復制到計數(shù)器中
JZ SRT5 ;若為零,排序結(jié)束
MOV A,R0 ;保存數(shù)據(jù)指針
MOV R6,A
SRT2: MOV A,@R0 ;讀取一個數(shù)據(jù)
MOV R3,A
INC R0 ;指向下一個數(shù)據(jù)
MOV A,@R0 ;再讀取一個數(shù)據(jù)
MOV R4,A
CLR C
SUBB A,R3 ;比較兩個數(shù)據(jù)的大小
JNC SRT4 ;順序正確(增序或相同),不必交換
SETB F0 ;設立交換標志
MOV A,R3 ;將兩個數(shù)據(jù)交換位置
MOV @R0,A
DEC R0
MOV A,R4
MOV @R0,A
INC R0 ;指向下一個數(shù)據(jù)
SRT4: DJNZ R2,SRT2 ;完成本遍的比較次數(shù)
MOV A,R6 ;恢復數(shù)據(jù)首址
MOV R0,A
JB F0,SRT1 ;本遍若進行過交換,則需繼續(xù)排序
SRT5: RET ;排序結(jié)束
END
(二) MCS-51 浮點運算子程序庫及其使用說明
本浮點子程序庫有三個不同層次的版本,以便適應不同的應用場合:
1.小型庫(FQ51A.ASM):只包含浮點加、減、乘、除子程序。
2.中型庫(FQ51B.ASM):在小型庫的基礎上再增加絕對值、倒數(shù)、比較、平方、開平方、
數(shù)制轉(zhuǎn)換等子程序。
3.大型庫(FQ51.ASM):包含本說明書中的全部子程序。
為便于讀者使用本程序庫,先將有關約定說明如下:
1.雙字節(jié)定點操作數(shù):用[R0]或[R1]來表示存放在由R0或R1指示的連續(xù)單元中的數(shù)
據(jù),地址小的單元存放高字節(jié)。如果[R0]=1234H,若(R0)=30H,則(30H)=12H,(31H)=34H。
2.二進制浮點操作數(shù):用三個字節(jié)表示,第一個字節(jié)的最高位為數(shù)符,其余七位為
階碼(補碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用雙字節(jié)
純小數(shù)(原碼)來表示。當尾數(shù)的最高位為1時,便稱為規(guī)格化浮點數(shù),簡稱操作數(shù)。在
程序說明中,也用[R0]或[R1]來表示R0或R1指示的浮點操作數(shù),例如:當[R0]=-6.000時,
則二進制浮點數(shù)表示為83C000H。若(R0)=30H,則(30H)=83H,(31H)=0C0H,(32H)=00H。
3.十進制浮點操作數(shù):用三個字節(jié)表示,第一個字節(jié)的最高位為數(shù)符,其余七位為
階碼(二進制補碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用
雙字節(jié)BCD碼純小數(shù)(原碼)來表示。當十進制數(shù)的絕對值大于1時,階碼就等于整數(shù)
部分的位數(shù),如 876.5 的階碼是03H,-876.5 的階碼是 83H;當十進制數(shù)的絕對值小于1
時,階碼就等于 80H 減去小數(shù)點后面零的個數(shù),例如 0.00382 的階碼是 7EH,-0.00382
的階碼是 0FEH。在程序說明中,用[R0]或[R1]來表示R0或R1指示的十進制浮點操作數(shù)。例
如有一個十進制浮點操作數(shù)存放在30H、31H、32H中,數(shù)值是 -0.07315,即-0.7315乘以10
的-1次方,則(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]來指向它,則應使(R0)=30H。
4.運算精度:單次定點運算精度為結(jié)果最低位的當量值;單次二進制浮點算術運算
的精度優(yōu)于十萬分之三;單次二進制浮點超越函數(shù)運算的精度優(yōu)于萬分之一;BCD碼浮
點數(shù)本身的精度比較低(萬分之一到千分之一),不宜作為運算的操作數(shù),僅用于輸入或
輸出時的數(shù)制轉(zhuǎn)換。不管那種數(shù)據(jù)格式,隨著連續(xù)運算的次數(shù)增加,精度都會下降。
5.工作區(qū):數(shù)據(jù)工作區(qū)固定在A、B、R2~R7,數(shù)符或標志工作區(qū)固定在PSW和23H單
元(位1CH~1FH)。在浮點系統(tǒng)中,R2、R3、R4和位1FH為第一工作區(qū),R5、R6、R7和位1EH
為第二工作區(qū)。用戶只要不在工作區(qū)中存放無關的或非消耗性的信息,程序就具有較好的
透明性。
6.子程序調(diào)用范例:由于本程序庫特別注意了各子程序接口的相容性,很容易采用
積木方式(或流水線方式)完成一個公式的計算。以浮點運算為例:
計算 y = Ln √ | Sin (ab/c+d) |
已知:a=-123.4;b=0.7577;c=56.34;d=1.276; 它們分別存放在30H、33H、36H、
39H開始的連續(xù)三個單元中。用BCD碼浮點數(shù)表示時,分別為a=831234H;b=007577H;
c=025634H;d=011276H。
求解過程:通過調(diào)用BTOF子程序,將各變量轉(zhuǎn)換成二進制浮點操作數(shù),再進行各
種運算,最后調(diào)用FTOB子程序,還原成十進制形式,供輸出使用。程序如下:
TEST: MOV R0,#39H ;指向BCD碼浮點操作數(shù)d
LCALL BTOF ;將其轉(zhuǎn)換成二進制浮點操作數(shù)
MOV R0,#36H ;指向BCD碼浮點操作數(shù)c
LCALL BTOF ;將其轉(zhuǎn)換成二進制浮點操作數(shù)
MOV R0,#33H ;指向BCD碼浮點操作數(shù)b
LCALL BTOF ;將其轉(zhuǎn)換成二進制浮點操作數(shù)
MOV R0,#30H ;指向BCD碼浮點操作數(shù)a
LCALL BTOF ;將其轉(zhuǎn)換成二進制浮點操作數(shù)
MOV R1,#33H ;指向二進制浮點操作數(shù)b
LCALL FMUL ;進行浮點乘法運算
MOV R1,#36H ;指向二進制浮點操作數(shù)c
LCALL FDIV ;進行浮點除法運算
MOV R1,#39H ;指向二進制浮點操作數(shù)d
LCALL FADD ;進行浮點加法運算
LCALL FSIN ;進行浮點正弦運算
LCALL FABS ;進行浮點絕對值運算
LCALL FSQR ;進行浮點開平方運算
LCALL FLN ;進行浮點對數(shù)運算
LCALL FTOB ;將結(jié)果轉(zhuǎn)換成BCD碼浮點數(shù)
STOP: LJMP STOP
END
運行結(jié)果,[R0]=804915H,即y=-0.4915,比較精確的結(jié)果應該是-0.491437。
(1) 標號: FSDT 功能:浮點數(shù)格式化
入口條件:待格式化浮點操作數(shù)在[R0]中。
出口信息:已格式化浮點操作數(shù)仍在[R0]中。
影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節(jié)
FSDT: LCALL MVR0 ;將待格式化操作數(shù)傳送到第一工作區(qū)中
LCALL RLN ;通過左規(guī)完成格式化
LJMP MOV0 ;將已格式化浮點操作數(shù)傳回到[R0]中
(2) 標號: FADD 功能:浮點數(shù)加法
入口條件:被加數(shù)在[R0]中,加數(shù)在[R1]中。
出口信息:OV=0時,和仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 6字節(jié)
FADD: CLR F0 ;設立加法標志
SJMP AS ;計算代數(shù)和
(3) 標號: FSUB 功能:浮點數(shù)減法
入口條件:被減數(shù)在[R0]中,減數(shù)在[R1]中。
出口信息:OV=0時,差仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
FSUB: SETB F0 ;設立減法標志
AS: LCALL MVR1 ;計算代數(shù)和。先將[R1]傳送到第二工作區(qū)
MOV C,F0 ;用加減標志來校正第二操作數(shù)的有效符號
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV 1EH,C ;將第二操作數(shù)的有效符號存入位1EH中
XRL A,@R0 ;與第一操作數(shù)的符號比較
RLC A
MOV F0,C ;保存比較結(jié)果
LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中
LCALL AS1 ;在工作寄存器中完成代數(shù)運算
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 ;清除溢出標志
CJNE A,#3FH,MV01;階碼是否上溢?
SETB OV ;設立溢出標志
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 ;將階碼擴充為8bit補碼
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 ;恢復數(shù)據(jù)指針
DEC R0
RET
MVR1: MOV A,@R1 ;將[R1]傳送到第二工作區(qū)中的子程序
MOV C,ACC.7 ;將數(shù)符保存在位1EH中
MOV 1EH,C
MOV C,ACC.6 ;將階碼擴充為8bit補碼
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 ;恢復數(shù)據(jù)指針
DEC R1
RET
AS1: MOV A,R6 ;讀取第二操作數(shù)尾數(shù)高字節(jié)
ORL A,R7
JZ AS2 ;第二操作數(shù)為零,不必運算
MOV A,R3 ;讀取第一操作數(shù)尾數(shù)高字節(jié)
ORL A,R4
JNZ EQ1
MOV A,R6 ;第一操作數(shù)為零,結(jié)果以第二操作數(shù)為準
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 ;對階,比較兩個操作數(shù)的階碼
XRL A,R5
JZ AS4 ;階碼相同,對階結(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ù)對階
MOV A,R2 ;尾數(shù)為零,提前結(jié)束對階
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ù)對階
MOV A,R5 ;尾數(shù)為零,提前結(jié)束對階
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 ;有進位,右規(guī)一次
AS5: CLR C ;比較絕對值大小
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é)果的符號與第一操作數(shù)相反
CLR C ;結(jié)果的絕對值為第二尾數(shù)減第一尾數(shù)
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3 ;浮點數(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ù)擴大一倍
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2 ;階碼減一
CJNE R2,#0C0H,RL1E;階碼下溢否?
CLR A
MOV R3,A ;階碼下溢,操作數(shù)以零計
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 ;清溢出標志
CJNE R2,#40H,RR1E;階碼上溢否?
MOV R2,#3FH ;階碼溢出
SETB OV
RR1E: RET
(4) 標號: FMUL 功能:浮點數(shù)乘法
入口條件:被乘數(shù)在[R0]中,乘數(shù)在[R1]中。
出口信息:OV=0時,積仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
FMUL: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中
MOV A,@R0
XRL A,@R1 ;比較兩個操作數(shù)的符號
RLC A
MOV 1FH,C ;保存積的符號
LCALL MUL0 ;計算積的絕對值
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 ;計算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 ;階碼上溢,設立標志
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) 標號: FDIV 功能:浮點數(shù)除法
入口條件:被除數(shù)在[R0]中,除數(shù)在[R1]中。
出口信息:OV=0時,商仍在[R0]中,OV=1時,溢出。
影響資源: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ù)為零,不必運算
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 ;比較兩個操作數(shù)的符號
RLC A
MOV 1FH,C ;保存結(jié)果的符號
LCALL MVR1 ;將[R1]傳送到第二工作區(qū)中
LCALL DIV3 ;調(diào)用工作區(qū)浮點除法
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 ;清零并保護之
PUSH ACC
CLR A
XCH A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV B,#10H ;除法運算,R3R4/R6R7-→R0R1
DIV5: CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R4
RLC A
MOV R4,A
XCH A,R3
RLC A
XCH A,R3
MOV F0,C
CLR C
SUBB A,R7
MOV R2,A
MOV A,R3
SUBB A,R6
ANL C,/F0
JC DIV6
MOV R3,A
MOV A,R2
MOV R4,A
INC R1
DIV6: DJNZ B,DIV5
MOV A,R6 ;四舍五入
CLR C
RRC A
SUBB A,R3
CLR A
ADDC A,R1 ;將結(jié)果存回R3R4
MOV R4,A
CLR A
ADDC A,R0
MOV R3,A
POP ACC ;恢復R0R1R2
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
MOV A,R2 ;計算商的階碼
CLR C
SUBB A,R5
LCALL MD ;階碼檢驗
LJMP RLN ;規(guī)格化
(6) 標號: FCLR 功能:浮點數(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) 標號: FZER 功能:浮點數(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) 標號: FMOV 功能:浮點數(shù)傳送
入口條件:源操作數(shù)在[R1]中,目標地址為[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) 標號: FPUS 功能:浮點數(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) 標號: FPOP 功能:浮點數(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) 標號: FCMP 功能:浮點數(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ù)異號,以[R0]數(shù)符為準
RLC A
MOV A,#0FFH
RET
CMP2: MOV A,@R1 ;兩數(shù)同號,準備比較階碼
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 ;取階碼之差的符號
JNB F0,CMP5
CPL C ;[R0]為負時,結(jié)果取反
CMP5: MOV A,#0FFH ;兩數(shù)不相等
RET
CMP6: INC R0 ;階碼相同時,準備比較尾數(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]為負時,結(jié)果取反
CMP7: RET
(12) 標號: FABS 功能:浮點絕對值函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:結(jié)果仍在[R0]中。
影響資源:A 堆棧需求: 2字節(jié)
FABS: MOV A,@R0 ;讀取操作數(shù)的階碼
CLR ACC.7 ;清除數(shù)符
MOV @R0,A ;回傳階碼
RET
(13) 標號: FSGN 功能:浮點符號函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:累加器 A=1 時為正數(shù),A=0FFH時為負數(shù),A=0 時為零。
影響資源: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 ;是負數(shù),改變標志
SGN1: RET
(14) 標號: FINT 功能:浮點取整函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:結(jié)果仍在[R0]中。
影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節(jié)
FINT: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中
LCALL INT ;在工作寄存器中完成取整運算
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;階符為負否?
CLR C
SUBB A,#10H ;階碼小于16否?
JC INTD
RET ;階碼大于16,已經(jīng)是整數(shù)
INTB: CLR A ;絕對值小于一,取整后正數(shù)為零,負數(shù)為負一
MOV R4,A
MOV C,1FH
RRC A
MOV R3,A
RL A
MOV R2,A
JNZ INTC
MOV R2,#41H
INTC: RET
INTD: CLR F0 ;舍尾標志初始化
INTE: CLR C
LCALL RR1 ;右規(guī)一次
ORL C,F0 ;記憶舍尾情況
MOV F0,C
CJNE R2,#10H,INTE;階碼達到16(尾數(shù)完全為整數(shù))否?
JNB F0,INTF ;舍去部分為零否?
JNB 1FH,INTF;操作數(shù)為正數(shù)否?
INC R4 ;對于帶小數(shù)的負數(shù),向下取整
MOV A,R4
JNZ INTF
INC R3
INTF: LJMP RLN ;將結(jié)果規(guī)格化
(15) 標號: FRCP 功能:浮點倒數(shù)函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,結(jié)果仍在[R0]中,OV=1時,溢出。
影響資源: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 ;絕對值傳送到第二工作區(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ù),設立溢出標志
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ū)浮點除法,求得倒數(shù)
LJMP MOV0 ;回傳結(jié)果
(16) 標號: FSQU 功能:浮點數(shù)平方
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,平方值仍然在[R0]中,OV=1時溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 9字節(jié)
FSQU: MOV A,R0 ;將操作數(shù)
XCH A,R1 ;同時作為乘數(shù)
PUSH ACC ;保存R1指針
LCALL FMUL ;進行乘法運算
POP ACC
MOV R1,A ;恢復R1指針
RET
(17) 標號: FSQR 功能:浮點數(shù)開平方(快速逼近算法)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,平方根仍在[R0]中,OV=1時,負數(shù)開平方出錯。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié)
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV ;負數(shù)開平方,出錯
RET
SQR: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ SQ
MOV @R0,#41H;尾數(shù)為零,不必運算
CLR OV
RET
SQ: MOV A,@R0
MOV C,ACC.6 ;將階碼擴展成8bit補碼
MOV ACC.7,C
INC A ;加一
CLR C
RRC A ;除二
MOV @R0,A ;得到平方根的階碼,回存之
INC R0 ;指向被開方數(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ù)為零,不必運算
MOV R2,A ;將尾數(shù)傳送到R2R3中
INC R0
MOV A,@R0
MOV R3,A
MOV A,R2 ;快速開方,參閱定點子程序說明
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
SJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
SJMP SQR3
SQR2: MOV B,#8DH
MOV R4,#0D0H
SQR3: MUL AB
MOV A,B
ADD A,R4
MOV R4,A
MOV B,A
MUL AB
XCH A,R3
CLR C
SUBB A,R3
MOV R3,A
MOV A,B
XCH A,R2
SUBB A,R2
MOV R2,A
SQR4: SETB C
MOV A,R4
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5
INC R4
MOV R2,A
MOV R3,B
SJMP SQR4
SQR5: MOV A,R4
XCH A,R2
RRC A
MOV F0,C
MOV A,R3
MOV R5,A
MOV R4,#8
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6
MOV A,R3 ;將平方根的尾數(shù)回傳到[R0]中
MOV @R0,A
DEC R0
MOV A,R2
MOV @R0,A
SQR9: DEC R0 ;數(shù)據(jù)指針回歸原位
CLR OV ;開方結(jié)果有效
RET
(18) 標號: FPLN 功能:浮點數(shù)多項式計算
入口條件:自變量在[R0]中,多項式系數(shù)在調(diào)用指令之后,以40H結(jié)束。
出口信息:OV=0時,結(jié)果仍在[R0]中,OV=1時,溢出。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 4字節(jié)
FPLN: POP DPH ;取出多項式系數(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 ;讀取一個系數(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 ;指向下一個系數(shù)
MOV C,1EH ;比較兩個數(shù)符
RRC A
XRL A,23H
RLC A
MOV F0,C ;保存比較結(jié)果
LCALL AS1 ;進行代數(shù)加法運算
CLR A ;讀取下一個系數(shù)的第一個字節(jié)
MOVC A,@A+DPTR
CJNE A,#40H,PLN2;是結(jié)束標志嗎?
XCH A,R0 ;運算結(jié)束,恢復R0、R1原來的角色
XCH A,R1
XCH A,R0
LCALL MOV0 ;將結(jié)果回傳到[R0]中
CLR A
INC DPTR
JMP @A+DPTR ;返回主程序
PLN2: MOV A,@R1 ;比較自變量和中間結(jié)果的符號
XRL A,23H
RLC A
MOV 1FH,C ;保存比較結(jié)果
LCALL MUL0 ;進行乘法運算
SJMP PLN1 ;繼續(xù)下一項運算
(19) 標號: FLOG 功能:以10為底的浮點對數(shù)函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,結(jié)果仍在[R0]中,OV=1時,負數(shù)或零求對數(shù)出錯。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:9字節(jié)
FLOG: LCALL FLN ;先以e為底求對數(shù)
JNB OV,LOG
RET ;如溢出則停止計算
LOG: MOV R5,#0FFH;系數(shù)0.43430(1/Ln10)
MOV R6,#0DEH
MOV R7,#5CH
LCALL MUL1 ;通過相乘來換底
LJMP MOV0 ;傳回結(jié)果
(20) 標號: FLN 功能:以e為底的浮點對數(shù)函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,結(jié)果仍在[R0]中,OV=1時,負數(shù)或零求對數(shù)出錯。
影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 7字節(jié)
FLN: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)
JB 1FH,LNOV;負數(shù)或零求對數(shù),出錯
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 ;用多項式計算尾數(shù)的對數(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 ;當階碼為負時,求其絕對值
INC A
LN2: MOV R2,A ;階碼的絕對值乘以0.69315
MOV B,#72H
MUL AB
XCH A,R2
MOV R7,B
MOV B,#0B1H
MUL AB
ADD A,R7
MOV R7,A ;乘積的尾數(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ù)的對數(shù)合并,得原操作數(shù)的對數(shù)
(21) 標號: FE10 功能:以10為底的浮點指數(shù)函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,結(jié)果仍在[R0]中,OV=1時,溢出。
影響資源: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 ;先進行加權(quán)運算,后以2為底統(tǒng)一求冪
(22) 標號: FEXP 功能:以e為底的浮點指數(shù)函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,結(jié)果仍在[R0]中,OV=1時,溢出。
影響資源: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 ;進行加權(quán)運算
SJMP E20 ;以2為底統(tǒng)一求冪
(23) 標號: FE2 功能:以2為底的浮點指數(shù)函數(shù)
入口條件:操作數(shù)在[R0]中。
出口信息:OV=0時,結(jié)果仍在[R0]中,OV=1時,溢出。
影響資源: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;階符為負?
SETB C
SUBB A,#6 ;階碼大于6否?
JC EXP2
JB 1FH,EXP0;數(shù)符為負否?
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;負指數(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ù)復制到第二工作區(qū)
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
MOV C,1FH
MOV 1EH,C
LCALL INT ;對第一區(qū)取整
MOV A,R3
JZ EXP4
EXP3: CLR C ;使尾數(shù)高字節(jié)R3對應一個字節(jié)整數(shù)
RRC A
INC R2
CJNE R2,#8,EXP3
EXP4: MOV R3,A
JNB 1FH,EXP5
CPL A ;并用補碼表示
INC A
EXP5: PUSH ACC ;暫時保存之
LCALL RLN ;重新規(guī)格化
CPL 1FH
SETB F0
LCALL AS1 ;求指數(shù)的小數(shù)部分
LCALL MOV0 ;回傳指數(shù)的小數(shù)部分
LCALL FPLN ;通過多項式計算指數(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 ;按補碼加到冪的階碼上
MOV R2,A
CLR 1FH ;冪的符號為正
LJMP MOV0 ;將冪傳回[R0]中
(24)標號: DTOF 功能:雙字節(jié)十六進制定點數(shù)轉(zhuǎn)換成格式化浮點數(shù)
入口條件:雙字節(jié)定點數(shù)的絕對值在[R0]中,數(shù)符在位1FH中,整數(shù)部分的位數(shù)在A中。
出口信息:轉(zhuǎn)換成格式化浮點數(shù)在[R0]中(三字節(jié))。
影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節(jié)
DTOF: MOV R2,A ;按整數(shù)的位數(shù)初始化階碼
MOV A,@R0 ;將定點數(shù)作尾數(shù)
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
LCALL RLN ;進行規(guī)格化
LJMP MOV0 ;傳送結(jié)果到[R0]中
(25) 標號: FTOD 功能:格式化浮點數(shù)轉(zhuǎn)換成雙字節(jié)定點數(shù)
入口條件:格式化浮點操作數(shù)在[R0]中。
出口信息:OV=1時溢出,OV=0時轉(zhuǎn)換成功:定點數(shù)的絕對值在[R0]中(雙字節(jié)),數(shù)符
在位1FH中,F(xiàn)0=1 時為整數(shù),CY=1時為一字節(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;階碼為負,純小數(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 ;設立雙字節(jié)整數(shù)標志
CLR C
CLR OV
RET
FTD3: MOV B,#8 ;按一字節(jié)整數(shù)一字節(jié)小數(shù)轉(zhuǎn)換
LCALL FTD8
SETB C ;設立一字節(jié)整數(shù)一字節(jié)小數(shù)標志
CLR F0
CLR OV
RET
FTD4: MOV B,#0 ;按純小數(shù)轉(zhuǎn)換
LCALL FTD8
CLR OV ;設立純小數(shù)標志
CLR F0
CLR C
RET
FTD8: MOV A,R2 ;按規(guī)定的整數(shù)位數(shù)進行右規(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) 標號: BTOF 功能:浮點BCD碼轉(zhuǎn)換成格式化浮點數(shù)
入口條件:浮點BCD碼操作數(shù)在[R0]中。
出口信息:轉(zhuǎ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 ;以絕對值進行轉(zhuǎn)換。
MOV C,ACC.6 ;擴充階碼為八位。
MOV ACC.7,C
MOV @R0,A
JNC BTF1
ADD A,#19 ;是否小于1E-19?
JC BTF2
MOV @R0,#41H;小于1E-19時以0計。
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
DEC R0
DEC R0
RET
BTF1: SUBB A,#19
JC BTF2
MOV A,#3FH ;大于1E19時封頂。
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
RET
BTF2: CLR A ;準備將BCD碼尾數(shù)轉(zhuǎn)換成十六進制浮點數(shù)。
MOV R4,A
MOV R3,A
MOV R2,#10H ;至少兩個字節(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;準備查表得到十進制階碼對應的浮點數(shù)。
MOV A,@R0
ADD A,#19 ;計算表格偏移量。
MOV B,#3
MUL AB
ADD A,DPL
MOV DPL,A
JNC BTF5
INC DPH
BTF5: CLR A ;查表。
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
LCALL MUL1 ;將階碼對應的浮點數(shù)和尾數(shù)對應的浮點數(shù)相乘。
MOV C,1DH ;取出數(shù)符。
MOV 1FH,C
LJMP MOV0 ;傳送轉(zhuǎn)換結(jié)果。
(27) 標號: FTOB 功能:格式化浮點數(shù)轉(zhuǎn)換成浮點BCD碼
入口條件:格式化浮點操作數(shù)在[R0]中。
出口信息:轉(zhuǎ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;絕對值大于或等于1時的查表起點。
MOV B,#0 ;十的0次冪。
MOV A,R2
JNB ACC.7,FTB1
MOV DPTR,#BTFL;絕對值小于1E-6時的查表起點。
MOV B,#0EDH ;十的-19次冪。
ADD A,#16
JNC FTB1
MOV DPTR,#BFLN;絕對值大于或等于1E-6時的查表起點。
MOV B,#0FAH ;十的-6次冪。
FTB1: CLR A ;查表,找到一個比待轉(zhuǎ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)換浮點數(shù)比較。
CLR C
SUBB A,R2
JB ACC.7,FTB2;差為負數(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 ;準備表格下一項。
INC DPTR
INC DPTR
INC B ;冪加一。
SJMP FTB1 ;
FTB3: PUSH B ;保存冪值。
LCALL DIV3 ;相除,得到一個二進制浮點數(shù)的純小數(shù)。
FTB4: MOV A,R2 ;取階碼。
JZ FTB5 ;為零嗎?
CLR C
LCALL RR1 ;右規(guī)。
SJMP FTB4
FTB5: POP ACC ;取出冪值。
MOV R5,A ;作為十進制浮點數(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ù)擴大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) 標號: FCOS 功能:浮點余弦函數(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é)果,接著運行下面的FSIN程序
(29) 標號: FSIN 功能:浮點正弦函數(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 ;保存自變量的符號
CLR ACC.7 ;統(tǒng)一按正數(shù)計算
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é)果復制到第二區(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 ;將浮點象限數(shù)轉(zhuǎn)換成定點象限數(shù)
LCALL RR1
CJNE R2,#10H,SIN1
MOV A,R4
JNB ACC.1,SIN2
CPL 1DH ;對于第三、四象限,結(jié)果取反
SIN2: JB ACC.0,SIN3
CPL 1FH ;對于第一、三象限,直接求規(guī)一化的小數(shù)
SJMP SIN4
SIN3: MOV A,R4 ;對于第二、四象限,準備求其補數(shù)
INC A
MOV R4,A
JNZ SIN4
INC R3
SIN4: LCALL RLN ;規(guī)格化
SETB F0
LCALL AS1 ;求自變量歸一化等效值
LCALL MOV0 ;回傳
LCALL FPLN ;用多項式計算正弦值
DB 7DH,93H,28H;0.07185
DB 41H,0,0 ;0
DB 80H,0A4H,64H;-0.64215
DB 41H,0,0 ;0
DB 1,0C9H,2;1.5704
DB 41H,0,0 ;0
DB 40H ;結(jié)束
MOV A,@R0 ;結(jié)果的絕對值超過1.00嗎?
JZ SIN5
JB ACC.6,SIN5
INC R0 ;絕對值按1.00封頂
MOV @R0,#80H
INC R0
MOV @R0,#0
DEC R0
DEC R0
MOV A,#1
SIN5: MOV C,1DH ;將數(shù)符拼入結(jié)果中
MOV ACC.7,C
MOV @R0,A
RET
(30) 標號: FATN 功能:浮點反正切函數(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 ;自變量取絕對值
MOV @R0,A
CLR 1CH ;清求余運算標志
JB ACC.6,ATN1;自變量為純小數(shù)否?
JZ ATN1
SETB 1CH ;置位求余運算標志
LCALL FRCP ;通過倒數(shù)運算,轉(zhuǎn)換成純小數(shù)
ATN1: LCALL FPLN ;通過多項式運算,計算反正切函數(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;需要求余運算否?
CPL 1FH ;準備運算標志
MOV C,1FH
MOV F0,C ;常數(shù)1.5708(π/2)
MOV R5,#1
MOV R6,#0C9H
MOV R7,#10H
LCALL AS1 ;求余運算
LCALL MOV0 ;回傳
ATN2: MOV A,@R0 ;拼入結(jié)果的數(shù)符
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
RET
(31) 標號: RTOD 功能:浮點弧度數(shù)轉(zhuǎn)換成浮點度數(shù)
入口條件:浮點弧度數(shù)在[R0]中。
出口信息:轉(zhuǎ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 ;通過乘法進行轉(zhuǎn)換
(32) 標號: DTOR 功能:浮點度數(shù)轉(zhuǎn)換成浮點弧度數(shù)
入口條件:浮點度數(shù)在[R0]中。
出口信息:轉(zhuǎ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 ;通過乘法進行轉(zhuǎn)換
LJMP MOV0 ;結(jié)果傳送到[R0]中
END

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎最新视频 | 国产精品久久久久永久免费观看 | 日韩在线不卡 | 亚洲一区综合 | 91麻豆精品国产91久久久更新资源速度超快 | 亚洲国产成人精品女人久久久 | www.五月天婷婷 | 久久久青草 | 黄色a视频 | 伊人网91 | 殴美一级片 | 一级黄色片在线免费观看 | 欧美一区二区在线观看视频 | 荷兰欧美一级毛片 | 亚洲逼院 | 在线视频 欧美日韩 | 噜噜噜色网 | 日本成人毛片 | 青青草视频网站 | 精品国产区 | 久久久久亚洲精品 | 视频三区| 亚洲成人av在线播放 | 国产综合在线视频 | 亚洲视频区| 免费在线成人 | 欧美不卡 | 欧美日韩视频在线播放 | 精品久久99 | 精品国产一区二区三区性色av | www.色综合| 欧美xxxx做受欧美 | 久久国产区 | 青青草av网站 | 9999久久 | 免费啪啪 | av日韩高清| 色.com| 中文字幕成人 | 久久久精品天堂 | 亚洲最大av |