[lc3]汇编实现二分查找(Binary Search)找函数零点

Find the zeros of a polynomial

 

Purpose

(1)主要目标:用BinarySearch的方法实现在给定区间上的单调多项式函数的零点查找。

(2)具体要求: 1.要求对f(x)的计算采用subroutine来实现,x存放在R0中且将结果存放在R4中,要求不能修改其他寄存器的内容。

                 2.要求必须采用二分查找。

                 3.

 

(3)一些前提假设:

1.xlow is always smaller than xhigh.

2.f(x) can always be expressed with 16bits.

3.All intervals will contain a zero. l If f(x)= 0, then x is an integer.

4.f(xlow) and f(xhigh) are not zeros.

5.x1 + x2 can always be expressed with 16bits for all values of x1 and x2 in the interval

 

 

Principle

1.     本次实验中主要分为三个部分,对应三个文件,其中f(x)的计算以及divide by 2均通过subroutine来实现

2.     f(x)的计算利用了Horner's rule,可以例示为Ax^3 + Bx^2 + Cx + D = ((Ax + B)x + C)x + D。然后通过循环迭代的方法实现,每次迭代计算式子Ax + B,然后计算结果作为下一次迭代中的A。

3.     2中提到计算Ax+ B,计算时,针对A的正负采取不同的处理,若A为正则利用累加的方法计算Ax,反之采用的是反复减去x得到负值。

4.     除以二时采用的时遍历的方法,遍历所有同符号绝对值小于被除数的值,然后验证是否为被除数X的[X/2]。

 

Procedure

代码分析

1.主routine

            

  .ORIGx3000

              LDIR2,XLOW

              LDIR3,XHIGH

 

LOOP     ADDR0,R2,R3

              LDR6,DIVIDE               ;计算区间中值

              JSRRR6

              LDR6,FUNCTION        ;计算中值处的函数值

              JSRRR6

              ADDR4,R4,#0             ;判断正负,并据此进行不同跳转,进行后续判断

              BRzOVER

              BRnBRANCH

              BRpBRANCH3

              BRnzpLOOP

 

BRANCH ADD R5,R0,#0

              ADDR0,R2,#0

              LDR6,FUNCTION

              JSRRR6               

              ADDR4,R4,#0

BRp BRANCH2            ;判断一个边界处函数值正负,若为正则用中值代替此边界

              ADDR2,R5,#0             ;反之若为负则用种植代替另外一个边界,下面类似

              BRnzpLOOP               ;本质是判断符号是否相同,异号才能作为新区间的边界

 

BRANCH2 ADD R3,R5,#0          

              BRnzpLOOP

 

BRANCH3     ADDR5,R0,#0

              ADDR0,R2,#0

              LDR6,FUNCTION

              JSRRR6

              ADDR4,R4,#0

              BRnBRANCH4

              ADDR2,R5,#0

              BRnzpLOOP

 

BRANCH4 ADD R3,R5,#0

              BRnzpLOOP

 

OVER     STIR0,SAVE

              HALT

SAVE      .FILLx4000

XLOW    .FILLx4001

XHIGH    .FILLx4002

DEGREE  .FILLx4003

START    .FILLx4004

FUNCTION .FILL x5000

DIVIDE    .FILLx6000

.END

 

2.计算f(x)的subroutine的部分

FUNCTION    STR2,SAVER2

                     ST R3,SAVER3

                     ST R5,SAVER5

                     ST R6,SAVER6              ;存储调用寄存器的初值

      

                     LDI R2,DEGREE

                     LDI R4,START

                     LD R5,START

 

FLOOP   ANDR3,R3,#0

              ADD R4,R4,#0

              BRn NLOOP

 

PLOOP   ADDR3,R3,R0

              ADD R4,R4,#-1

              BRp PLOOP  

              BRnzp CMP   ;R4=0            ;A为正数时累加计算AX

 

NLOOP  NOTR6,R0

              ADD R6,R6,#1

              ADD R3,R3,R6

              ADD R4,R4,#1

              BRn NLOOP                       ;A为负数时累减计算AX

 

 

CMP       ADDR5,R5,#1

              LDR R4,R5,#0

              ADD R4,R3,R4

              ADD R2,R2,#-1

              BRp FLOOP                        ;计算AX+B然后迭代

      

              LD R2,SAVER2

              LD R3,SAVER3     

              LD R5,SAVER5

              LD R6,SAVER6

              RET                                    ;将寄存器的值复原

 

3.divide by 2,主要是遍历以及判断,思想较为简单,此处略去不作分析

 

 

Result

一些测试以及结果验证:


mark

除法的实现采用遍历,私以为效率极差,但是未发现更好地方法。除以2用位移操作可能更为方便,但是没有对应指令。此处也许可以优化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值