📄 sqrt.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 + -