51单片机汇编程序集
2012-11-26

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:MOVA,R0

MOVR1,A

CLRA

IBC1:MOV@R1,A

INCR1

DJNZR7,IBC1

RET

;片外RAM初始化子程序

EBCLR1:MOVA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

CLRC

EBC11:MOVX@DPTR,A

INCDPTR

DJNZR7,EBC11

RET

;片外RAM初始化子程序(双字节个单元)

EBCLR2:MOVA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

MOVA,R7

JZEBC21

INCR6

EBC21:CLRA

MOVX@DPTR,A

INCDPTR

DJNZR7,EBC21

DJNZR6,EBC21

RET

;内部RAM数据复制程序

;入口:R0,R7

;占用资源:A

;堆栈需求:2字节

;出口:R1

IBMOV:MOVA,R0

ADDA,R7

MOVR0,A

MOVA,R1

ADDA,R7

MOVR1,A

IBM1:DECR0

DECR1

MOVA,@R0

MOV@R1,A

DJNZR7,IBM1

RET

;外部RAM数据复制程序

;入口:ADDPH,ADDPL,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R0,R1

EBMOV1:MOVA,ADDPL

ADDA,R7

MOVDPL,A

CLRA

ADDCA,ADDPH

MOVDPH,A

MOVA,R7

ADDA,R1

XCHA,R0

ADDCA,#00H

MOVP2,A

EBM11:DECR0

CJNER0,#0FFH,EBM12

DECP2

EBM12:DECDPL

MOVA,DPL

CJNEA,#0FFH,EBM13

DECDPH

EBM13:MOVXA,@R0

MOVX@DPTR,A

DJNZR7,EBM11

RET

;外部RAM数据复制程序

;入口:ADDPH,ADDPL,R6,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R0,R1

EBMOV2:MOVA,ADDPL

ADDA,R7

MOVDPL,A

MOVA,R6

ADDCA,ADDPH

MOVDPH,A

MOVA,R7

ADDA,R1

XCHA,R0

ADDCA,R6

MOVP2,A

MOVA,R7

JZEBM21

INCR6

EBM21:DECR0

CJNER0,#0FFH,EBM22

DECP2

EBM22:DECDPL

MOVA,DPL

CJNEA,#0FFH,EBM23

DECDPH

EBM23:MOVXA,@R0

MOVX@DPTR,A

DJNZR7,EBM21

DJNZR6,EBM21

RET

;外部RAM数据复制到内部RAM程序

;入口:ADDPH,ADDPL,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R0

ITEMOV:MOVA,ADDPL

ADDA,R7

MOVDPL,A

MOVA,ADDPH

ADDCA,#00H

MOVDPH,A

MOVA,R0

ADDA,R7

MOVR0,A

ITEM1:DECR0

DECDPL

MOVA,DPL

CJNEA,#0FFH,ITEM2

DECDPH

ITEM2:MOVXA,@DPTR

MOV@R0,A

DJNZR7,ITEM1

RET

;限幅滤波程序

;入口:A,SDAT,DELTY

;占用资源:B

;堆栈需求:2字节

;出口:A

JUGFILT:MOVB,A

CLRC

SUBBA,SDAT

JNCJUGFT1

CPLA

INCA

JUGFT1:SETBA

SUBBA,#DELTY

JNCJUGFT3

MOVA,SDAT

RET

JUGFT3:MOVA,B

MOVSDAT,A

RET

;中位值滤波程序

;入口:ADDPH,ADDPL,N

;占用资源:ESELSORT

;堆栈需求:4字节

;出口:A

MEDFILT:LCALLESELSORT

MOVA,N

CLRC

RRCA

ADDA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

JNCMEDFT1

INCDPH

MEDFT1:MOVXA,@DPTR

RET

;N点算术平均滤波

;入口:ADDPH,ADDPL,N

;占用资源:B,R3,R4

;堆栈需求:2字节

;出口:A

AVFILT:MOVA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

CLRA

MOVR3,A

MOVR4,A

MOVR7,N

AVFT1:MOVXA,@DPTR

INCDPTR

ADDA,R4

MOVR4,A

JNCAVFT2

INCR3

AVFT2:DJNZR7,AVFT1

MOVR7,N

MOVR2,#00H

LCALLNDIV31

MOVA,R4

RET

;N点加权平均滤波

;入口:ADDPH,ADDPL,N

;占用资源:B,R3,R4

;堆栈需求:2字节

;出口:A

QAVFILT:CLRA

MOVR3,A

MOVR4,A

MOVR7,N

MOVP2,ADDPH

MOVR1,ADDPL

MOVDPTR,#QAVTAB

QAVFT1:MOVCA,@A+DPTR

MOVB,A

MOVXA,@R1

INCDPTR

INCR1

MULAB

ADDA,R4

MOVR4,A

MOVA,B

ADDCA,R3

MOVR3,A

DJNZR7,QAVFT1

MOVA,R4

JNBACC.7,QAVFT2

INCR3

QAVFT2:MOVA,R3

RET

QAVTAB:DB

;一阶加权滞后滤波程序

;入口:A,DELTY

;占用资源:B,R3,R4

;堆栈需求:2字节

;出口:A

BQFILT:MOVB,A

CLRA

MOVDPTR,#ABTAB

MOVCA,@A+DPTR

MULAB

MOVR4,A

MOVR3,B

MOVA,#01H

MOVCA,@A+DPTR

MOVB,DELTY

MULAB

ADDA,R4

MOVR4,A

MOVA,B

ADDCA,R3

MOVR3,A

MOVA,R4

JNBACC.7,FT1

INCR3

FT1:MOVA,R3

MOVDELTY,A

RET

BQTAB:DB80H,80H

;双字节取补程序 /(R3R4)=(R3R4)

;入口:R3,R4

;占用资源:ACC

;堆栈需求:2字节

;出口:R3,R4

CMPT:MOVA,R4

CPLA

ADDA,#01H

MOVR4,A

MOVA,R3

CPLA

ADDCA,#00H

MOVR3,A

RET

;N节取补程序 /([R0])=([R0])

;入口:R0,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0

NCMPTN:MOVB,R0

SETBC

NCPT1:MOVA,@R0

CPLA

ADDCA,#00H

MOV@R0,A

INCR0

DJNZR7,NCPT1

MOVR0,B

RET

;双字节无符号数加法程序 (R3R4+R6R7)=(R3R4)

;入口:R3,R4,R6,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R3,R4,CF

NADD:MOVA,R4

ADDA,R7

MOVR4,A

MOVA,R3

ADDCA,R6

MOVR3,A

RET

;N字节无符号数加法程序 ([R0]+[R1])=([R0])

;入口:R0,R1,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0,CF

NADDN:MOVB,R0

CLRC

NADN1:MOVA,@R0

ADDCA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NADN1

MOVR0,B

RET

;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)

;入口:R3,R4,R6,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R3,R4

NSUB:MOVA,R4

CLRC

SUBBA,R7

MOVR4,A

MOVA,R3

SUBBA,R6

MOVR3,A

RET

;N字节无符号数减法程序 ([R0]-[R1])=([R0])

;入口:R0,R1,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0,CF

NSUBN:MOVB,R0

MOVR7,N

CLRC

NSUBN1:MOVA,@R0

SUBBA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NSUBN1

MOVR0,B

RET

;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)

;入口:R3,R4,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R2,R3,R4

NMUL21:MOVA,R4

MOVB,R7

MULAB

MOVR4,A

MOVA,B

XCHA,R3

MOVB,R7

MULAB

ADDA,R3

MOVR3,A

CLRA

ADDCA,B

MOVR2,A

CLROV

RET

;单字节无符号数乘法程序 (R2R3R4*R7)=(R5R2R3R4)

;入口:R2,R3,R4,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R5,R2,R3,R4

NMUL31:MOVA,R4

MOVB,R7

MULAB

MOVR4,A

MOVA,B

XCHA,R3

MOVB,R7

MULAB

ADDA,R3

MOVR3,A

CLRA

ADDCA,B

XCHA,R2

MOVB,R7

MULAB

ADDA,R2

MOVR2,A

CLRA

ADDCA,B

MOVR5,A

CLROV

RET

;单字节无符号数乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)

;入口:R5,R2,R3,R4,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R7,R5,R2,R3,R4

NMUL41:MOVA,R4

MOVB,R7

MULAB

MOVR4,A

MOVA,B

XCHA,R3

MOVB,R7

MULAB

ADDA,R3

MOVR3,A

CLRA

ADDCA,B

XCHA,R2

MOVB,R7

MULAB

ADDA,R2

MOVR2,A

CLRA

ADDCA,B

XCHA,R5

MOVB,R7

MULAB

ADDA,R5

MOVR5,A

CLRA

ADDCA,B

MOVR7,A

CLROV

RET

;双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4)

;入口:R3,R4,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R5,R2,R3,R4

NMUL22:MOVA,R4

MOVB,R7

MULAB

XCHA,R4

MOVR5,B

MOVB,R6

MULAB

ADDA,R5

MOVR5,A

CLRA

ADDCA,B

MOVR2,A

MOVA,R3

MOVB,R7

MULAB

ADDA,R5

MOVR5,A

MOVA,B

ADDCA,R2

MOVR2,A

CLRA

ADDCA,#00H

XCHA,R3

MOVB,R6

MULAB

ADDA,R2

MOVR2,A

MOVA,B

ADDCA,R3

XCHA,R5

MOVR3,A

CLROV

RET

;双字节无符号数乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)

;入口:R2,R3,R4,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R1,R5,R2,R3,R4

NMUL32:MOVA,R4

MOVB,R7

MULAB

XCHA,R4

MOVR5,B

MOVB,R6

MULAB

ADDA,R5

MOVR5,A

CLRA

ADDCA,B

MOVR1,A

MOVA,R3

MOVB,R7

MULAB

ADDA,R5

MOVR5,A

MOVA,B

ADDCA,R1

MOVR1,A

CLRA

ADDCA,#00H

XCHA,R3

MOVB,R6

MULAB

ADDA,R1

MOVR1,A

MOVA,B

ADDCA,R3

XCHA,R5

MOVR3,A

MOVA,R2

MOVB,R7

MULAB

ADDA,R1

MOVR1,A

MOVA,B

ADDCA,R5

MOVR5,A

CLRA

ADDCA,#00H

XCHA,R2

MOVB,R6

MULAB

ADDA,R5

MOVR5,A

MOVA,B

ADDCA,R2

XCHA,R1

MOVR2,A

CLROV

RET

;N字节无符号数乘法程序 ([R0]*[R1])=([R0])

;入口:R0,R1,M,N

;占用资源:ACC,B,R2,R5,R6,R7,NCNT

;堆栈需求:2字节

;出口:R0

NMULMN:MOVA,M

ADDA,R0

MOVR5,A

XCHA,R1

XCHA,R5

ADDA,N

XCHA,R0

MOVR6,A

MOVB,M

MOVNCNT,B

NMLMN1:DECR0

DECR1

CLRA

XCHA,@R1

MOV@R0,A

DJNZNCNT,NMLMN1

MOVNCNT,B

NMLMN2:CLRA

XCHA,@R0

MOVR2,A

MOVA,R6

MOVR0,A

MOVA,R5

MOVR1,A

MOVR7,N

CLRC

NMLMN3:MOVA,R2

MOVB,@R1

INCR1

MULAB

ADDCA,@R0

MOV@R0,A

INCR0

MOVA,B

ADDCA,@R0

MOV@R0,A

DJNZR7,NMLMN3

INCR0

INCR6

DJNZNCNT,NMLMN2

MOVA,R0

CLRC

SUBBA,M

SUBBA,N

MOVR0,A

RET

;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7

;入口:R2,R3,R4,R7

;占用资源:ACC,B,F0

;堆栈需求:3字节

;出口:(R2),R3,R4,R7,OV

NDIV31:MOVA,R2

MOVB,R7

DIVAB

PUSHA

MOVR2,B

MOVB,#10H

NDV311:CLRC

MOVA,R4

RLCA

MOVR4,A

MOVA,R3

RLCA

MOVR3,A

MOVA,R2

RLCA

MOVR2,A

MOVF0,C

CLRC

SUBBA,R7

JBF0,NDV312

JCNDV313

NDV312:MOVR2,A

INCR4

NDV313:DJNZB,NDV311

POPA

CLROV

JZNDV314

SETBOV

NDV314:XCHA,R2

MOVR7,A

RET

;单字节无符号除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余数R7

;入口:R2,R3,R4,R7

;占用资源:ACC,B,F0

;堆栈需求:3字节

;出口:(R5),R2,R3,R4,R7,OV

NDIV41:MOVA,R5

MOVB,R7

DIVAB

PUSHA

MOVR5,B

MOVB,#18H

NDV411:CLRC

MOVA,R4

RLCA

MOVR4,A

MOVA,R3

RLCA

MOVR3,A

MOVA,R2

RLCA

MOVR2,A

MOVA,R5

RLCA

MOVR5,A

MOVF0,C

CLRC

SUBBA,R7

JBF0,NDV412

JCNDV413

NDV412:MOVR5,A

INCR4

NDV413:DJNZB,NDV411

POPA

CLROV

JZNDV414

SETBOV

NDV414:XCHA,R5

MOVR7,A

RET

;双字节无符号除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余数R6R7

;入口:R5,R2,R3,R4,R6,R7

;占用资源:ACC,B,F0

;堆栈需求:4字节

;出口:(R2),R3,R4,R6,R7,OV

NDIV42:MOVA,R1

PUSHA

MOVB,#00H

NDV421:MOVA,R2

CLRC

SUBBA,R7

MOVR1,A

MOVA,R5

SUBBA,R6

JCNDV422

MOVR5,A

MOVA,R1

MOVR2,A

INCB

SJMPNDV421

NDV422:PUSHB

MOVB,#10H

NDV423:CLRC

MOVA,R4

RLCA

MOVR4,A

MOVA,R3

RLCA

MOVR3,A

MOVA,R2

RLCA

MOVR2,A

XCHA,R5

RLCA

XCHA,R5

MOVF0,C

CLRC

SUBBA,R7

MOVR1,A

MOVA,R5

SUBBA,R6

JBF0,NCV424

JCNDV425

NCV424:MOVR5,A

MOVA,R1

MOVR2,A

INCR4

NDV425:DJNZB,NDV423

POPA

CLROV

JNZNDV426

SETBOV

NDV426:XCHA,R2

MOVR7,A

MOVA,R5

MOVR6,A

POPA

MOVR1,A

RET

;N字节无符号除法程序(组合) ([R0]/[R1])=([R0])

;入口:R0,R1,M,N

;占用资源:ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN

;堆栈需求:4字节

;出口:R0

;NDIVMN:MOVA,M

CLRC

SUBBA,N

MOVNCNT,A

ADDA,R0

MOVR4,A

XCHA,R0

MOVR3,A

MOVA,R1

MOVR5,A

MOVR2,#00H

NDVMN1:MOVR7,N

LCALLNSUBN

MOVA,R5

MOVR1,A

JCNDVMN2

INCR2

SJMPNDVMN1

NDVMN2:MOVR7,N

LCALLNADDN

MOVA,NCNT

SWAPA

RRA

MOVNCNT,A

NDVMN3:MOVA,R3

MOVR0,A

MOVR7,M

LCALLNRLCN

MOVF0,C

MOVA,R4

MOVR0,A

MOVA,R5

MOVR1,A

MOVR7,N

LCALLNSUBN

JBF0,NDVMN4

JCNDVMN5

NDVMN4:MOVA,R3

MOVR0,A

INC@R0

SJMPNDVMN6

NDVMN5:MOVA,R5

MOVR1,A

MOVR7,N

LCALLNADDN

NDVMN6:DJNZNCNT,NDVMN3

MOVA,R4

MOVR1,A

MOVA,R2

MOV@R1,A

MOVA,R3

MOVR0,A

RET

;N字节无符号除法程序(集成) ([R0]/R[1])=([R0])

;入口:R0,R1,M,N

;占用资源:ACC,R2,R3,R4,R5,R7,F0

;堆栈需求:2字节

;出口:R0

NDIVMN:MOVA,M

CLRC

SUBBA,N

MOVB,A

ADDA,R0

MOVR4,A

XCHA,R0

MOVR3,A

MOVA,R1

MOVR5,A

MOVR2,#00H

NDVMN1:MOVR7,N

CLRC

NDVMN2:MOVA,@R0

SUBBA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NDVMN2

MOVA,R4

MOVR0,A

MOVA,R5

MOVR1,A

JCNDVMN3

INCR2

SJMPNDVMN1

NDVMN3:MOVR7,N

CLRC

NDVMN4:MOVA,@R0

ADDCA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NDVMN4

MOVA,#08H

MULAB

MOVB,A

NDVMN5:MOVA,R3

MOVR0,A

MOVR7,M

CLRC

NDVMN6:MOVA,@R0

RLCA

MOV@R0,A

INCR0

DJNZR7,NDVMN6

MOVF0,C

MOVA,R4

MOVR0,A

MOVA,R5

MOVR1,A

MOVR7,N

CLRC

NDVMN7:MOVA,@R0

SUBBA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NDVMN7

JBF0,NDVMNB

JCNDVMN8

NDVMNB:MOVA,R3

MOVR0,A

INC@R0

SJMPNDVMNA

NDVMN8:MOVR7,N

MOVA,R4

MOVR0,A

MOVA,R5

MOVR1,A

CLRC

NDVMN9:MOVA,@R0

ADDCA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NDVMN9

NDVMNA:DJNZB,NDVMN5

MOVA,M

CLRC

SUBBA,N

ADDA,R3

MOVR1,A

MOVA,R2

MOV@R1,A

MOVA,R3

MOVR0,A

RET

;N字节数据左移程序 RLC([R0])=(CF[R0])

;入口:R0,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0,CF

NRLCN:MOVB,R0

CLRC

NRLN1:MOVA,@R0

RLCA

MOV@R0,A

INCR0

DJNZR7,NRLN1

MOVR0,B

RET

;原码有符号双字节减法程序 (R3R4-R6R7)=R3R4

;入口:R3,R4,R6,R7

;占用资源:ACC,DADD

;堆栈需求:6字节

;出口:R3,R4,OV

DSUB:MOVA,R6

CPLACC.7

MOVR6,A

LCALLDADD

RET

;原码有符号双字节加法程序 (R3R4+R6R7)=R3R4

;入口:R3,R4,R6,R7

;占用资源:ACC,SR0,NADD,NSUB,CMPT

;堆栈需求:4字节

;出口:R3,R4,OV

DADD:MOVA,R3

MOVC,ACC.7

MOVSR0,C

XRLA,R6

MOVC,ACC.7

MOVA,R3

CLRACC.7

MOVR3,A

MOVA,R6

CLRACC.7

MOVR6,A

JCDAB2

LCALLNADD

MOVA,R3

JBACC.7,DABE

DAB1:MOVC,SR0

MOVACC.7,C

MOVR3,A

CLROV

RET

DABE:SETBOV

RET

DAB2:LCALLNSUB

MOVA,R3

JNBACC.7,DAB1

LCALLCMPT

CPLSR0

SJMPDAB1

;原码有符号双字节乘法程序 (R3R4*R6R7)=(R5R2R3R4)

;入口:R3,R4,R6,R7

;占用资源:ACC,SR0,NMUL22

;堆栈需求:4字节

;出口:R5,R2,R3,R4

IMUL:MOVA,R3

XRLA,R6

MOVC,ACC.7

MOVSR0,C

MOVA,R3

CLRACC.7

MOVR3,A

MOVA,R6

CLRACC.7

MOVR6,A

LCALLNMUL22

MOVA,R5

MOVC,SR0

MOVACC.7,C

MOVR5,A

RET

;原码有符号双字节除法程序 (R5R2R3R4/R6R7)=(R3R4) 余数(R6R7)

;入口:R5,R2,R3,R4

;占用资源:ACC,SR0,NDIV42

;堆栈需求:6字节

;出口:R3,R4,R6,R7,OV

IDIV:MOVA,R5

XRLA,R6

MOVC,ACC.7

MOVSR0,C

MOVA,R5

CLRACC.7

MOVR5,A

MOVA,R6

CLRACC.7

MOVR6,A

LCALLNDIV42

MOVA,R3

JBACC.7,IDIVE

JBOV,IDIVE

MOVC,SR0

MOVACC.7,C

MOVR3,A

RET

IDIVE:SETBOV

RET

;单字节顺序查找程序

;入口:R0,R1,A,R7

;占用资源:B

;堆栈需求:2字节

;出口:R0,R1,A

FINDB1:MOVB,A

MOVDPL,R1

MOVDPH,R0

FINDB11:MOVXA,@DPTR

CJNEA,B,FINDB12

MOVR1,DPL

MOVR0,DPH

CLRA

RET

FINDB12:INCDPTR

DJNZR7,FINDB11

MOVA,#0FFH

RET

;单字节顺序查找程序

;入口:R0,R1,A,R6,R7

;占用资源:B

;堆栈需求:2字节

;出口:R0,R1,A

FINDB2:MOVB,A

MOVDPL,R1

MOVDPH,R0

MOVA,R7

JZFINDB21

INCR6

FINDB21:MOVXA,@DPTR

CJNEA,B,FINDB22

MOVR1,DPL

MOVR0,DPH

CLRA

RET

FINDB22:INCDPTR

DJNZR7,FINDB21

DJNZR6,FINDB21

MOVA,#0FFH

RET

;双字节字符串顺序查找程序

;入口:R0,R1,R3,R4,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0,R1,A

FINDS1:MOVDPL,R1

MOVDPH,R0

FINDS11:MOVXA,@DPTR

INCDPTR

CLRC

SUBBA,R4

JNZFINDS12

MOVXA,@DPTR

SUBBA,R3

JNZFINDS12

MOVA,DPL

CLRC

SUBBA,#01H

MOVR1,A

MOVA,DPH

SUBBA,#00H

MOVR0,A

CLRA

RET

FINDS12:DJNZR7,FINDS11

MOVA,#0FFH

RET

;双字节字符串顺序查找程序

;入口:R0,R1,R3,R4,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0,R1,A

FINDS2:MOVDPL,R1

MOVDPH,R0

MOVA,R7

JZFINDS21

INCR6

FINDS21:MOVXA,@DPTR

INCDPTR

CLRC

SUBBA,R4

JNZFINDS22

MOVXA,@DPTR

SUBBA,R3

JNZFINDS22

MOVA,DPL

CLRC

SUBBA,#01H

MOVR1,A

MOVA,DPH

SUBBA,#00H

MOVR0,A

CLRA

RET

FINDS22:DJNZR7,FINDS21

DJNZR6,FINDS21

MOVA,#0FFH

RET

;N字节字符串顺序查找程序

;入口:ADDPH,ADDPL,R0,R6,R7,N

;占用资源:ACC,B,R2,NCNT

;堆栈需求:2字节

;出口:ADDPH,ADDPL,A

FINDN:MOVA,R0

MOVR2,A

MOVA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

MOVA,R7

JZFINDN1

INCR6

FINDN1:MOVA,R2

MOVR0,A

MOVA,N

MOVNCNT,A

FINDN2:MOVXA,@DPTR

CLRC

SUBBA,@R0

JNZFINDN3

INCDPTR

INCR0

DJNZNCNT,FINDN2

MOVA,DPL

CLRC

SUBBA,N

MOVADDPL,A

MOVA,DPH

SUBBA,#00H

MOVADDPH,A

CLRA

RET

FINDN3:CLRC

MOVA,R0

SUBBA,R2

JNZFINDN4

INCDPTR

FINDN4:DJNZR7,FINDN1

DJNZR6,FINDN1

MOVA,#0FFH

RET

;单字节最值查找程序

;入口:R0,R1,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0(最大值),R1(最小值),R2,R3,R4,R5

FMAMIB:MOVDPL,R1

MOVDPH,R0

MOVXA,@DPTR

MOVR0,A

MOVR1,A

MOVA,DPL

MOVR3,A

MOVR5,A

MOVA,DPH

MOVR2,A

MOVR4,A

MOVA,R7

JZFMMB1

INCR6

FMMB1:MOVXA,@DPTR

MOVB,A

SETBC

SUBBA,R0

JCFMMB2

MOVR0,B

MOVR3,DPL

MOVR2,DPH

SJMPFMMB3

FMMB2:MOVA,B

CLRC

SUBBA,R1

JNCFMMB3

MOVR1,B

MOVR5,DPL

MOVR4,DPH

FMMB3:INCDPTR

DJNZR7,FMMB1

DJNZR6,FMMB1

RET

;浮点数顺序查找程序

;入口:R0,R1,R2,R3,R4,R6,R7

;占用资源:B,NCNT,FCMP

;堆栈需求:2字节

;出口:R0,R1,A

FINDF:MOVDPL,R1

MOVDPH,R0

MOVA,R7

MOVB,A

MOVNCNT,R6

JZFINDF1

INCNCNT

FINDF1:MOVXA,@DPTR

INCDPTR

MOVR5,A

MOVXA,@DPTR

INCDPTR

MOVR6,A

MOVXA,@DPTR

INCDPTR

MOVR7,A

LCALLFCMP

JNZFINDF2

MOVA,DPL

CLRC

SUBBA,#03H

MOVR1,A

MOVA,DPH

SUBBA,#00H

MOVR0,A

CLRA

RET

FINDF2:DJNZB,FINDF1

DJNZNCNT,FINDF1

MOVA,#0FFH

RET

;浮点数最值查找程序

;入口:ADDPH,ADDPL,R6,R7

;占用资源:ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP

;堆栈需求:5字节

;出口:[R0](最大值),[R1](最小值),R2,R3,R4,R5

FMAMIF:MOVA,ADDPL

MOVR3,A

MOVR5,A

MOVDPL,A

MOVA,ADDPH

MOVR2,A

MOVR4,A

MOVDPH,A

MOVB,R7

MOVR7,#03H

LCALLITEMOV

MOVR7,#03H

LCALLIBMOV

MOVA,B

JZFMMF1

INCNCNT

FMMF1:PUSHB

MOVXA,@DPTR

INCDPTR

MOVR2,A

MOVXA,@DPTR

INCDPTR

MOVR3,A

MOVXA,@DPTR

INCDPTR

MOVR4,A

LCALLMOVR1

LCALLFCMP

JNCFMMF2

MOVA,R0

XCHA,R1

MOVR0,A

LCALLMOVB

MOVR5,DPL

MOVR4,DPH

MOVA,R0

XCHA,R1

MOVR0,A

SJMPFMMF3

FMMF2:MOVA,R0

XCHA,R1

MOVR0,A

LCALLMOVR1

LCALLFCMP

MOVA,R0

XCHA,R1

MOVR0,A

JZFMMF3

JCFMMF3

LCALLMOVB

MOVR3,DPL

MOVR2,DPH

FMMF3:POPB

DJNZB,FMMF1

DJNZNCNT,FMMF1

RET

;单字节折半查找程序

;入口:A,R0,R1,R6,R7

;占用资源:B,R2

;堆栈需求:2字节

;出口:R0,R1

SEARCHB:MOVB,A

MOVA,R1

ADDA,R7

MOVR7,A

MOVA,R0

ADDCA,R6

MOVR6,A

MOVA,R7

SUBBA,#01H

MOVR7,A

JNCSECH1

DECR6

SECH1:MOVA,R7

CLRC

SUBBA,R1

MOVA,R6

SUBBA,R0

JNCSECH2

MOVA,#0FFH

RET

SECH2:MOVA,R7

ADDA,R1

MOVR2,A

MOVA,R6

ADDCA,R0

RRCA

MOVDPH,A

MOVA,R2

RRCA

MOVDPL,A

MOVXA,@DPTR

CLRC

SUBBA,B

JNCSECH3

INCDPTR

MOVR0,DPH

MOVR1,DPL

SJMPSECH1

SECH3:JZSECH5

MOVA,DPL

SUBBA,#01H

MOVR7,A

JNCSECH4

MOVR6,DPH

DECR6

SECH4:SJMPSECH1

SECH5:MOVR0,DPH

MOVR1,DPL

CLRA

RET

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号