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

📄 ch22.asm

📁 通过调试的有用的单片机控制程序
💻 ASM
字号:
;入口条件:被开方数在R2、R3中
;出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数
;影响资源:PSW、A、B、R2~R7    堆栈需求:  2字节
;算法g(x)=x/2+A/(2x)(牛顿平方根法)
SH2:    MOV	A,R2
        ORL	A,R3
        JNZ	SH20
        RET	                ;被开方数为零,不必运算
SH20:   MOV	R7,#0	        ;左规次数初始化
        MOV	A,R2
SH22:   ANL	A,#0C0H		;被开方数高字节小于40H否?
        JNZ	SQRH		;不小于40H,左规格化完成,转开方过程
        CLR	C		;每左规一次,被开方数左移两位
        MOV	A,R3
        RLC	A
        MOV	F0,C
        CLR	C
        RLC	A
        MOV	R3,A
        MOV	A,R2
        MOV	ACC.7,C
        MOV     C,F0
        RLC	A
        RLC	A
        MOV	R2,A
        INC	R7		;左规次数加一
        SJMP	SH22		;继续左规
SQRH:	MOV	A,R2    	;规格化后高字节按折线法分为三个区间
	ADD	A,#57H
	JC	SQR2
	ADD	A,#45H
	JC	SQR1
	ADD	A,#24H
	MOV	B,#0E3H		;第一区间的斜率
	MOV	R4,#80H		;第一区间的平方根基数
	SJMP	SQR3
SQR1:	MOV     B,#0B2H		;第二区间的斜率
	MOV	R4,#0A0H	;第二区间的平方根基数
	SJMP	SQR3
SQR2:	MOV	B,#8DH		;第三区间的斜率
	MOV	R4,#0D0H	;第三区间的平方根基数
SQR3:	MUL	AB		;与区间基点的偏移量乘区间斜率
	MOV	A,B
	ADD	A,R4		;累加到平方根的基数上
	MOV	R4,A
	MOV	B,A
	MUL	AB		;求当前平方根的幂
	XCH	A,R3		;求偏移量(存放在R2R3中)
	CLR	C
	SUBB	A,R3
	MOV	R3,A
	MOV	A,R2
	SUBB	A,B
	MOV	R2,A
SQR4:	SETB	C		;用减奇数法校正一个字节的平方根
	MOV	A,R4		;当前平方根的两倍加一存入R5R6中
	RLC	A
	MOV	R6,A
	CLR	A
	RLC	A
	MOV	R5,A
	MOV	A,R3		;偏移量小于该奇数否?
	SUBB	A,R6
	MOV	B,A
	MOV	A,R2
	SUBB	A,R5
	JC	SQR5		;小于,校正结束,已达到一个字节的精度
	INC	R4			;不小于,平方根加一
	MOV	R2,A		;保存新的偏移量
	MOV	R3,B
	SJMP	SQR4		;继续校正
SQR5:	MOV	A,R4		;将一个字节精度的根存入R2
	XCH	A,R2
	RRC	A
	MOV	F0,C		;保存最终偏移量的最高位
	MOV	A,R3
	MOV	R5,A		;将最终偏移量的低八位存入R5中
	MOV	R4,#8		;通过(R5R6/R2)求根的低字节
SQR6:	CLR	C
	MOV	A,R3
	RLC	A
	MOV	R3,A
	CLR	C
	MOV	A,R5
	SUBB	A,R2
	JB	F0,SQR7
	JC	SQR8
SQR7:	MOV	R5,A
	INC	R3
SQR8:	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	F0,C
	DJNZ	R4,SQR6		;根的第二字节计算完,在R3中
	MOV	A,R7		;取原被开方数的左规次数
	JZ	SQRE		;未左规,开方结束
SQR9:	CLR	C		;按左规次数右移平方根,得到实际根
	MOV	A,R2
	RRC	A
	MOV	R2,A
	MOV	A,R3
	RRC	A
	MOV	R3,A
	DJNZ	R7,SQR9
SQRE:	SJMP      $
        END

⌨️ 快捷键说明

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