1

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

1 回答 1

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而不是li $s2, someConstant->来保存指令mtc1 $s2, $fX

  • MIPS 指令集不知道打印到屏幕意味着什么。打印到屏幕涉及与其他硬件的通信,因此要回答这个问题,您需要知道板上的硬件是什么。

于 2012-03-27T22:25:43.753 回答