51单片机的汇编程序库

电子说

1.3w人已加入

描述

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分