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

📄 sqrt.asm

📁 功能:pic单片机四字节无符号数开方 入口条件:被开方数在S2,S3,S4,S5 出口信息:平方根在S2,S3中
💻 ASM
字号:
	
;R2 R3 R4 R5    R6    R7
;S2 S3 S4 S5   TEMP1 TEMP0
	MOVF	S2,W
	IORWF	S3,W
	IORWF	S4,W
	IORWF	S5,W
	BNZ		SH40
	RETURN
	SH40
 	CLRF	TEMP0 ;左规次数初始化
	MOVF	S2,W
	SH41
 	ANDLW 0C0H ;被开方数高字节小于40H否?
	BNZ SQRH ;不小于40H,左规格化完成
	MOVLW	.2
	MOVF	TEMP1,F ;每左规一次,被开方数左移两位
	SH42
	BCF	STATUS,C ;被开方数左移一位
	MOVF	S5,W
	RLCF	W 
	MOVWF	S5,F
	MOVF	S4,W
	RLCF	W 
	MOVWF	S4,F
	MOVF	S3,W
	RLCF	W 
	MOVWF	S3,F
	MOVF	S2,W
	RLCF	W 
	MOVWF	S2,F
	decfsz TEMP1,F ;被开方数左移完两位
	goto	SH42
	INCF TEMP0 ;左规次数加一
	GOTO SH41 ;继续左规
	SQRH
	MOVF S2,W ;规格化后高字节按折线法分为三个区间
	ADDLW 57H
	BC SQS2
	ADDLW 45H
	BC SQR1
	ADDLW 24H
;************************
	MOVWF	TEMPA
	MOVLW   0E3H ;第一区间的斜率
	MOVWF	TEMPB            ;***************************OK
;*********************************
	MOVLW 80H ;第一区间的平方根基数
	MOVWF	S4
	GOTO SQS3
	SQR1 
	MOVLW 0B2H ;第二区间的斜率
	MOVWF	TEMPB
	MOVLW	0A0H
	MOVWF	S4;第二区间的平方根基数
	GOTO SQS3
	SQS2
	MOVLW 8DH ;第三区间的斜率
	MOVWF	TEMPB
	MOVLW 0D0H;第三区间的平方根基数
	MOVWF	S4
	SQS3
	MOVF	TEMPA,W
	MULWF TEMPB ;与区间基点的偏移量乘区间斜率
	MOVF	PRODL,W			;PRODL乘机LOW 8BIT	
	ADDWF S4,W ;累加到平方根的基数上
	MOVWF	S4	                       
	MOVF TEMPB,W
	MULWF TEMPB ;求当前平方根的幂
	MOVF	PRODH,W
	MOVFF	S3,TEMPD
	MOVWF	S3
	MOVF	TEMPD,W
	;MOVF	S3,W ; XCH A,S3 ;求偏移量(存放在S2S3中)
	BCF	STATUS,C
	SUBFWB	S3,W
	MOVWF	S3                      
	MOVF	S2,W
	SUBFWB	TEMPB,W                        
	MOVWF S2
	SQS4
	BSF	STATUS,C ;用减奇数法校正一个字节的平方根
 	MOVF S4,W ;当前平方根的两倍加一存入S5R6中
	RLCF  W
	MOVWF TEMP1
	CLRF W
	RLCF W
	MOVWF S5
	MOVF S3,W ;偏移量小于该奇数否?
	SUBFWB TEMP1,W
	MOVWF TEMPB
	MOVF S2,W
	SUBFWB S5,W
	BC SQS5 ;小于,校正结束,已达到一个字节的精度
	INCF S4 ;不小于,平方根加一
	MOVWF S2 ;保存新的偏移量
	MOVFF TEMPB,S3
	GOTO SQS4 ;继续校正
	SQS5
	MOVF S4,W ;将一个字节精度的根存入S2
	MOVFF	S2,TEMPD
	MOVWF	S2
	MOVF	TEMPD,W
	RRCF	W

;***********************************************************
	BCF 	F0,0
	BTFSS	STATUS,C
	GOTO	SSSSS					
	BSF	FO,0   ;保存最终偏移量的最高位
;****************************************************************
	SSSSS  
	MOVF  S3,W
	MOVWF S5 ;将最终偏移量的低八位存入S5中
	MOVLW  .8
	MOVWF  S4 ;通过(S5R6/S2)求根的低字节
	SQR6
	BCF	STATUS,C    ;CLR C
	MOVF S3,W
	RLCF W
	MOVWF S3
	BCF	STATUS,C ; C
	MOVF S5,W   ;MOV A,S5
	SUBFWB	S2,W
	BTFSS F0,0   ;SQR7
	BC SQR8
	SQR7
	MOVWF S5
	INCF S3
	SQR8
	BCF	STATUS,C  ; C
	MOVF	S5,W
	RLCF W
	MOVWF S5
;******************************************8
	BCF 	F0,0
	BTFSS	STATUS,C
	GOTO	SSS					
	BSF	FO,0
	SSS  ;                        MOV F0,C

	DECFSZ S4,F
	GOTO SQR6 ;根的第二字节计算完,在S3中
	MOVF TEMP0,W ;取原被开方数的左规次数
	BZ SQRE ;未左规,开方结束
	SQR9
	BCF	STATUS,C  ; CLR C ;按左规次数右移平方根,得到实际根
	MOVF  S2,W
	RRCF W
	MOVWF S2
	MOVF S3,W
	RRCF W
	MOVWF S3
	DECFSZ  TEMP0,F
	GOTO SQR9
	SQRE: RET

		

⌨️ 快捷键说明

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