汇编程序:用减奇数法开平方(16位)

使用减奇数法,进行16位数的开平方运算。
-------------------------------------------------------
命题:从 1 开始,连续 n 项奇数,等差数列求和,可以得到 n^2。

证明如下:

已知:1 + 3 + 5 + ... + (2n - 1) = (1 + (2n - 1)) * (n / 2) = n^2

对于任意正整数 N,都会有:N = n^2 + ε

式中ε是不可开方的、小于 2n - 1 的误差。

即有:N = 1 + 3 + 5 + … + (2n - 1) + ε

开方时,可在 N 中逐次减去 1、3、5、...,直到不够减为止,够减的次数 n,即为 N 的平方根的整数部分。

这种求平方根的方法,相比于牛顿迭代法等其它的方法,效率是最高的。
;==========================================
51单片机的程序如下。
设被开方数已经存在R2R3中,平方根存到R4中。
;------------------------------------------------------
;入口参数:R2 R3中为16位的被开方数 N
;出口参数:R4中为8位的平方根 n
SQRT16:
        PUSH  PSW             ;保护现场
        MOV   R4,  #0         ;从 0 开始
SQSTART:
        SETB  C               ;R4 = 0 时,减 1、=1 时,减 3、…
        CALL  R23JR4          ;调用子程序,R2R3-R4-1
        JC    ENDSQR          ;不够减时,转结束
        CALL  R23JR4          ;再调用子程序,R2R3-R4-0
        JC    ENDSQR
        INC   R4              ;够减,R4 加 1,即为根 n
        SJMP  SQSTART         ;继续去减
ENDSQR:
        POP   PSW
        RET                   ;开方结束了,平方根 n 在 R4
;-------------------------------
;入口参数:R2 R3 中为 16 位被减数,R4 中为 8 位减数
;出口参数:够减时Cy=0,R2 R3中为16位差数;不够减时Cy=1
;使用寄存器:A、PSW
R23JR4:
        MOV   A,  R3
        SUBB  A,  R4          ;R3-R4-Cy → A
        MOV   R3, A
        MOV   A,  R2
        SUBB  A,  #0          ;R2-0-Cy → A
        MOV   R2, A
        RET
;==========================================
8086的汇编程序(核心部分)如下。
;------------------------------------------------------
        MOV   AX, [data]      ;取来 N
        MOV   BX, 1           ;首项为 1
        MOV   CX, 0
_S_LOOP:
        SUB   AX, BX
        JC    _END            ;减,到有借位为止
        INC   BX              ;修改为 3、5、7...
        INC   BX
        INC   CX              ;n加1
        JMP   _S_LOOP         ;反复的减
_END:
        MOV   [root],CX      ;保存n
;------------------------------------------------------
;==========================================
就这些了。

按照同样的思路,可以编写出进行计算阶乘的子程序FACT16,不知那位网友肯来试试?

参见:http://zhidao.baidu.com/question/126469882.html

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值