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

📄 开方.asm

📁 开发平台,任一MCS-51单片机上,很多程序,如键盘,显示,液晶驱动
💻 ASM
字号:
      org  00h
      sjmp  start
      org  30h
start:     mov  r2,#00H
           mov  r3,#0aH
           mov  r4,#0FcH
           mov  r5,#80H
           lcall  sh4
           mov  40h,r2
           mov  41h,r3
           nop
           nop
           sjmp $
;*****************************************************
;*****************************************************
;标号:  SH4    功能:四字节二进制无符号数开平方(快速)
;入口条件:被开方数在R2、R3、R4、R5中。 注意高字节是R2
;出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:PSW、A、B、R2~R7    堆栈需求:  2字节
;*****************************************************
SH4:	MOV	A,R2
	ORL	A,R3
	ORL	A,R4
	ORL	A,R5
	JNZ	SH40
	RET		;被开方数为零,不必运算
SH40:	MOV	R7,#0	;左规次数初始化
	MOV	A,R2
SH41:	ANL	A,#0C0H	;被开方数高字节小于40H否?
	JNZ	SQRH	;不小于40H,左规格化完成
	MOV	R6,#2	;每左规一次,被开方数左移两位
SH42:	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
	MOV	A,R2
	RLC	A
	MOV	R2,A
	DJNZ	R6,SH42	;被开方数左移完两位
	INC	R7	;左规次数加一
	SJMP	SH41	;继续左规
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:	RET
;*********************************************************
;*********************************************************

⌨️ 快捷键说明

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