0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

51单片机的汇编程序库

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-12-06 17:31 次阅读

下面是一些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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1368

    浏览量

    114599
  • 51单片机
    +关注

    关注

    274

    文章

    5700

    浏览量

    123401
  • 程序
    +关注

    关注

    117

    文章

    3780

    浏览量

    80950
收藏 人收藏

    评论

    相关推荐

    pic单片机汇编程序实例

    以下是一个简单的PIC单片机汇编程序示例,这个程序将实现一个LED闪烁的功能。 首先,我们需要了解PIC单片机的结构和指令集。PIC单片机
    的头像 发表于 12-14 11:01 1839次阅读

    单片机汇编语言程序库

    单片机汇编语言程序库内容有运算子程序,通讯子程序,扩展接口程序,中断服务子
    发表于 01-19 22:39 83次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>汇编</b>语言<b class='flag-5'>程序库</b>

    汇编程序中灵活运用TSRs的程序库

    汇编程序中灵活运用TSRs的程序库
    发表于 02-24 14:43 2次下载

    PIC单片机控制时钟芯片DS1302汇编程序

    PIC单片机控制时钟芯片DS1302汇编程序
    发表于 05-24 09:56 1757次阅读

    EMC系列单片机汇编程序

    本文提供的EMC系列单片机汇编程序,希望对你学习有所帮助!
    发表于 06-03 15:32 33次下载

    51单片机汇编程序

    51单片机汇编程序包。
    发表于 01-06 14:12 16次下载

    51单片机LCD1602汇编程序详细资料免费下载

    1602汇编程序51单片机汇编程序,仅需修改引脚定义即可。晶振大小12M,程序测试完全正确。内部包含写数据、写命令(包括读忙和不读忙)、初
    发表于 08-24 15:24 24次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>LCD1602<b class='flag-5'>汇编程序</b>详细资料免费下载

    51单片机汇编程序有哪些?51单片机汇编程序集详细资料免费下载

    本文档的主要内容详细介绍的是51单片机汇编程序有哪些?51单片机汇编程序集详细资料免费下载。
    发表于 09-06 16:31 55次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>汇编程序</b>有哪些?<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>汇编程序</b>集详细资料免费下载

    51单片机音乐盒梁祝的proteus汇编程序和电路图免费下载

    本文档的主要内容详细介绍的是51单片机音乐盒梁祝的proteus汇编程序和电路图免费下载。
    发表于 02-28 15:51 32次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>音乐盒梁祝的proteus<b class='flag-5'>汇编程序</b>和电路图免费下载

    51单片机内部各个模块的汇编程序免费下载

    本文档的主要内容详细介绍的是51单片机内部各个模块的汇编程序免费下载包括了:
    发表于 08-27 17:29 9次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>内部各个模块的<b class='flag-5'>汇编程序</b>免费下载

    使用51单片机控制数码管的汇编程序免费下载

    本文档的主要内容详细介绍的是使用51单片机控制数码管的汇编程序免费下载。
    发表于 08-14 17:32 11次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b>控制数码管的<b class='flag-5'>汇编程序</b>免费下载

    使用51单片机点亮全部LED的汇编程序免费下载

    本文档的主要内容详细介绍的是使用51单片机点亮全部LED的汇编程序免费下载。
    发表于 07-04 17:41 2次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b>点亮全部LED的<b class='flag-5'>汇编程序</b>免费下载

    DS18B20和51单片机连接的汇编程序免费下载

    汇编程序仅适合单个DS18B20和51单片机的连接,晶振为12MHZ左右
    的头像 发表于 09-06 10:52 4570次阅读

    单片机入门汇编程序--直流电机的单片机控制

    单片机入门汇编程序--直流电机的单片机控制(15kvaups电源技术协议)-该文档为单片机入门汇编程序--直流电机的
    发表于 09-22 14:37 38次下载
    <b class='flag-5'>单片机</b>入门<b class='flag-5'>汇编程序</b>--直流电机的<b class='flag-5'>单片机</b>控制

    51单片机汇编程序,温度报警项目

    51单片机汇编程序,温度报警项目
    发表于 11-21 12:36 19次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>汇编程序</b>,温度报警项目