1
电子说
下面是一些51单片机汇编语言编程常用到的子程序代码库
1、片内RAM初始化子程序
2、片外RAM初始化子程序
3、片外RAM初始化子程序(双字节个单元)
4、内部RAM数据复制程序
5、外部RAM数据复制程序
6、外部RAM数据复制程序
7、外部RAM数据复制到内部RAM程序
8、限幅滤波程序
9、中位值滤波程序
10、N点算术平均滤波
11、N点加权平均滤波
12、一阶加权滞后滤波程序
13、双字节取补程序
14、N节取补程序
15、双字节无符号数加法程序
16、N字节无符号数加法程序
17、双字节无符号数减法程序
18、N字节无符号数减法程序
19、单字节无符号数乘法程序
20、单字节无符号数乘法程序
21、单字节无符号数乘法程序
22、双字节无符号数乘法程序
23、双字节无符号数乘法程序
24、N字节无符号数乘法程序
25、单字节无符号除法程序
26、单字节无符号除法程序
27、双字节无符号除法程序
28、N字节无符号除法程序(组合)
29、N字节无符号除法程序
30、N字节数据左移程序
31、原码有符号双字节减法程序
32、原码有符号双字节加法程序
33、原码有符号双字节乘法程序
34、原码有符号双字节除法程序
35、单字节顺序查找程序
36、单字节顺序查找程序
37、双字节字符串顺序查找程序
38、双字节字符串顺序查找程序
39、N字节字符串顺序查找程序
40、单字节最值查找程序
41、浮点数顺序查找程序
42、浮点数最值查找程序
43、单字节折半查找程序
;片内RAM初始化子程序
IBCLR :MOV A,R0
MOV R1,A
CLR A
IBC1 :MOV @R1,A
INC R1
DJNZ R7,IBC1
RET
;片外RAM初始化子程序
EBCLR1 :MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR C
EBC11 :MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC11
RET
;片外RAM初始化子程序(双字节个单元)
EBCLR2 :MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
MOV A,R7
JZ EBC21
INC R6
EBC21 :CLR A
MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC21
DJNZ R6,EBC21
RET
;内部RAM数据复制程序
;入口 :R0,R7
;占用资源:A
;堆栈需求:2字节
;出口 :R1
IBMOV :MOV A,R0
ADD A,R7
MOV R0,A
MOV A,R1
ADD A,R7
MOV R1,A
IBM1 :DEC R0
DEC R1
MOV A,@R0
MOV @R1,A
DJNZ R7,IBM1
RET
;外部RAM数据复制程序
;入口 :ADDPH,ADDPL,R7
;占用资源:ACC
;堆栈需求:2字节
;出口 :R0,R1
EBMOV1 :MOV A,ADDPL
ADD A,R7
MOV DPL,A
CLR A
ADDC A,ADDPH
MOV DPH,A
MOV A,R7
ADD A,R1
XCH A,R0
ADDC A,#00H
MOV P2,A
EBM11 :DEC R0
CJNE R0,#0FFH,EBM12
DEC P2
EBM12 :DEC DPL
MOV A,DPL
CJNE A,#0FFH,EBM13
DEC DPH
EBM13 :MOVX A,@R0
MOVX @DPTR,A
DJNZ R7,EBM11
RET
;外部RAM数据复制程序
;入口 :ADDPH,ADDPL,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口 :R0,R1
EBMOV2 :MOV A,ADDPL
ADD A,R7
MOV DPL,A
MOV A,R6
ADDC A,ADDPH
MOV DPH,A
MOV A,R7
ADD A,R1
XCH A,R0
ADDC A,R6
MOV P2,A
MOV A,R7
JZ EBM21
INC R6
EBM21 :DEC R0
CJNE R0,#0FFH,EBM22
DEC P2
EBM22 :DEC DPL
MOV A,DPL
CJNE A,#0FFH,EBM23
DEC DPH
EBM23 :MOVX A,@R0
MOVX @DPTR,A
DJNZ R7,EBM21
DJNZ R6,EBM21
RET
;外部RAM数据复制到内部RAM程序
;入口 :ADDPH,ADDPL,R7
;占用资源:ACC
;堆栈需求:2字节
;出口 :R0
ITEMOV :MOV A,ADDPL
ADD A,R7
MOV DPL,A
MOV A,ADDPH
ADDC A,#00H
MOV DPH,A
MOV A,R0
ADD A,R7
MOV R0,A
ITEM1 :DEC R0
DEC DPL
MOV A,DPL
CJNE A,#0FFH,ITEM2
DEC DPH
ITEM2 :MOVX A,@DPTR
MOV @R0,A
DJNZ R7,ITEM1
RET
;限幅滤波程序
;入口 :A,SDAT,DELTY
;占用资源:B
;堆栈需求:2字节
;出口 :A
JUGFILT :MOV B,A
CLR C
SUBB A,SDAT
JNC JUGFT1
CPL A
INC A
JUGFT1 :SETB A
SUBB A,#DELTY
JNC JUGFT3
MOV A,SDAT
RET
JUGFT3 :MOV A,B
MOV SDAT,A
RET
;中位值滤波程序
;入口 :ADDPH,ADDPL,N
;占用资源:ESELSORT
;堆栈需求:4字节
;出口 :A
MEDFILT :LCALL ESELSORT
MOV A,N
CLR C
RRC A
ADD A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
JNC MEDFT1
INC DPH
MEDFT1 :MOVX A,@DPTR
RET
;N点算术平均滤波
;入口 :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
AVFILT :MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR A
MOV R3,A
MOV R4,A
MOV R7,N
AVFT1 :MOVX A,@DPTR
INC DPTR
ADD A,R4
MOV R4,A
JNC AVFT2
INC R3
AVFT2 :DJNZ R7,AVFT1
MOV R7,N
MOV R2,#00H
LCALL NDIV31
MOV A,R4
RET
;N点加权平均滤波
;入口 :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
QAVFILT :CLR A
MOV R3,A
MOV R4,A
MOV R7,N
MOV P2,ADDPH
MOV R1,ADDPL
MOV DPTR,#QAVTAB
QAVFT1 :MOVC A,@A+DPTR
MOV B,A
MOVX A,@R1
INC DPTR
INC R1
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
DJNZ R7,QAVFT1
MOV A,R4
JNB ACC.7,QAVFT2
INC R3
QAVFT2 :MOV A,R3
RET
QAVTAB :DB
;一阶加权滞后滤波程序
;入口 :A,DELTY
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
BQFILT :MOV B,A
CLR A
MOV DPTR,#ABTAB
MOVC A,@A+DPTR
MUL AB
MOV R4,A
MOV R3,B
MOV A,#01H
MOVC A,@A+DPTR
MOV B,DELTY
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
MOV A,R4
JNB ACC.7,FT1
INC R3
FT1 :MOV A,R3
MOV DELTY,A
RET
BQTAB :DB 80H,80H
;双字节取补程序 /(R3R4)=(R3R4)
;入口 :R3,R4
;占用资源:ACC
;堆栈需求:2字节
;出口 :R3,R4
CMPT :MOV A,R4
CPL A
ADD A,#01H
MOV R4,A
MOV A,R3
CPL A
ADDC A,#00H
MOV R3,A
RET
;N节取补程序 /([R0])=([R0])
;入口 :R0,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0
NCMPTN :MOV B,R0
SETB C
NCPT1 :MOV A,@R0
CPL A
ADDC A,#00H
MOV @R0,A
INC R0
DJNZ R7,NCPT1
MOV R0,B
RET
;双字节无符号数加法程序 (R3R4+R6R7)=(R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口 :R3,R4,CF
NADD :MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
RET
;N字节无符号数加法程序 ([R0]+[R1])=([R0])
;入口 :R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,CF
NADDN :MOV B,R0
CLR C
NADN1 :MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NADN1
MOV R0,B
RET
;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口 :R3,R4
NSUB :MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
RET
;N字节无符号数减法程序 ([R0]-[R1])=([R0])
;入口 :R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,CF
NSUBN :MOV B,R0
MOV R7,N
CLR C
NSUBN1 :MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NSUBN1
MOV R0,B
RET
;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
;入口 :R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R2,R3,R4
NMUL21 :MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
CLR OV
RET
;单字节无符号数乘法程序 (R2R3R4*R7)=(R5R2R3R4)
;入口 :R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R5,R2,R3,R4
NMUL31 :MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,R7
MUL AB
ADD A,R2
MOV R2,A
CLR A
ADDC A,B
MOV R5,A
CLR OV
RET
;单字节无符号数乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)
;入口 :R5,R2,R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R7,R5,R2,R3,R4
NMUL41 :MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,R7
MUL AB
ADD A,R2
MOV R2,A
CLR A
ADDC A,B
XCH A,R5
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R7,A
CLR OV
RET
;双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R5,R2,R3,R4
NMUL22 :MOV A,R4
MOV B,R7
MUL AB
XCH A,R4
MOV R5,B
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R2,A
MOV A,R3
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R2
MOV R2,A
CLR A
ADDC A,#00H
XCH A,R3
MOV B,R6
MUL AB
ADD A,R2
MOV R2,A
MOV A,B
ADDC A,R3
XCH A,R5
MOV R3,A
CLR OV
RET
;双字节无符号数乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)
;入口 :R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R1,R5,R2,R3,R4
NMUL32 :MOV A,R4
MOV B,R7
MUL AB
XCH A,R4
MOV R5,B
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R1,A
MOV A,R3
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R1
MOV R1,A
CLR A
ADDC A,#00H
XCH A,R3
MOV B,R6
MUL AB
ADD A,R1
MOV R1,A
MOV A,B
ADDC A,R3
XCH A,R5
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R1
MOV R1,A
MOV A,B
ADDC A,R5
MOV R5,A
CLR A
ADDC A,#00H
XCH A,R2
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R2
XCH A,R1
MOV R2,A
CLR OV
RET
;N字节无符号数乘法程序 ([R0]*[R1])=([R0])
;入口 :R0,R1,M,N
;占用资源:ACC,B,R2,R5,R6,R7,NCNT
;堆栈需求:2字节
;出口 :R0
NMULMN :MOV A,M
ADD A,R0
MOV R5,A
XCH A,R1
XCH A,R5
ADD A,N
XCH A,R0
MOV R6,A
MOV B,M
MOV NCNT,B
NMLMN1 :DEC R0
DEC R1
CLR A
XCH A,@R1
MOV @R0,A
DJNZ NCNT,NMLMN1
MOV NCNT,B
NMLMN2 :CLR A
XCH A,@R0
MOV R2,A
MOV A,R6
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
CLR C
NMLMN3 :MOV A,R2
MOV B,@R1
INC R1
MUL AB
ADDC A,@R0
MOV @R0,A
INC R0
MOV A,B
ADDC A,@R0
MOV @R0,A
DJNZ R7,NMLMN3
INC R0
INC R6
DJNZ NCNT,NMLMN2
MOV A,R0
CLR C
SUBB A,M
SUBB A,N
MOV R0,A
RET
;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
;入口 :R2,R3,R4,R7
;占用资源:ACC,B,F0
;堆栈需求:3字节
;出口 :(R2),R3,R4,R7,OV
NDIV31 :MOV A,R2
MOV B,R7
DIV AB
PUSH A
MOV R2,B
MOV B,#10H
NDV311 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 :MOV R2,A
INC R4
NDV313 :DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 :XCH A,R2
MOV R7,A
RET
;单字节无符号除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余数R7
;入口 :R2,R3,R4,R7
;占用资源:ACC,B,F0
;堆栈需求:3字节
;出口 :(R5),R2,R3,R4,R7,OV
NDIV41 :MOV A,R5
MOV B,R7
DIV AB
PUSH A
MOV R5,B
MOV B,#18H
NDV411 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV412
JC NDV413
NDV412 :MOV R5,A
INC R4
NDV413 :DJNZ B,NDV411
POP A
CLR OV
JZ NDV414
SETB OV
NDV414 :XCH A,R5
MOV R7,A
RET
;双字节无符号除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余数R6R7
;入口 :R5,R2,R3,R4,R6,R7
;占用资源:ACC,B,F0
;堆栈需求:4字节
;出口 :(R2),R3,R4,R6,R7,OV
NDIV42 :MOV A,R1
PUSH A
MOV B,#00H
NDV421 :MOV A,R2
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JC NDV422
MOV R5,A
MOV A,R1
MOV R2,A
INC B
SJMP NDV421
NDV422 :PUSH B
MOV B,#10H
NDV423 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
XCH A,R5
RLC A
XCH A,R5
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JB F0,NCV424
JC NDV425
NCV424 :MOV R5,A
MOV A,R1
MOV R2,A
INC R4
NDV425 :DJNZ B,NDV423
POP A
CLR OV
JNZ NDV426
SETB OV
NDV426 :XCH A,R2
MOV R7,A
MOV A,R5
MOV R6,A
POP A
MOV R1,A
RET
;N字节无符号除法程序(组合) ([R0]/[R1])=([R0])
;入口 :R0,R1,M,N
;占用资源:ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN
;堆栈需求:4字节
;出口 :R0
;NDIVMN :MOV A,M
CLR C
SUBB A,N
MOV NCNT,A
ADD A,R0
MOV R4,A
XCH A,R0
MOV R3,A
MOV A,R1
MOV R5,A
MOV R2,#00H
NDVMN1 :MOV R7,N
LCALL NSUBN
MOV A,R5
MOV R1,A
JC NDVMN2
INC R2
SJMP NDVMN1
NDVMN2 :MOV R7,N
LCALL NADDN
MOV A,NCNT
SWAP A
RR A
MOV NCNT,A
NDVMN3 :MOV A,R3
MOV R0,A
MOV R7,M
LCALL NRLCN
MOV F0,C
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
LCALL NSUBN
JB F0,NDVMN4
JC NDVMN5
NDVMN4 :MOV A,R3
MOV R0,A
INC @R0
SJMP NDVMN6
NDVMN5 :MOV A,R5
MOV R1,A
MOV R7,N
LCALL NADDN
NDVMN6 :DJNZ NCNT,NDVMN3
MOV A,R4
MOV R1,A
MOV A,R2
MOV @R1,A
MOV A,R3
MOV R0,A
RET
;N字节无符号除法程序(集成) ([R0]/R[1])=([R0])
;入口 :R0,R1,M,N
;占用资源:ACC,R2,R3,R4,R5,R7,F0
;堆栈需求:2字节
;出口 :R0
NDIVMN :MOV A,M
CLR C
SUBB A,N
MOV B,A
ADD A,R0
MOV R4,A
XCH A,R0
MOV R3,A
MOV A,R1
MOV R5,A
MOV R2,#00H
NDVMN1 :MOV R7,N
CLR C
NDVMN2 :MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN2
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
JC NDVMN3
INC R2
SJMP NDVMN1
NDVMN3 :MOV R7,N
CLR C
NDVMN4 :MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN4
MOV A,#08H
MUL AB
MOV B,A
NDVMN5 :MOV A,R3
MOV R0,A
MOV R7,M
CLR C
NDVMN6 :MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R7,NDVMN6
MOV F0,C
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
CLR C
NDVMN7 :MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN7
JB F0,NDVMNB
JC NDVMN8
NDVMNB :MOV A,R3
MOV R0,A
INC @R0
SJMP NDVMNA
NDVMN8 :MOV R7,N
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
CLR C
NDVMN9 :MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN9
NDVMNA :DJNZ B,NDVMN5
MOV A,M
CLR C
SUBB A,N
ADD A,R3
MOV R1,A
MOV A,R2
MOV @R1,A
MOV A,R3
MOV R0,A
RET
;N字节数据左移程序 RLC([R0])=(CF[R0])
;入口 :R0,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,CF
NRLCN :MOV B,R0
CLR C
NRLN1 :MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R7,NRLN1
MOV R0,B
RET
;原码有符号双字节减法程序 (R3R4-R6R7)=R3R4
;入口 :R3,R4,R6,R7
;占用资源:ACC,DADD
;堆栈需求:6字节
;出口 :R3,R4,OV
DSUB :MOV A,R6
CPL ACC.7
MOV R6,A
LCALL DADD
RET
;原码有符号双字节加法程序 (R3R4+R6R7)=R3R4
;入口 :R3,R4,R6,R7
;占用资源:ACC,SR0,NADD,NSUB,CMPT
;堆栈需求:4字节
;出口 :R3,R4,OV
DADD :MOV A,R3
MOV C,ACC.7
MOV SR0,C
XRL A,R6
MOV C,ACC.7
MOV A,R3
CLR ACC.7
MOV R3,A
MOV A,R6
CLR ACC.7
MOV R6,A
JC DAB2
LCALL NADD
MOV A,R3
JB ACC.7,DABE
DAB1 :MOV C,SR0
MOV ACC.7,C
MOV R3,A
CLR OV
RET
DABE :SETB OV
RET
DAB2 :LCALL NSUB
MOV A,R3
JNB ACC.7,DAB1
LCALL CMPT
CPL SR0
SJMP DAB1
;原码有符号双字节乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC,SR0,NMUL22
;堆栈需求:4字节
;出口 :R5,R2,R3,R4
IMUL :MOV A,R3
XRL A,R6
MOV C,ACC.7
MOV SR0,C
MOV A,R3
CLR ACC.7
MOV R3,A
MOV A,R6
CLR ACC.7
MOV R6,A
LCALL NMUL22
MOV A,R5
MOV C,SR0
MOV ACC.7,C
MOV R5,A
RET
;原码有符号双字节除法程序 (R5R2R3R4/R6R7)=(R3R4) 余数(R6R7)
;入口 :R5,R2,R3,R4
;占用资源:ACC,SR0,NDIV42
;堆栈需求:6字节
;出口 :R3,R4,R6,R7,OV
IDIV :MOV A,R5
XRL A,R6
MOV C,ACC.7
MOV SR0,C
MOV A,R5
CLR ACC.7
MOV R5,A
MOV A,R6
CLR ACC.7
MOV R6,A
LCALL NDIV42
MOV A,R3
JB ACC.7,IDIVE
JB OV,IDIVE
MOV C,SR0
MOV ACC.7,C
MOV R3,A
RET
IDIVE :SETB OV
RET
;单字节顺序查找程序
;入口 :R0,R1,A,R7
;占用资源:B
;堆栈需求:2字节
;出口 :R0,R1,A
FINDB1 :MOV B,A
MOV DPL,R1
MOV DPH,R0
FINDB11 :MOVX A,@DPTR
CJNE A,B,FINDB12
MOV R1,DPL
MOV R0,DPH
CLR A
RET
FINDB12 :INC DPTR
DJNZ R7,FINDB11
MOV A,#0FFH
RET
;单字节顺序查找程序
;入口 :R0,R1,A,R6,R7
;占用资源:B
;堆栈需求:2字节
;出口 :R0,R1,A
FINDB2 :MOV B,A
MOV DPL,R1
MOV DPH,R0
MOV A,R7
JZ FINDB21
INC R6
FINDB21 :MOVX A,@DPTR
CJNE A,B,FINDB22
MOV R1,DPL
MOV R0,DPH
CLR A
RET
FINDB22 :INC DPTR
DJNZ R7,FINDB21
DJNZ R6,FINDB21
MOV A,#0FFH
RET
;双字节字符串顺序查找程序
;入口 :R0,R1,R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,R1,A
FINDS1 :MOV DPL,R1
MOV DPH,R0
FINDS11 :MOVX A,@DPTR
INC DPTR
CLR C
SUBB A,R4
JNZ FINDS12
MOVX A,@DPTR
SUBB A,R3
JNZ FINDS12
MOV A,DPL
CLR C
SUBB A,#01H
MOV R1,A
MOV A,DPH
SUBB A,#00H
MOV R0,A
CLR A
RET
FINDS12 :DJNZ R7,FINDS11
MOV A,#0FFH
RET
;双字节字符串顺序查找程序
;入口 :R0,R1,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,R1,A
FINDS2 :MOV DPL,R1
MOV DPH,R0
MOV A,R7
JZ FINDS21
INC R6
FINDS21 :MOVX A,@DPTR
INC DPTR
CLR C
SUBB A,R4
JNZ FINDS22
MOVX A,@DPTR
SUBB A,R3
JNZ FINDS22
MOV A,DPL
CLR C
SUBB A,#01H
MOV R1,A
MOV A,DPH
SUBB A,#00H
MOV R0,A
CLR A
RET
FINDS22 :DJNZ R7,FINDS21
DJNZ R6,FINDS21
MOV A,#0FFH
RET
;N字节字符串顺序查找程序
;入口 :ADDPH,ADDPL,R0,R6,R7,N
;占用资源:ACC,B,R2,NCNT
;堆栈需求:2字节
;出口 :ADDPH,ADDPL,A
FINDN :MOV A,R0
MOV R2,A
MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
MOV A,R7
JZ FINDN1
INC R6
FINDN1 :MOV A,R2
MOV R0,A
MOV A,N
MOV NCNT,A
FINDN2 :MOVX A,@DPTR
CLR C
SUBB A,@R0
JNZ FINDN3
INC DPTR
INC R0
DJNZ NCNT,FINDN2
MOV A,DPL
CLR C
SUBB A,N
MOV ADDPL,A
MOV A,DPH
SUBB A,#00H
MOV ADDPH,A
CLR A
RET
FINDN3 :CLR C
MOV A,R0
SUBB A,R2
JNZ FINDN4
INC DPTR
FINDN4 :DJNZ R7,FINDN1
DJNZ R6,FINDN1
MOV A,#0FFH
RET
;单字节最值查找程序
;入口 :R0,R1,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0(最大值),R1(最小值),R2,R3,R4,R5
FMAMIB :MOV DPL,R1
MOV DPH,R0
MOVX A,@DPTR
MOV R0,A
MOV R1,A
MOV A,DPL
MOV R3,A
MOV R5,A
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,R7
JZ FMMB1
INC R6
FMMB1 :MOVX A,@DPTR
MOV B,A
SETB C
SUBB A,R0
JC FMMB2
MOV R0,B
MOV R3,DPL
MOV R2,DPH
SJMP FMMB3
FMMB2 :MOV A,B
CLR C
SUBB A,R1
JNC FMMB3
MOV R1,B
MOV R5,DPL
MOV R4,DPH
FMMB3 :INC DPTR
DJNZ R7,FMMB1
DJNZ R6,FMMB1
RET
;浮点数顺序查找程序
;入口 :R0,R1,R2,R3,R4,R6,R7
;占用资源:B,NCNT,FCMP
;堆栈需求:2字节
;出口 :R0,R1,A
FINDF :MOV DPL,R1
MOV DPH,R0
MOV A,R7
MOV B,A
MOV NCNT,R6
JZ FINDF1
INC NCNT
FINDF1 :MOVX A,@DPTR
INC DPTR
MOV R5,A
MOVX A,@DPTR
INC DPTR
MOV R6,A
MOVX A,@DPTR
INC DPTR
MOV R7,A
LCALL FCMP
JNZ FINDF2
MOV A,DPL
CLR C
SUBB A,#03H
MOV R1,A
MOV A,DPH
SUBB A,#00H
MOV R0,A
CLR A
RET
FINDF2 :DJNZ B,FINDF1
DJNZ NCNT,FINDF1
MOV A,#0FFH
RET
;浮点数最值查找程序
;入口 :ADDPH,ADDPL,R6,R7
;占用资源:ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP
;堆栈需求:5字节
;出口 :[R0](最大值),[R1](最小值),R2,R3,R4,R5
FMAMIF :MOV A,ADDPL
MOV R3,A
MOV R5,A
MOV DPL,A
MOV A,ADDPH
MOV R2,A
MOV R4,A
MOV DPH,A
MOV B,R7
MOV R7,#03H
LCALL ITEMOV
MOV R7,#03H
LCALL IBMOV
MOV A,B
JZ FMMF1
INC NCNT
FMMF1 :PUSH B
MOVX A,@DPTR
INC DPTR
MOV R2,A
MOVX A,@DPTR
INC DPTR
MOV R3,A
MOVX A,@DPTR
INC DPTR
MOV R4,A
LCALL MOVR1
LCALL FCMP
JNC FMMF2
MOV A,R0
XCH A,R1
MOV R0,A
LCALL MOVB
MOV R5,DPL
MOV R4,DPH
MOV A,R0
XCH A,R1
MOV R0,A
SJMP FMMF3
FMMF2 :MOV A,R0
XCH A,R1
MOV R0,A
LCALL MOVR1
LCALL FCMP
MOV A,R0
XCH A,R1
MOV R0,A
JZ FMMF3
JC FMMF3
LCALL MOVB
MOV R3,DPL
MOV R2,DPH
FMMF3 :POP B
DJNZ B,FMMF1
DJNZ NCNT,FMMF1
RET
;单字节折半查找程序
;入口 :A,R0,R1,R6,R7
;占用资源:B,R2
;堆栈需求:2字节
;出口 :R0,R1
SEARCHB :MOV B,A
MOV A,R1
ADD A,R7
MOV R7,A
MOV A,R0
ADDC A,R6
MOV R6,A
MOV A,R7
SUBB A,#01H
MOV R7,A
JNC SECH1
DEC R6
SECH1 :MOV A,R7
CLR C
SUBB A,R1
MOV A,R6
SUBB A,R0
JNC SECH2
MOV A,#0FFH
RET
SECH2 :MOV A,R7
ADD A,R1
MOV R2,A
MOV A,R6
ADDC A,R0
RRC A
MOV DPH,A
MOV A,R2
RRC A
MOV DPL,A
MOVX A,@DPTR
CLR C
SUBB A,B
JNC SECH3
INC DPTR
MOV R0,DPH
MOV R1,DPL
SJMP SECH1
SECH3 :JZ SECH5
MOV A,DPL
SUBB A,#01H
MOV R7,A
JNC SECH4
MOV R6,DPH
DEC R6
SECH4 :SJMP SECH1
SECH5 :MOV R0,DPH
MOV R1,DPL
CLR A
RET
全部0条评论
快来发表一下你的评论吧 !