我在计算机拱门课程中,我们正在使用单精度进行mips。作业涉及创建牛顿方法。我已经编写了所有必需的功能,但无法弄清楚代码究竟出了什么问题。我也不确定如何将值打印到屏幕上。非常感谢所有帮助。我已经逐行写了评论来解释我在做什么。
这是我的代码:
# Newtons Method
# g(x) = (-x^3) + 11
# g'(x) = -3x^2
.data
precision: .float .00001
main:
jal newtons_gee
newtons_top:
li $s2, 11 # stores 11 into the $s2 register
mtc1 $s2, $f5 # moves the value of $s1 (3) to the coproc 1
mul.s $f1,$f0,$f0 # This finds x^2
mul.s $f1,$f0,$f1 # This finds x^3
add.s $f2,$f1,$f5 # adds the value of (x^3) + 11 and stores it into $f2 as asked
newtons_bot:
li $s1, -3 # stores -3 into the $s1 register
mtc1 $s1, $f3 # moves the value of $s1 (-3) to the coproc 1
mul.s $f5, $f3,$f0 # Calculating -3x in derivative of the original function
mul.s $f4,$f5,$f0 # Calculates -3x^2 and stores it in $f4 as asked
newtons_err:
jal newtons_top # Calls newtons_top
jal newtons_bot # Calles newtons_bot
div.s $f6,$f2,$f4 # Calculates g(Xn)/ g'(Xn) and stores it in $f6 as asked
newtons_nth:
addi $a0,$a0,1 # Increases the current iteration by 1
jal newtons_err # Call newtons_err
sub.s $f7,$f0,$f6 # Calculate value of En
mov.s $f7,$f0 # Find the new nth
abs.s $f3, $f3 # Flag Case
l.s $f9, precision # Precision
c.lt.s $f3, $f9 # set the flag if |x'-x| < 0.00001 stores in $v0
j newtons_nth # Repeat
newtons_gee:
li $f0, 1 # Sets the Xn to 1
li $a0, 1 # Sets the current iteration
jal newtons_nth # Calls newtons_nth
答案 0 :(得分:3)
一些提示:
当你调用一个函数时,你需要返回,否则你的代码将继续下一部分。 Newtons_top将运行到newtons_bot,newtons_bot将运行到newtons_err,然后它们将再次被调用,导致无限循环。 标签只是标签;它们不会神奇地结束您的功能。当您使用$ra
指令时,返回地址会自动加载到jal
。因此,您可以使用jr $ra
。
当你有嵌套调用时,例如在newtons_err中,你的$ra
被压扁了。因此,您需要在使用$ra
之前备份jal
,然后在返回之前将其恢复。
你的循环什么时候结束?您没有退出条件。您正在检查精度,但之后没有条件跳转。它会永远持续下去。
您想要使用11和-3的值,但是您没有正确地将它们加载到浮点寄存器中。当您使用mtc1
时,您将逐字复制值。问题是11作为一个整数不与浮点数11相同。您需要一条额外的指令将其转换为浮点数:
cvt.s.w $f5, $f5
以下是包含该转化的参考:http://www.doc.ic.ac.uk/lab/secondyear/spim/node20.html
li $f0, 1
无效。您实际上无法将立即加载到浮点寄存器中。您可以使用与11和-3相同的方法,但仍需要上面的转换说明。
由于您正在将常量(11,-3,1)加载到浮点寄存器中,因此您可以通过在数据部分中将它们声明为浮点数来保存指令,并使用l.s $fX, someLabel
代替{{ 1}} - &gt; li $s2, someConstant
。
MIPS指令集不知道对屏幕的打印意味着什么。打印到屏幕涉及与其他硬件通信,因此要回答该问题,您需要知道主板上的硬件。