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

📄 插值算法.asm

📁 两个点的线性插值定点数算法 说明:1、基本公式 y=( y2-y1 ) ( x-x1 ) / ( x2-x1 ) + y1 2、根据直线斜率的正负、内插外插的不同
💻 ASM
字号:
;程序作者:  马  良     QQ:8297327       电话:13087664858
;功能: 两个点的线性插值定点数算法。
;入口:已知两个点,坐标分别为 P1[ R_x1H R_x1L , R_y1H R_y1L ] 
;      和 P2[ R_x2H R_x2L , R_y2H R_y2L ] 。未知点的x坐标为 R_xH R_xL 。
;      注意:x、y坐标都是双字节数,高字节在前。
;出口:未知点的y坐标存放在 R_yH R_yL 中,高字节在前。
;资源:PSW、A、R0 ~ R7 。
;说明:1、基本公式 y=( y2-y1 ) ( x-x1 ) / ( x2-x1 ) + y1
;      2、根据直线斜率的正负、内插外插的不同,分为6种情况。
;         参见文件夹中的“插值算法的6种情况”一图。

LINE_INSERT:
	clr	R_FLAG2.B_CHR_ERR	;清错误标志。

	mov	A,R_x2L	;调整两点,使P1的x坐标为较小的数。 P1x - P2x 。
	clr	C
	subb	A,R_x1L
	mov	A,R_x2H
	subb	A,R_x1H
	jnc	LI10		;如果现状不需要调整则继续。

	mov	A,R_x1H		;交换两点的坐标。
	xch	A,R_x2H
	mov	R_x1H,A

	mov	A,R_x1L
	xch	A,R_x2L
	mov	R_x1L,A

	mov	A,R_y1H
	xch	A,R_y2H
	mov	R_y1H,A

	mov	A,R_y1L
	xch	A,R_y2L
	mov	R_y1L,A

LI10:		;计算 x2 - x1 ==> x2 ,为各种情况公用的中间数据。
	mov	A,R_x2L
	clr	C
	subb	A,R_x1L
	mov	R_x2L,A
	mov	A,R_x2H
	subb	A,R_x1H
	mov	R_x2H,A
LI20:		;计算 y2 - y1 ,以区别正负斜率,分别处理。
	mov	A,R_y2L
	clr	C
	subb	A,R_y1L
	mov	A,R_y2H
	subb	A,R_y1H
	jc	LI60

LI30:		;正斜率,分图1~ 图3三种情况。
			;先区别x和x1的大小。
	mov	A,R_xL
	clr	C
	subb	A,R_x1L
	mov	A,R_xH
	subb	A,R_x1H
	jc	LI50

LI40:		;x > x1 ,属于图1和图3的情况。
		;y=( y2-y1 ) ( x-x1 ) / ( x2-x1 ) + y1

	mov	A,R_y2L	; y2-y1 ==> R2(H) R3(L)
	clr	C
	subb	A,R_y1L
	mov	R3,A
	mov	A,R_y2H
	subb	A,R_y1H
	mov	R2,A

	mov	A,R_xL	; x-x1 ==> R6(H) R7(L)
	clr	C
	subb	A,R_x1L
	mov	R7,A
	mov	A,R_xH
	subb	A,R_x1H
	mov	R6,A

	lcall	MUL22	;( y2-y1 ) ( x-x1 ) ==> R2(H) R3 R4 R5(L) 
	mov	R6,R_x2H
	mov	R7,R_x2L
	lcall	DIVDE42	;( y2-y1 ) ( x-x1 ) / ( x2-x1 ) ==> R2(H) R3(L)
	jnb	OV,LI44
	ljmp	LI_ERR	;溢出错误。

LI44:
	mov	A,R_y1L	;y=( y2-y1 ) ( x-x1 ) / ( x2-x1 ) + y1
	add	A,R3
	mov	R_yL,A
	mov	A,R_y1H
	addc	A,R2
	mov	R_yH,A
	jc	LI48
	ljmp	LI_END	;图1和图3的情况处理结束。
LI48:
	ljmp	LI_ERR	;溢出错误。

LI50:		;x < x1 ,属于图2的情况 。
		;y=y1 - ( y2-y1 ) ( x1-x ) / ( x2-x1 )

	mov	A,R_y2L	; y2-y1 ==> R2(H) R3(L)
	clr	C
	subb	A,R_y1L
	mov	R3,A
	mov	A,R_y2H
	subb	A,R_y1H
	mov	R2,A

	mov	A,R_x1L	; x1-x ==> R6(H) R7(L)
	clr	C
	subb	A,R_xL
	mov	R7,A
	mov	A,R_x1H
	subb	A,R_xH
	mov	R6,A

	lcall	MUL22	;( y2-y1 ) ( x1-x ) ==> R2(H) R3 R4 R5(L) 
	mov	R6,R_x2H
	mov	R7,R_x2L
	lcall	DIVDE42	;( y2-y1 ) ( x1-x ) / ( x2-x1 ) ==> R2(H) R3(L)
	jnb	OV,LI54
	ljmp	LI_ERR	;溢出错误。

LI54:
	mov	A,R_y1L	;y= y1 - ( y2-y1 ) ( x1-x ) / ( x2-x1 )
	clr	C
	subb	A,R3
	mov	R_yL,A
	mov	A,R_y1H
	subb	A,R2
	mov	R_yH,A
	jc	LI58
	ljmp	LI_END	;图2的情况处理结束。
LI58:
	ljmp	LI_ERR	;溢出错误。

LI60:		;负斜率,分图4~ 图6三种情况。
			;先区别x和x1的大小。
	mov	A,R_xL
	clr	C
	subb	A,R_x1L
	mov	A,R_xH
	subb	A,R_x1H
	jc	LI70

LI64:		;x > x1 ,属于图4和图6的情况。
		;y= y1 - ( y1-y2 ) ( x-x1 ) / ( x2-x1 )

	mov	A,R_y1L	; y1-y2 ==> R2(H) R3(L)
	clr	C
	subb	A,R_y2L
	mov	R3,A
	mov	A,R_y1H
	subb	A,R_y2H
	mov	R2,A

	mov	A,R_xL	; x-x1 ==> R6(H) R7(L)
	clr	C
	subb	A,R_x1L
	mov	R7,A
	mov	A,R_xH
	subb	A,R_x1H
	mov	R6,A

	lcall	MUL22	;( y1-y2 ) ( x-x1 ) ==> R2(H) R3 R4 R5(L) 
	mov	R6,R_x2H
	mov	R7,R_x2L
	lcall	DIVDE42	;( y1-y2 ) ( x-x1 ) / ( x2-x1 ) ==> R2(H) R3(L)
	jnb	OV,LI68
	ljmp	LI_ERR	;溢出错误。

LI68:
	mov	A,R_y1L	;y= y1 - ( y1-y2 ) ( x-x1 ) / ( x2-x1 )
	clr	C
	subb	A,R3
	mov	R_yL,A
	mov	A,R_y1H
	subb	A,R2
	mov	R_yH,A
	jc	LI6A
	ljmp	LI_END	;图4和图6的情况处理结束。
LI6A:
	ljmp	LI_ERR	;溢出错误。

LI70:		;x < x1 ,属于图5的情况 。
		;y=y1 + ( y1-y2 ) ( x1-x ) / ( x2-x1 )

	mov	A,R_y1L	; y1-y2 ==> R2(H) R3(L)
	clr	C
	subb	A,R_y2L
	mov	R3,A
	mov	A,R_y1H
	subb	A,R_y2H
	mov	R2,A

	mov	A,R_x1L	; x1-x ==> R6(H) R7(L)
	clr	C
	subb	A,R_xL
	mov	R7,A
	mov	A,R_x1H
	subb	A,R_xH
	mov	R6,A

	lcall	MUL22	;( y1-y2 ) ( x1-x ) ==> R2(H) R3 R4 R5(L) 
	mov	R6,R_x2H
	mov	R7,R_x2L
	lcall	DIVDE42	;( y1-y2 ) ( x1-x ) / ( x2-x1 ) ==> R2(H) R3(L)
	jnb	OV,LI74
	ljmp	LI_ERR	;溢出错误。

LI74:
	mov	A,R_y1L	;y= y1 + ( y1-y2 ) ( x1-x ) / ( x2-x1 )
	add	A,R3
	mov	R_yL,A
	mov	A,R_y1H
	addc	A,R2
	mov	R_yH,A
	jc	LI78
	ljmp	LI_END	;图5的情况处理结束。
LI78:
	ljmp	LI_ERR	;溢出错误。

LI_ERR:		;溢出错误。
	setb	R_FLAG2.B_CHR_ERR

LI_END:
	ret


;功能:四字节二进制无符号数除以双字节无符号数。
;入口:被除数在 R2(H)、R3、R4、R5(L)中,除数在R6(H)R7(L)中。
;出口:OV=0 时,双字节商在 R2(H)、R3(L)中;OV=1 溢出。
;资源:PSW、A、B、R1 ~ R7。

DIVDE42:
	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 	;计算(R2R3-R6R7)。
	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 	;计算完十联位商(R4R5)。
	MOV A,R4 	;将商移到R2R3中。
	MOV R2,A
	MOV A,R5
	MOV R3,A
	CLR OV 		;设立成功标志。
	RET

;功能: 两个双字节二进制无符号数相乘。
;入口:被乘数在 R2(H)、R3(L)中,乘数在R6(H)R7(L)中。
;出口:乘数在R2(H)、R3、R4、R5(L)中。
;资源:PSW、A、B、R2 ~ R7。

MUL22:	
	push	B
	MOV	A,R3	;??R3?R7
	MOV	B,R7
	MUL	AB
	MOV	R4,B	;?????
	MOV	R5,A
	MOV	A,R3	;??R3?R6
	MOV	B,R6
	MUL	AB
	ADD	A,R4	;?????
	MOV	R4,A
	CLR	A
	ADDC	A,B
	MOV	R3,A
	MOV	A,R2	;??R2?R7
	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	;??R2?R6
	MOV	B,R6
	MUL	AB
	ADD	A,R3	;?????
	MOV	R3,A
	MOV	A,R2
	ADDC	A,B
	MOV	R2,A

	pop	B
	RET

⌨️ 快捷键说明

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