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用位移操作可能更为方便,但是没有对应指令。此处也许可以优化。