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

📄 MCS-51单片机实用子程序库(96年版).txt

📁 8951系列单片机仿真
💻 TXT
📖 第 1 页 / 共 5 页
字号:
	MOV	R3,A
	MOV	A,R4
	RRC	A
	MOV	R4,A
	INC	R2	;阶码加一
	CLR	OV	;清溢出标志
	CJNE	R2,#40H,RR1E;阶码上溢否?
	MOV	R2,#3FH	;阶码溢出
	SETB	OV
RR1E	RET

    (4)  标号:  FMUL    功能:浮点数乘法

入口条件:被乘数在[R0]中,乘数在[R1]中。
出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出。
影响资源:PSW、A、B、R2~R7、位1EH、1FH    堆栈需求:6字节

FMUL	LCALL	MVR0	;将[R0]传送到第一工作区中
	MOV	A,@R0
	XRL	A,@R1	;比较两个操作数的符号
	RLC	A
	MOV	1FH,C	;保存积的符号
	LCALL	MUL0	;计算积的绝对值
	LJMP	MOV0	;将结果传回到[R0]中
MUL0	LCALL	MVR1	;将[R1]传送到第二工作区中
MUL1	MOV	A,R3	;第一尾数为零否?
	ORL	A,R4
	JZ	MUL6
	MOV	A,R6	;第二尾数为零否?
	ORL	A,R7
	JZ	MUL5
	MOV	A,R7	;计算R3R4×R6R7-→R3R4
	MOV	B,R4
	MUL	AB
	MOV	A,B
	XCH	A,R7
	MOV	B,R3
	MUL	AB
	ADD	A,R7
	MOV	R7,A
	CLR	A
	ADDC	A,B
	XCH	A,R4
	MOV	B,R6
	MUL	AB
	ADD	A,R7
	MOV	R7,A
	MOV	A,B
	ADDC	A,R4
	MOV	R4,A
	CLR	A
	RLC	A
	XCH	A,R3
	MOV	B,R6
	MUL	AB
	ADD	A,R4
	MOV	R4,A
	MOV	A,B
	ADDC	A,R3
	MOV	R3,A
	JB	ACC.7,MUL2;积为规格化数否?
	MOV	A,R7	;左规一次
	RLC	A
	MOV	R7,A
	LCALL	RL1
MUL2	MOV	A,R7
	JNB	ACC.7,MUL3
	INC	R4
	MOV	A,R4
	JNZ	MUL3
	INC	R3
	MOV	A,R3
	JNZ	MUL3
	MOV	R3,#80H
	INC	R2
MUL3	MOV	A,R2	;求积的阶码
	ADD	A,R5
MD	MOV	R2,A	;阶码溢出判断
	JB	ACC.7,MUL4
	JNB	ACC.6,MUL6
	MOV	R2,#3FH	;阶码上溢,设立标志
	SETB	OV
	RET
MUL4	JB	ACC.6,MUL6
MUL5	CLR	A	;结果清零(因子为零或阶码下溢)
	MOV	R3,A
	MOV	R4,A
	MOV	R2,#41H
MUL6	CLR	OV
	RET

    (5)  标号:  FDIV    功能:浮点数除法

入口条件:被除数在[R0]中,除数在[R1]中。
出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。
影响资源:PSW、A、B、R2~R7、位1EH、1FH   堆栈需求:  5字节

FDIV	INC	R0
	MOV	A,@R0
	INC	R0
	ORL	A,@R0
	DEC	R0
	DEC	R0
	JNZ	DIV1
	MOV	@R0,#41H;被除数为零,不必运算
	CLR	OV
	RET
DIV1	INC	R1
	MOV	A,@R1
	INC	R1  	
	ORL	A,@R1
	DEC	R1
	DEC	R1  	
	JNZ	DIV2	
	SETB	OV	;除数为零,溢出
	RET     	
DIV2	LCALL	MVR0	;将[R0]传送到第一工作区中
	MOV	A,@R0
	XRL	A,@R1	;比较两个操作数的符号
	RLC	A
	MOV	1FH,C	;保存结果的符号
	LCALL	MVR1	;将[R1]传送到第二工作区中
	LCALL	DIV3	;调用工作区浮点除法
	LJMP	MOV0	;回传结果
DIV3	CLR	C	;比较尾数的大小
	MOV	A,R4
	SUBB	A,R7
	MOV	A,R3
	SUBB	A,R6
	JC	DIV4
	LCALL	RR1	;被除数右规一次
	SJMP	DIV3
DIV4	CLR	A	;借用R0R1R2作工作寄存器
	XCH	A,R0	;清零并保护之
	PUSH	ACC
	CLR	A
	XCH	A,R1
	PUSH	ACC
	MOV	A,R2
	PUSH	ACC
	MOV	B,#10H	;除法运算,R3R4/R6R7-→R0R1
DIV5	CLR	C
	MOV	A,R1
	RLC	A
	MOV	R1,A
	MOV	A,R0
	RLC	A
	MOV	R0,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	XCH	A,R3
	RLC	A
	XCH	A,R3
	MOV	F0,C
	CLR	C
	SUBB	A,R7
	MOV	R2,A
	MOV	A,R3
	SUBB	A,R6
	ANL	C,F0
	JC	DIV6
	MOV	R3,A
	MOV	A,R2
	MOV	R4,A
	INC	R1
DIV6	DJNZ	B,DIV5
	MOV	A,R6	;四舍五入
	CLR	C
	RRC	A
	SUBB	A,R3
	CLR	A
	ADDC	A,R1	;将结果存回R3R4
	MOV	R4,A
	CLR	A
	ADDC	A,R0
	MOV	R3,A
	POP	ACC	;恢复R0R1R2
	MOV	R2,A
	POP	ACC
	MOV	R1,A
	POP	ACC
	MOV	R0,A
	MOV	A,R2	;计算商的阶码
	CLR	C
	SUBB	A,R5
	LCALL	MD	;阶码检验
	LJMP	RLN	;规格化

    (6)  标号:  FCLR      功能:浮点数清零

入口条件:操作数在[R0]中。
出口信息:操作数被清零。
影响资源:A    堆栈需求:  2字节

FCLR	INC	R0
	INC	R0
	CLR	A
	MOV	@R0,A
	DEC	R0
	MOV	@R0,A
	DEC	R0
	MOV	@R0,#41H
	RET 	

    (7)  标号:  FZER    功能:浮点数判零

入口条件:操作数在[R0]中。
出口信息:若累加器A为零,则操作数[R0]为零,否则不为零。
影响资源:A    堆栈需求:  2字节

FZER	INC	R0
	INC	R0
	MOV	A,@R0
	DEC	R0
	ORL	A,@R0
	DEC	R0
	JNZ	ZERO
	MOV	@R0,#41H
ZERO	RET 	

    (8)  标号:  FMOV    功能:浮点数传送

入口条件:源操作数在[R1]中,目标地址为[R0]。
出口信息:[R0]=[R1],[R1]不变。
影响资源:A   堆栈需求:  2字节

FMOV	INC	R0
	INC	R0
	INC	R1
	INC	R1
	MOV	A,@R1
	MOV	@R0,A
	DEC	R0
	DEC	R1
	MOV	A,@R1
	MOV	@R0,A
	DEC	R0
	DEC	R1
	MOV	A,@R1
	MOV	@R0,A
	RET

    (9)  标号:  FPUS    功能:浮点数压栈

入口条件:操作数在[R0]中。
出口信息:操作数压入栈顶。
影响资源:A、R2、R3    堆栈需求:  5字节

FPUS	POP	ACC	;将返回地址保存在R2R3中
	MOV	R2,A
	POP	ACC
	MOV	R3,A
	MOV	A,@R0	;将操作数压入堆栈
	PUSH	ACC
	INC	R0
	MOV	A,@R0
	PUSH	ACC
	INC	R0
	MOV	A,@R0
	PUSH	ACC
	DEC	R0
	DEC	R0
	MOV	A,R3	;将返回地址压入堆栈
	PUSH	ACC
	MOV	A,R2
	PUSH	ACC
	RET		;返回主程序

    (10)  标号:  FPOP    功能:浮点数出栈

入口条件:操作数处于栈顶。
出口信息:操作数弹至[R0]中。
影响资源:A、R2、R3    堆栈需求:  2字节

FPOP	POP	ACC	;将返回地址保存在R2R3中
	MOV	R2,A
	POP	ACC
	MOV	R3,A
	INC	R0
	INC	R0
	POP	ACC	;将操作数弹出堆栈,传送到[R0]中
	MOV	@R0,A
	DEC	R0
	POP	ACC
	MOV	@R0,A
	DEC	R0
	POP	ACC
	MOV	@R0,A
	MOV	A,R3	;将返回地址压入堆栈
	PUSH	ACC
	MOV	A,R2
	PUSH	ACC
	RET		;返回主程序

    (11)  标号:  FCMP    功能:浮点数代数值比较(不影响待比较操作数)

入口条件:待比较操作数分别在[R0]和[R1]中。
出口信息:若CY=1,则[R0]  [R1],若CY=0且A=0则 [R0] = [R1],否则[R0]  [R1]。
影响资源:A、B、PSW    堆栈需求:  2字节

FCMP	MOV	A,@R0	;数符比较
	XRL	A,@R1
	JNB	ACC.7,CMP2
	MOV	A,@R0	;两数异号,以[R0]数符为准
	RLC	A
	MOV	A,#0FFH
	RET 	
CMP2	MOV	A,@R1	;两数同号,准备比较阶码
	MOV	C,ACC.6
	MOV	ACC.7,C
	MOV	B,A
	MOV	A,@R0
	MOV	C,ACC.7
	MOV	F0,C	;保存[R0]的数符
	MOV	C,ACC.6
	MOV	ACC.7,C
	CLR	C	;比较阶码
	SUBB	A,B
	JZ	CMP6
	RLC	A	;取阶码之差的符号
	JNB	F0,CMP5
	CPL	C	;[R0]为负时,结果取反
CMP5	MOV	A,#0FFH	;两数不相等
	RET 	
CMP6	INC	R0	;阶码相同时,准备比较尾数
	INC	R0
	INC	R1
	INC	R1
	CLR	C
	MOV	A,@R0
	SUBB	A,@R1
	MOV	B,A	;保存部分差	
	DEC	R0
	DEC	R1
	MOV	A,@R0
	SUBB	A,@R1
	DEC	R0
	DEC	R1
	ORL	A,B	;生成是否相等信息
	JZ	CMP7
	JNB	F0,CMP7
	CPL	C	;[R0]为负时,结果取反
CMP7	RET

    (12)  标号:  FABS    功能:浮点绝对值函数

入口条件:操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:A    堆栈需求:  2字节

FABS	MOV	A,@R0	;读取操作数的阶码
	CLR	ACC.7	;清除数符
	MOV	@R0,A	;回传阶码
	RET

    (13)  标号:  FSGN    功能:浮点符号函数

入口条件:操作数在[R0]中。
出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 时为零。
影响资源:PSW、A    堆栈需求:  2字节

FSGN	INC	R0	;读尾数
	MOV	A,@R0
	INC	R0
	ORL	A,@R0
	DEC	R0
	DEC	R0
	JNZ	SGN
	RET		;尾数为零,结束
SGN	MOV	A,@R0	;读取操作数的阶码
	RLC	A	;取数符
	MOV	A,#1	;按正数初始化
	JNC	SGN1	;是正数,结束
	MOV	A,#0FFH	;是负数,改变标志
SGN1	RET

    (14)  标号:  FINT    功能:浮点取整函数

入口条件:操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:PSW、A、R2、R3、R4、位1FH    堆栈需求:  6字节

FINT	LCALL	MVR0	;将[R0]传送到第一工作区中
	LCALL	INT	;在工作寄存器中完成取整运算
	LJMP	MOV0	;将结果传回到[R0]中
INT	MOV	A,R3
	ORL	A,R4
	JNZ	INTA
	CLR	1FH	;尾数为零,阶码也清零,结束取整
	MOV	R2,#41H
	RET 	
INTA	MOV	A,R2
	JZ	INTB	;阶码为零否?
	JB	ACC.7,INTB;阶符为负否?
	CLR	C
	SUBB	A,#10H	;阶码小于16否?
	JC	INTD
	RET		;阶码大于16,已经是整数
INTB	CLR	A	  ;绝对值小于一,取整后正数为零,负数为负一
	MOV	R4,A
	MOV	C,1FH
	RRC	A
	MOV	R3,A
	RL	A
	MOV	R2,A
	JNZ	INTC
	MOV	R2,#41H
INTC	RET
INTD	CLR	F0	;舍尾标志初始化
INTE	CLR	C
	LCALL	RR1	;右规一次
	ORL	C,F0	;记忆舍尾情况
	MOV	F0,C
	CJNE	R2,#10H,INTE;阶码达到16(尾数完全为整数)否?
	JNB	F0,INTF	;舍去部分为零否?
	JNB	1FH,INTF;操作数为正数否?
	INC	R4	;对于带小数的负数,向下取整
	MOV	A,R4
	JNZ	INTF
	INC	R3
INTF	LJMP	RLN	;将结果规格化

    (15)  标号:  FRCP    功能:浮点倒数函数

入口条件:操作数在[R0]中。
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。
影响资源:PSW、A、B、R2~R7、位1EH、1FH   堆栈需求: 5字节

FRCP	MOV	A,@R0
	MOV	C,ACC.7
	MOV	1FH,C	;保存数符
	MOV	C,ACC.6	;绝对值传送到第二工作区
	MOV	ACC.7,C
	MOV	R5,A
	INC	R0
	MOV	A,@R0
	MOV	R6,A
	INC	R0
	MOV	A,@R0
	MOV	R7,A
	DEC	R0
	DEC	R0
	ORL	A,R6
	JNZ	RCP
	SETB	OV	;零不能求倒数,设立溢出标志
	RET 	
RCP	MOV	A,R6
	JB	ACC.7,RCP2;操作数格式化否?
	CLR	C	;格式化之
	MOV	A,R7
	RLC	A
	MOV	R7,A
	MOV	A,R6
	RLC	A
	MOV	R6,A
	DEC	R5
	SJMP	RCP
RCP2	MOV	R2,#1	;将数值1.00传送到第一工作区
	MOV	R3,#80H
	MOV	R4,#0

⌨️ 快捷键说明

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