Mips单精度(涉及牛顿法)

时间:2012-03-27 04:52:33

标签: assembly mips mips32

我在计算机拱门课程中,我们正在使用单精度进行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

1 个答案:

答案 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指令集不知道对屏幕的打印意味着什么。打印到屏幕涉及与其他硬件通信,因此要回答该问题,您需要知道主板上的硬件。