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

📄 fdsjs.asm

📁 一个浮点数计算子程序,浮点数格式化,加,减对阶,结果规格化,浮点数乘法,浮点数除法等
💻 ASM
字号:
;浮点数格式化
;
FSDT:		LCALL	MVR0	;将待格式化数据送到第一工作区
		LCALL	RLN	;通过左规完成格式化
		LJMP	MOV0	;将已格式化浮点数传回[R0]
;加[R0]+[R1]
FADD:		CLR	F0
		SJMP	AS
;减[R0]-[R1]
FSUB:		SETB	F0
AS:		LCALL	MVR1
		MOV	C,FO
		RRC	A
		XRL	A,@R1
		MOV	C,ACC.7
ASN:		MOV	1EH,C
		XRL	A,@R0
		RLC	A
		MOV	F0,C
		LCALL   MVR0
		LCALL	AS1
MOV0:		INC	R0
		INC	R0
		MOV	A,R4
		MOV	@R0,A
		DEC	R0
		MOV	A,R3
		MOV	@R0,A
		DEC	R0
		MOV	A,R2
		MOV	C,1FH
		MOV	ACC.7,C
		MOV	@R0,A
		CLR	ACC.7
		CLR	OV
		CJNE	A,#3FH,MV01
		SETB	OV
MV01:		MOV	A,@R0
		RET
AS1:		MOV	A,R6
		ORL	A,R7
		JZ	AS2
		MOV	A,R3
		ORL	A,R4
		JNZ	EQ
		MOV	A,R6
		MOV	R3,A
		MOV	A,R7
		MOV	R4,A
		MOV	A,R5
		MOV	R2,A
		MOV	C,1EH
		MOV	1FH,C
AS2:		RET
EQ:		MOV	A,R2	;对阶
		XRL	A,R5
		JZ	AS4	;阶码相同,对阶结束
		JB	ACC.7,EQ3;
		MOV	A,R2
		CLR	C
		SUBB	A,R5
		JC	EQ4
EQ2:		CLR	C
		MOV	A,R6
		RRC	A
		MOV	R6,A
		MOV	A,R7
		RRC	A
		MOV	R7,A
		INC	R5
		ORL	A,R6
		JNZ	EQ
		MOV	A,R2
		MOV	R5,A
		LJMP	AS4
EQ3:		MOV	A,R2
		JNB	ACC.7,EQ2;第一个数为正,右规第二个数
EQ4:		CLR	C
		LCALL	RR1
		ORL	A,R3
		JNZ	EQ
		MOV	A,R5
		MOV	R2,A
AS4:		JB	F0,AS5
		MOV	A,R4
		ADD	A,R7
		MOV	R4,A
		MOV	A,R3
		ADDC	A,R6
		MOV	R3,A
		JNC	AS2
		LJMP	RR1
AS5:		CLR	C
		MOV	A,R4
		SUBB	A,R7
		MOV	B,R3
		SUBB	A,R6
		JC	AS6
		MOV	R4,B
		MOV	R3,A
		LJMP	RLN	;结果规格化
AS6:		CPL	1FH
		CLR	C
		MOV	A,R7
		SUBB	A,R4
		MOV	R4,A
		MOV	A,R6
		SUBB	A,R3
		MOV	R3,A
RLN:		MOV	A,R3
		ORL	A,R4
		JNZ	RLN1
		MOV	R2,#0C1H;阶码取最小值
RLN1:		MOV	A,R3
		JB	ACC.7,RLN2
		CLR	C
		LCALL	RL1
		SJMP	RLN
RLN2:		CLR	OV
		RET
RL1:		MOV	A,R4
		RLC	A
		MOV	R4,A
		MOV	A,R3
		RLC	A
		MOV	R3,A
		DEC	R2
		CJNE	R2,#0C0H,RL1E
		CLR	A
		MOV	R3,A
		MOV	R4,A
		MOV	R2,#0C1H
RL1E:		CLR	OV
		RET
RR1:		MOV	A,R3
		RRC	A
		MOV	R3,A
		MOV	A,R4
		INC	R2
		CLR	OV
		CJNE	R2,#40H,RR1E
		MOV	R2,#3FH
		SETB	OV
RR1E:		RET
;将待格式化数据送到第一工作区
;1FH为正/负,R2为阶码,R3R4为数值
MVR0:		MOV	A,@R0	;
		MOV	C,ACC.7
		MOV	1FH,C
		MOV	A,ACC.6
		MOV	ACC.7,C
		MOV	R2,A
		INC	R0
		MOV	A,@R0
		MOV	R3,A
		INC	R0
		MOV	A,@R0
		MOV     R4,A
		DEC	R0
		DEC	R0
		RET
;[R1]将待格式化数据送到第二工作区
MVR1:		MOV	A,@R1	;
		MOV	C,ACC.7
		MOV	1EH,C
		MOV	A,ACC.6
		MOV	ACC.7,C
		MOV	R5,A
		INC	R1
		MOV	A,@R1
		MOV	R6,A
		INC	R1
		MOV	A,@R1
		MOV     R7,A
		DEC	R1
		DEC	R1
		RET

;浮点数乘法
		
FMUL:		LCALL	MVR0
		MOV	A,@R0
		XRL	A,@R1
		RLC	A
		MOV	1FH,C
		LCALL	MUL0
		LJMP	MOV0
MUL0:		LCALL	MVR1
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	R3,#3FH
		SETB	OV
		RET
MUL4:		JB	ACC.6,MUL6
		CLR	A
		MOV	R3,A
		MOV	R4,A
		MOV	R2,#41H
MUL6:		CLR     OV
		RET
		
;浮点数除法
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
		MOV	A,@R0
		ORL	A,@R1
		RLC	A
		MOV	1FH,C
		LCALL	MVR1
		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
		MOV	R4,A
		CLR	A
		ADDC	A,R0
		MOV	R3,A
		POP	ACC
		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
;浮点数传送
;[R1]---[R0]
FMOV:		INC	R0
		INC	R0
		INC	R1
		INC	R1
		MOV	A,@R1
		MOC	@R0,A
		DEC	R0
		DEC	R1
		MOV	A,@R1
		MOV	@R0,A
		DEC	R0
		DEC	R1
		MOV	A,@R1
		MOV	@R0,A
		RET
;浮点数求绝对值
FABS:		MOV	A,@R0
		CLR	ACC.7
		MOV	@R0,A
		RET
;浮点数取整函数
FINT:		LCALL	MVR0
		LCALL	INT
		LJMP	MOV0
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
		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
		JNB	F0,INTF
		JNB	1FH,INTF
		INC	R4
		MOV	A,R4
		JNZ	INTF
		INC	R3
INTF:		LJMP	RLN

;浮点数倒数函数
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
		LCALL	DIV3
		LJMP	MOV0
;将双字节数转换为浮点数
;双字节数数值在[R0],数符在1FH中,整数的位数在A中
DTOF:		MOV	R2,A
		MOV	A,@R0
		MOV	R3,A
		INC	R0
		MOV	A,@R0
		MOV	R4,A
		DEC	R0
		LCALL	RLN
		LJMP	MOV0
;浮点数转换为双字节数
;[R0]--[R0]
FTOD:		LCALL	MVR0
		MOV	A,R2
		JZ	FTD4
		JB	ACC.7,FTD4
		SETB	C
		SUBB	A,#10H
		JC	FTD1
		SETB	OV	;阶码大于16
		RET
FTD1:		SETB	C
		MOV	A,R2
		SUBB	A,#8
		JC	FTD3
FTD2:		MOV	B,#10H
		LCALL	FTD8
		SETB	F0	;双字节数整数
		CLR	C
		CLR	OV
		RET
FTD3:		MOV	B,#08H	;
		LCALL	FTD8
		CLR	OV
		CLR	F0
		SETB	C	;一字节整数一字节小数
		RET
FTD4:		MOV	B,#0
		LCALL	FTD8
		CLR	OV
		CLR	C
		CLR	F0	;为小数
		RET
FTD8:		MOV	A,R2
		CJNE	A,B,FTD9
		MOV	A,R3
		MOV	@R0,A
		INC	R0
		MOV	A,R4
		MOV	@R0,A
		DEC	R0
		RET
FTD9:		CLR	C
		LCALL	RR1
		SJMP	FTD8

;定点数计算程序:
;双字节二进制无符号乘法
;R2R3*R6R7=R2R3R4R5
MULD:		MOV	A,R3
		MOV	B,R7
		MUL	AB
		MOV	R4,B
		MOV	R5,A
		MOV	A,R3
		MOV	B,R6
		MUL	AB
		ADD	A,R4
		MOV	R4,A
		CLR	A
		ADDC	A,B
		MOV	R3,A
		MOV	A,R2
		MOV	B,R7
		MUL	AB
		ADD	A,R4
		MOV	R4,A
		MOV	A,R3
		ADDC	A,B
		MOV	R3,A
		CLR	A
		RLC	A
		XCH	A,R2
		MOV	B,R6
		MUL	AB
		ADD	A,R3
		MOV	R3,A
		MOV	A,R2
		ADDC	A,B
		MOV	R2,A
		RET
;双字节二进制无符号除法	
;R2R3R4R5/R6R7=R2R3
;OV=1溢出
DIVD:		CLR	C
		MOV	A,R3
		SUBB	A,R7
		MOV	A,R2
		SUBB	A,R6
		JC	DVD1
		SETB	OV
		RET
DVD1:		MOV	B,#10H
DVD2:		CLR	C
		MOV	A,R5
		RLC	A
		MOV	R5,A
		MOV	A,R4
		RLC	A
		MOV	R4,A
		MOV	A,R3
		RLC	A
		MOV	R3,A
		XCH	A,R2
		RLC	A
		XCH	A,R2
		MOV	F0,C
		CLR	C
		SUBB	A,R7
		MOV	R1,A
		MOV	A,R2
		SUBB	A,R6
		ANL	C,/F0
		JC	DVD3
		MOV	R2,A
		MOV	A,R1
		MOV	R3,A
		INC	R5
DVD3:		DJNZ	B,DVD2
		MOV	A,R4
		MOV	R2,A
		MOV	A,R5
		MOV	R3,A
		CLR	OV
		RET
			

		
				

			

		

		
		
						
			
						

⌨️ 快捷键说明

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