;=======================SQRT开方子程序===================
;算法采用牛顿迭代公式:X=SQRT(c) ==> Xk=[Xk+(C/Xk)]/2, Xk初值为512
;p1为待开方数的高16位
;p2为待开方数的低16位
;p3为初值
;p4为循环次数
SQRT .macro p1,p2,p3,p4,p5
LDP #4
MAR *,AR3
LAR AR1,p1 ;保留原开方数高16位
LAR AR2,p2 ;保留原开方数低16位
LAR AR3,p4 ;循环次数
SQRTING:p5:
;-----C/Xk
LACC p1,16
OR p2
SFL
SACH p1
SACL p2
LACC p1
rpt #15
subc p3
sacl p1 ;p1为商的高16位
xor p1
or p2
rpt #15
subc p3
sacl p2 ;p2为商的低16位
LACC p1,16
OR p2
ADD #1 ;四舍五入
SFR
;-----(C/Xk)+Xk
ADD p3
;-----[(C/Xk)+Xk]/2
SFR
SACL p3 ;p3即为解
SAR AR1,p1 ;还原待开方数的高16位
SAR AR2,p2 ;还原待开方数的低16位
BANZ SQRTING:p5:
.endm |