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

📄 mcs51浮点计算程序float_math.txt

📁 这是本人使用的MSC-51 3字节和4字节浮点数计算程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	SJMP	PU

;-----------------------------------
; 4 BITE FLOAT MUL
;((R0))((R0)+1)((R0)+2)((R0)+3)*
; ((R1))((R1)+1)((R1)+2)((R1)+3)
; TO R4R5R6R7
;-----------------------------------
F4_MUL: LCALL F4_LD
	INC	R1
	MOV	A, R0
	PUSH	ACC
	LCALL	D3_MUL
	POP	ACC
	MOV	R0, A
	DEC	R1
	MOV	A, R2
	MOV	C, ACC.7
	MOV	PSW.5, C
	MOV	A, @R0
	XRL	A, @R1
	MOV	C, ACC.7
	MOV	FLAG38, C
	MOV	A, @R0
	ADD	A, @R1
	XCH	A, R0
	PUSH	ACC
	SETB	C
	LCALL	F4_STD
	POP	ACC
	XCH	A, R0
	MOV	C, FLAG38
	MOV	ACC.7, C
	MOV	R4, A
	RET

;-----------------------------------
; 4 BITE FLOAT DIV
;((R0))((R0)+1)((R0)+2)((R0)+3)/
; ((R1))((R1)+1)((R1)+2)((R1)+3)
; TO R4R5R6R7,
; C=0 NORMAL, C=1 DIV BY 0
;-----------------------------------
F4_DIV: LCALL  F4_LD
	MOV	A, @R0
	XRL	A, @R1
	MOV	C, ACC.7
	MOV	FLAG38, C
	CLR	A
	MOV	R5, A
	MOV	R6, A
	MOV	R7, A
	INC	R1
	CJNE	@R1, #00H, L4A
	INC	R1
	CJNE	@R1, #00H, L4B
	INC	R1
	CJNE	@R1, #00H, L4C
	DEC	R1
	DEC	R1
	DEC	R1
	SETB	C
	RET
L4C:	DEC	R1
L4B:	DEC	R1
L4A:	DEC	R1
	MOV	A, @R0
	XCH	A, R0
	INC	R1
	PUSH	ACC
L4E:	MOV	A, R4
	INC	R1
	INC	R1
	SUBB	A, @R1
	MOV	A, R3
	DEC	R1
	SUBB	A, @R1
	MOV	A, R2
	DEC	R1
	SUBB	A, @R1
	JC	L4D
	CLR	PSW.5
	CLR	FLAG39
	LCALL	F4_STD
	MOV	A, R5
	RRC	A
	MOV	R5, A
	CLR	C
	SJMP	L4E
L4D:	MOV	A, R0
	PUSH	ACC
	LCALL	D3_DIV
	POP	ACC
	DEC	R1
	XCH	A, R0
	POP	ACC
	XCH	A, R0
	CLR	C
	SUBB	A, @R1
	MOV	C, FLAG38
	MOV	ACC.7, C
	MOV	R4, A
	CLR	C
	RET

;-----------------------------------------
; 4 BITE FLOAT  LOAD 
; ((R0)+1)((R0)+2)((R0)+3) TO R2R3R4
;-----------------------------------------
F4_LD:	INC	R0
	MOV	A, @R0
	MOV	R2, A
	INC	R0
	MOV	A, @R0
	MOV	R3, A
	INC	R0
	MOV	A, @R0
	MOV	R4, A
	DEC	R0
	DEC	R0
	DEC	R0
	RET

;-----------------------------------------
; 4 BITE FLOAT  ADD OR SUB
; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; FLAG3A=0 ADD, FLAG3A=1 SUB
;-----------------------------------------
F4_AB:	INC	R1
	MOV	A, @R1
	MOV	R5, A
	INC	R1
	MOV	A, @R1
	MOV	R6, A
	INC	R1
	MOV	A, @R1
	MOV	R7, A
	DEC	R1
	DEC	R1
	DEC	R1
	MOV	A, @R0
	MOV	C, ACC.7
	MOV	FLAG38, C
	XRL	A, @R1
	JNB	ACC.7, F4_ABT
	CPL	FLAG3A
F4_ABT:MOV	A, R0
	PUSH	ACC
	MOV	A, @R0
	MOV	C, ACC.6
	MOV	ACC.7, C
	MOV	R0, A
	MOV	A, R1
	PUSH	ACC
	MOV	A, @R1
	MOV	C, ACC.6
	MOV	ACC.7, C
	MOV	R1, A
F4_SDT1:CLR	C
	MOV	A, R0
	SUBB	A, R1
	JZ	F4_ABTI
	CLR	PSW.5
	CLR	FLAG39
	JB	ACC.7, F4_ABX
	CJNE	R5, #00H, F4_ABG
	CJNE	R6, #00H, F4_ABG
	CJNE	R7, #00H, F4_ABG
	MOV	A, R0
	MOV	R1, A
F4_ABTI:JB	FLAG3A, F4_ABS
	MOV	A, R4
	ADD	A, R7
	MOV	R7, A
	MOV	A, R3
	ADDC	A, R6
	MOV	R6, A
	MOV	A, R2
	ADDC	A, R5
	MOV	R5, A
	JNC	F4_ABA
	SETB	FLAG39
	CLR	C
	SETB	PSW.5
F4_ABL: LCALL F4_STD
	MOV	A, R1
	MOV	R0, A
F4_ABA: POP	ACC
	MOV	R1, A
	POP	ACC
	XCH	A, R0
	MOV	C, FLAG38
	MOV	ACC.7, C
	XCH	A, R4
	RET
F4_ABX: CJNE	R2, #00H, F4_ABG1
	CJNE	R3, #00H, F4_ABG1
	CJNE	R4, #00H, F4_ABG1
	MOV	A, R1
	MOV	R0, A
	SJMP	F4_ABTI
F4_ABG: CPL	PSW.5
F4_ABG1:CLR	C
	LCALL	F4_STD
	SJMP	F4_SDT1
F4_ABS: CLR	C
	MOV	A, R4
	SUBB	A, R7
	MOV	R7, A
	MOV	A, R3
	SUBB	A, R6
	MOV	R6, A
	MOV	A, R2
	SUBB	A, R5
	MOV	R5, A
	JNC	F4_ABS1
	CLR	A
	CLR	C
	SUBB	A, R7
	MOV	R7, A
	CLR	A
	SUBB	A, R6
	MOV	R6, A
	CLR	A
	SUBB	A, R5
	MOV	R5, A
	CPL	FLAG38
F4_ABS1:SETB	C
	CLR	PSW.5
	LCALL	F4_STD
	SJMP	F4_ABA

;-----------------------------------------
; 4 BITE FLOAT  ADD 
; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; FLAG3A=0 ADD
;-----------------------------------------
F4_ADD: CLR	FLAG3A
	LCALL	F4_LD
	LCALL	F4_AB
	RET

;-----------------------------------------
; 4 BITE FLOAT   SUB
; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; FLAG3A=1 SUB
;-----------------------------------------
F4_SUB: SETB	FLAG3A
	LCALL	F4_LD
	LCALL	F4_AB
	RET

;-----------------------------------------
; 4 BITE FLOAT  STANDED
; F0=0 R0R2R3R4
; F0=1 R1R5R6R7
;-----------------------------------------
F4_STD: JC	F4A
	MOV	C, FLAG39
	JB	PSW.5, F4B
	MOV	A, R2
	RRC	A
	MOV	R2, A
	MOV	A, R3
	RRC	A
	MOV	R3, A
	MOV	A, R4
	RRC	A
	MOV	R4, A
	INC	R0
	RET
F4B:	MOV	A, R5
	RRC	A
	MOV	R5, A
	MOV	A, R6
	RRC	A
	MOV	R6, A
	MOV	A, R7
	RRC	A
	MOV	R7, A
	INC	R1
	RET
F4A:	MOV	A, R5
	JNZ	F4C
	CJNE	R6, #00H, F4D
	CJNE	R7, #00H, F4D
F4E:	RET
F4C:	JB	ACC.7, F4E	; 0E7H
F4D:	MOV	C, PSW.5
	MOV	A, R7
	RLC	A
	MOV	R7, A
	MOV	A, R6
	RLC	A
	MOV	R6, A
	MOV	A, R5
	RLC	A
	MOV	R5, A
	CLR	PSW.5
	DEC	R0
	SJMP	F4A

;-----------------------------------
; 4 BYTE FLOAT STORE
; R4R5R6R7 TO (R0)(R0+1)(R0+2)(R0+3)
;-----------------------------------
F4_STR: MOV	A, R4
	MOV	@R0, A
	INC	R0
	MOV	A, R5
	MOV	@R0, A
	INC	R0
	MOV	A, R6
	MOV	@R0, A
	INC	R0
	MOV	A, R7
	MOV	@R0, A
	DEC	R0
	DEC	R0
	DEC	R0
	RET

;-------------------------------------------
; 3 BYTE DIV
; 0.R2R3R4R5R6R7 / ((R1))((R1)+1)((R1)+2)
;    TO (R0)(R0+1)(R0+2)(R0+3)
;-------------------------------------------
D3_DIV: MOV	R0, #18H
	INC	R1
	INC	R1
S3D:	CLR	C
	MOV	A, R7
	RLC	A
	MOV	R7, A
	MOV	A, R6
	RLC	A
	MOV	R6, A
	MOV	A, R5
	RLC	A
	MOV	R5, A
	MOV	A, R4
	RLC	A
	MOV	R4, A
	XCH	A, R3
	RLC	A
	XCH	A, R3
	XCH	A, R2
	RLC	A
	XCH	A, R2
	MOV	PSW.5, C
	CLR	C
	SUBB	A, @R1
	DEC	R1
	MOV	A, R3
	SUBB	A, @R1
	DEC	R1
	MOV	B, A
	MOV	A, R2
	SUBB	A, @R1
	INC	R1
	INC	R1
	JB	PSW.5, S3A
	JC	S3B
S3A:	CLR	C
	MOV	R2, A
	MOV	A, R4
	SUBB	A, @R1
	MOV	R4, A
	MOV	R3, B
	INC	R7
S3B:	DJNZ	R0, S3D
	DEC	R1
	DEC	R1
	RET

;---------------------------------------
; 3 BYTE MUL
; 0.R2R3R4 * 0.((R1))((R1)+1)((R1)+2)
; TO R5R6R2R3R4
;---------------------------------------
D3_MUL: MOV	R0, #19H
	CLR	C
	CLR	A
	MOV	R5, A
	MOV	R6, A
	MOV	R7, A
K3B:	MOV	A, R5
	RRC	A
	MOV	R5, A
	MOV	A, R6
	RRC	A
	MOV	R6, A
	MOV	A, R7
	RRC	A
	MOV	R7, A
	XCH	A, R2
	RRC	A
	XCH	A, R2
	XCH	A, R3
	RRC	A
	XCH	A, R3
	XCH	A, R4
	RRC	A
	XCH	A, R4
	DJNZ	R0, K3A
	RET
K3A:	JNC	K3B
	INC	R1
	INC	R1
	ADD	A, @R1
	MOV	R7, A
	MOV	A, R6
	DEC	R1
	ADDC	A, @R1
	MOV	R6, A
	MOV	A, R5
	DEC	R1
	ADDC	A, @R1
	MOV	R5, A
	SJMP	K3B

;-------------------------------------------
; 功能:以e为底的浮点指数函数
;入口条件:操作数在TMP0中。使用TMP0,TMP1,TMP2
;出口信息:OV=0时,结果仍在TMP0中,OV=1时,溢出。
;影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节
;-------------------------------------------
F4_EXP:	
	MOV	R1, #TMP1
	MOV	A, #01H		; e(x) = 2(1.442695 * x)
	MOV	@R1, A
	INC	R1
	MOV	A, #0B8H
	MOV	@R1, A
	INC	R1
	MOV	A, #0AAH
	MOV	@R1, A
	INC	R1
	MOV	A, #3BH
	MOV	@R1, A

	MOV	R0, #TMP0
	MOV	R1, #TMP1
	LCALL	F4_MUL		;进行加权运算
	MOV	R0, #TMP0
	LCALL	F4_STR

E20:
	MOV	R0, #TMP0
	MOV	A, @R0
	MOV	R4, A
	INC	R0
	MOV	A, @R0
	MOV	R5, A
	INC	R0
	MOV	A, @R0
	MOV	R6, A
	INC	R0
	MOV	A, @R0
	MOV	R7, A
	MOV	A, R5
	ORL	A, R6
	ORL	A, R7
	JNZ	EXP2
EXP1:
	MOV	R4, #01H		;尾数为零,幂为1.000000
	MOV	R5, #80H
	MOV	R6, #00H
	MOV	R7, #00H
	CLR	OV
	RET
EXP2:	
	MOV	R0, #TMP0
	MOV	A, @R0
	MOV	R4, A		;将指数复制到工作区
	INC	R0
	MOV	A, @R0
	MOV	R5, A
	INC	R0
	MOV	A, @R0
	MOV	R6, A
	INC	R0
	MOV	A, @R0
	MOV	R7, A
	LCALL	INT
EXP4:
	MOV	A, R4
	JB	ACC.6, EXP5
	CLR	ACC.7
	MOV	R0, A
	CLR	C
	MOV	R1, #00H
	MOV	A, R5
	PUSH	ACC
EXPJ1:	MOV	A, R5
	RLC	A
	MOV	R5, A
	MOV	A, R1
	RLC	A
	MOV	R1, A
	DJNZ	R0, EXPJ1
	POP	ACC
	MOV	R5, A
	MOV	A, R4
	JB	ACC.7, EXPJ2
	MOV	A, R1
	SJMP	EXP6
EXPJ2:	MOV	A, R1
	CPL	A
	INC	A
	SJMP	EXP6	
EXP5:	MOV	A, #00H	
EXP6:	PUSH	ACC	;暂时保存之
	MOV	R0, #TMP1
	LCALL	F4_STR
	MOV	R0, #TMP0
	MOV	R1, #TMP1
	LCALL	F4_SUB	;求指数的小数部分
	MOV	R0, #TMP0
	LCALL	F4_STR

	PUSH	DPH
	PUSH	DPL
	MOV	DPTR, #EXP_TABL
	MOV	TMP2, #41H
	MOV	TMP2+1, #00H
	MOV	TMP2+2, #00H
	MOV	TMP2+3, #00H
PLN1:	CLR	A		;计算指数的小数部分的幂
	MOV	R0, #TMP1
	MOVC	A, @A+DPTR
	MOV	@R0, A
	INC	DPTR
	INC	R0
	CLR	A
	MOVC	A, @A+DPTR
	MOV	@R0, A
	INC	DPTR
	INC	R0
	CLR	A
	MOVC	A, @A+DPTR
	MOV	@R0, A
	INC	DPTR
	INC	R0
	CLR	A
	MOVC	A, @A+DPTR
	MOV	@R0, A
	INC	DPTR	;指向下一个系数
	MOV	R0, #TMP2
	MOV	R1, #TMP1
	LCALL	F4_ADD	;进行代数加法运算
	MOV	R0, #TMP2
	LCALL	F4_STR
	CLR	A	;读取下一个系数的第一个字节
	MOVC	A, @A+DPTR
	CJNE	A, #40H, PLN2;是结束标志吗?
	POP	DPL
	POP	DPH
	POP	ACC		;取出指数的整数部分
	ADD	A, R4		;按补码加到幂的阶码上
	MOV	R4, A
	MOV	A, R4
	CLR	ACC.7	;幂的符号为正
	MOV	R4, A
	RET

PLN2:	
	MOV	R0, #TMP0
	MOV	R1, #TMP2
	LCALL	F4_MUL	;进行乘法运算
	MOV	R0, #TMP2
	LCALL	F4_STR
	LJMP	PLN1	;继续下一项运算

EXP_TABL:
	DB	77H, 0B1H, 0C9H, 00H	; 1.3564 * 10(-3)
	DB	7AH, 0A1H,  68H, 00H	; 9.8514 * 10(-3)
	DB	7CH, 0E3H,  4FH, 00H	; 0.055495
	DB	7EH, 0F5H, 0E7H, 00H	; 0.24014
	DB	00H, 0B1H,  72H, 00H	; 0.69315
	DB	01H,  80H,  00H, 00H	; 1.000000
	DB	40H,  40H,  40H, 40H	;结束
;-------------------------------------------
; (R4)R5R6R7
;-------------------------------------------
RLN:	MOV	A, R5		;浮点数规格化
	ORL	A, R6		;尾数为零否?
	ORL	A, R7
	JNZ	RLN1
	MOV	R4, #0C1H	;阶码取最小值
	RET     	
RLN1:	MOV	A, R5
	JB	ACC.7, RLN2	;尾数最高位为一否?
	CLR	C		;不为一,左规一次
	LCALL	RL1
	SJMP	RLN		;继续判断
RLN2:	CLR	OV		;规格化结束
	RET
RL1:	MOV	A, R7		;第一操作数左规一次
	RLC	A		;尾数扩大一倍
	MOV	R7, A
	MOV	A, R6
	RLC	A
	MOV	R6, A
	MOV	A, R5
	RLC	A
	MOV	R5, A
	DEC	R4		;阶码减一
	CJNE	R4, #0C0H, RL1E	;阶码下溢否?
	CLR	A
	MOV	R5, A		;阶码下溢,操作数以零计
	MOV	R6, A
	MOV	R7, A
	MOV	R4, #0C1H
RL1E:	CLR	OV
	RET
RR1:	MOV	A, R5	;第一操作数右规一次
	RRC	A	;尾数缩小一半
	MOV	R5, A
	MOV	A, R6
	RRC	A
	MOV	R6, A
	MOV	A, R7
	RRC	A
	MOV	R7, A
	INC	R4	;阶码加一
	CLR	OV	;清溢出标志
	CJNE	R4, #40H, RR1E	;阶码上溢否?
	MOV	R4, #3FH	;阶码溢出
	SETB	OV
RR1E:	RET

;-------------------------------------------
; 功能:浮点取整函数
;入口条件:操作数在[R0]中。
;出口信息:R4R5R6R7
;-------------------------------------------
FINT:
	MOV	A, @R0
	MOV	R4, A	;阶存放在R4中
	INC	R0
	MOV	A, @R0	;将尾数高字节存放在R5中
	MOV	R5, A
	INC	R0
	MOV	A, @R0	;将尾数第二字节存放在R6中
	MOV	R4, A
	INC	R0
	MOV	A, @R0	;将尾数第三字节存放在R7中
	MOV	R7, A
	DEC	R0	;恢复数据指针
	DEC	R0
	DEC	R0
	LCALL	INT	;在工作寄存器中完成取整运算
	RET

INT:	MOV	A, R5
	ORL	A, R6
	ORL	A, R7
	JNZ	INTA
	MOV	R4, #41H	;尾数为零,阶码也清零,结束取整
	RET

INTA:	MOV	A, R4
	CLR	ACC.7
	JZ	INTB	;阶码为零否?
	JB	ACC.6, INTB;阶符为负否?
	CLR	ACC.6
	CLR	C
	SUBB	A, #18H	;阶码小于24否?
	JC	INTD
	RET		;阶码大于24,已经是整数
INTB:	CLR	A	  ;绝对值小于一,取整后正数为零,负数为负一
	MOV	R7, A
	MOV	R6, A
	MOV	R5, A
	MOV	R4, #41H
INTC:	RET

INTD:	CLR	F0	;舍尾标志初始化
	MOV	A, R4
	CLR	ACC.7
	MOV	R0, A
	CLR	A
	MOV	R1, A
	MOV	R2, A
	MOV	R3, A
	CLR	C
INTE:	
	MOV	A, R7
	RLC	A
	MOV	R7, A
	MOV	A, R6
	RLC	A
	MOV	R6, A
	MOV	A, R5
	RLC	A
	MOV	R5, A
	MOV	A, R3
	RLC	A
	MOV	R3, A
	MOV	A, R2
	RLC	A
	MOV	R2, A
	MOV	A, R1
	RLC	A
	MOV	R1, A
	DJNZ	R0, INTE	;阶码
	MOV	A, R4
	CLR	ACC.7
	MOV	R0, A
	MOV	A, #18H
	CLR	C
	SUBB	A, R0
	MOV	R0, A
INTF:	CLR	C
	MOV	A, R3
	RLC	A
	MOV	R3, A
	MOV	A, R2
	RLC	A
	MOV	R2, A
	MOV	A, R1
	RLC	A
	MOV	R1, A
	DJNZ	R0, INTF
	MOV	A, R3
	MOV	R7, A
	MOV	A, R2
	MOV	R6, A
	MOV	A, R1
	MOV	R5, A
	RET

⌨️ 快捷键说明

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