⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 MCS-51定点运算子程序库及其使用说明.txt

📁 MCS-51定点运算子程序库及其使用说明 对这方面不了解的朋友可以看哈
💻 TXT
📖 第 1 页 / 共 3 页
字号:
	MOV	R5,A	;也作为最小值存放地址的初始值
	MOV	A,DPH
	MOV	R2,A
	MOV	R4,A

MOV	A,B	;取数据个数
	DEC	A	;减一,得到需要比较的次数
	JZ	MME	;只有一个数据,不需要比较
	MOV	R1,A	;保存比较次数
	PUSH	DPL	;保护数据块的首址
	PUSH	DPH
MM1:	INC	DPTR	;指向一个新的数据
	MOVX	A,@DPTR	;读取这个数据
	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	;处理完全部数据
	POP	DPH	;恢复数据首址
	POP	DPL
MME:	RET

    (25)  标号:  MMS    功能:求单字节十六进制有符号数据块的极值

入口条件:数据块的首址在DPTR中,数据个数在R7中。
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
影响资源:PSW、A、B、R1~R7    堆栈需求:  4字节

MMS:	MOV	B,R7	;保存数据个数
	MOVX	A,@DPTR	;读取第一个数据
	MOV	R6,A	;作为最大值的初始值
	MOV	R7,A	;也作为最小值的初始值
	MOV	A,DPL	;取第一个数据的地址
	MOV	R3,A	;作为最大值存放地址的初始值
	MOV	R5,A	;也作为最小值存放地址的初始值
	MOV	A,DPH
	MOV	R2,A
	MOV	R4,A
	MOV	A,B	;取数据个数
	DEC	A	;减一,得到需要比较的次数
	JZ	MMSE	;只有一个数据,不需要比较
	MOV	R1,A	;保存比较次数
	PUSH	DPL	;保护数据块的首址
	PUSH	DPH

MMS1:	INC	DPTR	;调整数据指针
	MOVX	A,@DPTR	;读取一个数据
	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	;处理完全部数据
	POP	DPH	;恢复数据首址
	POP	DPL
MMSE:	RET 	
 	
    (26)  标号:  FDS1    功能:顺序查找(ROM)单字节表格

入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。
出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。
影响资源:PSW、A、B、R2、R6      堆栈需求:  2字节

FDS1:	MOV	B,A	;保存待查找的内容

MOV	R2,#0	;顺序号初始化(指向表首)
	MOV	A,R7	;保存表格的长度
	MOV	R6,A
FD11:	MOV	A,R2	;按顺序号读取表格内容
	MOVC	A,@A+DPTR
	CJNE	A,B,FD12;与待查找的内容比较
	CLR	OV	;相同,查找成功
	MOV	A,R2	;取对应的顺序号
	RET	
FD12:	INC	R2	;指向表格中的下一个内容
	DJNZ	R6,FD11	;查完全部表格内容
	SETB	OV	;未查找到,失败
	RET

    (27)  标号:  FDS2    功能:顺序查找(ROM)双字节表格

入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据总个数在R7中。

出口信息:OV=0时顺序号在累加器A中,地址在DPTR中;OV=1时未找到。
影响资源:PSW、A、R2、R6、DPTR    堆栈需求:  2字节

FDS2:	MOV	A,R7	;保存表格中数据的个数
	MOV	R6,A
	MOV	R2,#0	;顺序号初始化(指向表首)
FD21:	CLR	A	;读取表格内容的高字节
	MOVC	A,@A+DPTR
	XRL	A,R4	;与待查找内容的高字节比较
	JNZ	FD22
	MOV	A,#1	;读取表格内容的低字节
	MOVC	A,@A+DPTR
	XRL	A,R5	;与待查找内容的低字节比较
	JNZ	FD22
	CLR	OV	;相同,查找成功
	MOV	A,R2	;取对应的顺序号

RET 	
FD22:	INC	DPTR	;指向下一个数据
	INC	DPTR
	INC	R2	;顺序号加一
	DJNZ	R6,FD21	;查完全部数据
	SETB	OV	;未查找到,失败
	RET

    (28)  标号:FDD1  功能:对分查找(ROM)单字节无符号增序数据表格

入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。
出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。
影响资源:PSW、A、B、R2、R3、R4      堆栈需求:  2字节

FDD1:	MOV	B,A	;保存待查找的内容
	MOV	R2,#0	;区间低端指针初始化(指向第一个数据)

MOV	A,R7
	DEC	A
	MOV	R3,A	;区间高端指针初始化(指向最后一个数据)
FD61:	CLR	C	;判断区间大小
	MOV	A,R3
	SUBB	A,R2
	JC	FD69	;区间消失,查找失败
	RRC	A	;取区间大小的一半
	ADD	A,R2	;加上区间的低端
	MOV	R4,A	;得到区间的中心
	MOVC	A,@A+DPTR;读取该点的内容
	CJNE	A,B,FD65;与待查找的内容比较
	CLR	OV	;相同,查找成功
	MOV	A,R4	;取顺序号
	RET 	
FD65:	JC	FD68	;该点的内容比待查找的内容大否?
	MOV	A,R4	;偏大,取该点位置

DEC	A	;减一
	MOV	R3,A	;作为新的区间高端
	SJMP	FD61	;继续查找
FD68:	MOV	A,R4	;偏小,取该点位置
	INC	A	;加一
	MOV	R2,A	;作为新的区间低端
	SJMP	FD61	;继续查找
FD69:	SETB	OV	;查找失败
	RET
 	
    (29)  标号:FDD2  功能:对分查找(ROM)双字节无符号增序数据表格

入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据个数在R7中。
出口信息:OV=0 时顺序号在累加器A中,址在DPTR中;OV=1 时未找到。
影响资源:PSW、A、B、R1~R7、DPTR    堆栈需求:  2字节

FDD2:	MOV	R2,#0	;区间低端指针初始化(指向第一个数据)
	MOV	A,R7
	DEC	A
	MOV	R3,A	;区间高端指针初始化,指向最后一个数据
	MOV	R6,DPH	;保存表格首址
	MOV	R7,DPL
FD81:	CLR	C	;判断区间大小
	MOV	A,R3
	SUBB	A,R2
	JC	FD89	;区间消失,查找失败
	RRC	A	;取区间大小的一半
	ADD	A,R2	;加上区间的低端
	MOV	R1,A	;得到区间的中心
	MOV	DPH,R6
	CLR	C	;计算区间中心的地址
	RLC	A
	JNC	FD82
	INC	DPH
FD82:	ADD	A,R7
	MOV	DPL,A

JNC	FD83
	INC	DPH
FD83:	CLR	A	;读取该点的内容的高字节
	MOVC	A,@A+DPTR
	MOV	B,R4	;与待查找内容的高字节比较
	CJNE	A,B,FD84;不相同
	MOV	A,#1	;读取该点的内容的低字节
	MOVC	A,@A+DPTR
	MOV	B,R5
	CJNE	A,B,FD84;与待查找内容的低字节比较
	MOV	A,R1	;取顺序号
	CLR	OV	;查找成功
	RET
FD84:	JC	FD86	;该点的内容比待查找的内容大否?
	MOV	A,R1	;偏大,取该点位置
	DEC	A	;减一
	MOV	R3,A	;作为新的区间高端
	SJMP	FD81	;继续查找

FD86:	MOV	A,R1	;偏小,取该点位置
	INC	A	;加一
	MOV	R2,A	;作为新的区间低端
	SJMP	FD81	;继续查找
FD89:	MOV	DPH,R6	;相同,恢复首址
	MOV	DPL,R7
	SETB	OV	;查找失败
	RET


    (30)  标号:  DDM1    功能:求单字节十六进制无符号数据块的平均值

入口条件:数据块的首址在DPTR中,数据个数在R7中。
出口信息:平均值在累加器A中。
影响资源:PSW、A、R2~R6  堆栈需求:  4字节

DDM1:	MOV	A,R7	;保存数据个数
	MOV	R2,A
	PUSH	DPH
	PUSH	DPL

CLR	A	;初始化累加和
	MOV	R4,A
	MOV	R5,A
DM11:	MOVX	A,@DPTR	;读取一个数据
	ADD	A,R5	;累加到累加和中
	MOV	R5,A
	JNC	DM12
	INC	R4
DM12:	INC	DPTR	;调整指针
	DJNZ	R2,DM11	;累加完全部数据
	LCALL	D457	;求平均值(R4R5/R7-→R3)
	MOV	A,R3	;取平均值
	POP	DPL
	POP	DPH
	RET

    (31)  标号:  DDM2    功能:求双字节十六进制无符号数据块的平均值

入口条件:数据块的首址在DPTR中,双字节数据总个数在R7中。
出口信息:平均值在R4、R5中。

影响资源:PSW、A、R2~R6      堆栈需求:  4字节

DDM2:	MOV	A,R7	;保存数据个数
	MOV	R2,A	;初始化数据指针
	PUSH	DPL	;保持首址
	PUSH	DPH
	CLR	A	;初始化累加和
	MOV	R3,A
	MOV	R4,A
	MOV	R5,A
DM20:	MOVX	A,@DPTR	;读取一个数据的高字节
	MOV	B,A
	INC	DPTR
	MOVX	A,@DPTR	;读取一个数据的低字节
	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	;累加完全部数据

POP	DPH	;恢复首址
	POP	DPL
	LJMP	DV31	;求R3R4R5/R7-→R4R5,得到平均值

    (32)  标号:  XR1    功能:求单字节数据块的(异或)校验和

入口条件:数据块的首址在DPTR中,数据的个数在R6、R7中。
出口信息:校验和在累加器A中。
影响资源:PSW、A、B、R4~R7  堆栈需求:  2字节

XR1:	MOV	R4,DPH	;保存数据块的首址
	MOV	R5,DPL
	MOV	A,R7	;双字节计数器调整
	JZ	XR10
	INC	R6
XR10:	MOV	B,#0	;校验和初始化
XR11:	MOVX	A,@DPTR	;读取一个数据

XRL	B,A	;异或运算
	INC	DPTR	;指向下一个数据
	DJNZ	R7,XR11	;双字节计数器减一
	DJNZ	R6,XR11
	MOV	DPH,R4	;恢复数据首址
	MOV	DPL,R5
	MOV	A,B	;取校验和
	RET

    (33)  标号:  XR2    功能:求双字节数据块的(异或)校验和

入口条件:数据块的首址在DPTR中,双字节数据总个数在R6、R7中。
出口信息:校验和在R2、R3中。
影响资源:PSW、A、R2~R7      堆栈需求:  2字节

XR2:	MOV	R4,DPH	;保存数据块的首址
	MOV	R5,DPL
	MOV	A,R7	;双字节计数器调整

JZ	XR20
	INC	R6
XR20:	CLR	A	;校验和初始化
	MOV	R2,A
	MOV	R3,A
XR21:	MOVX	A,@DPTR	;读取一个数据的高字节
	XRL	A,R2	;异或运算
	MOV	R2,A
	INC	DPTR
	MOVX	A,@DPTR	;读取一个数据的低字节
	XRL	A,R3	;异或运算
	MOV	R3,A
	INC	DPTR	;指向下一个数据
	DJNZ	R7,XR21	;双字节计数器减一
	DJNZ	R6,XR21
	MOV	DPH,R4	;恢复数据首址
	MOV	DPL,R5
	RET

    (34)  标号:  SORT    功能:单字节无符号数据块排序(增序)

入口条件:数据块的首址在R0中,字节数在R7中。

出口信息:完成排序(增序)
影响资源:PSW、A、R2~R6      堆栈需求:  2字节

SORT:	MOV	A,R7
	MOV	R5,A	;比较次数初始化
SRT1:	CLR	F0	;交换标志初始化
	MOV	A,R5	;取上遍比较次数
	DEC	A	;本遍比上遍减少一次
	MOV	R5,A	;保存本遍次数
	MOV	R2,A	;复制到计数器中
	JZ	SRT5	;若为零,排序结束
	MOV	A,R0	;保存数据指针
	MOV	R6,A
SRT2:	MOV	A,@R0	;读取一个数据
	MOV	R3,A
	INC	R0	;指向下一个数据
	MOV	A,@R0	;再读取一个数据
	MOV	R4,A

CLR	C
	SUBB	A,R3	;比较两个数据的大小
	JNC	SRT4	;顺序正确(增序或相同),不必交换
	SETB	F0	;设立交换标志
	MOV	A,R3	;将两个数据交换位置
	MOV	@R0,A
	DEC	R0
	MOV	A,R4
	MOV	@R0,A
	INC	R0	;指向下一个数据
SRT4:	DJNZ	R2,SRT2	;完成本遍的比较次数
	MOV	A,R6	;恢复数据首址
	MOV	R0,A
	JB	F0,SRT1	;本遍若进行过交换,则需继续排序
SRT5:	RET		;排序结束
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -