Assembly Mips单精度(涉及牛顿法)

Assembly Mips单精度(涉及牛顿法),assembly,mips,mips32,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,

我在一门计算机拱门课上,我们正在使用单精度进行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
#牛顿法
#g(x)=(-x^3)+11
#g'(x)=-3x^2
.数据
精度:.float.00001
主要内容:
日航纽顿斯吉
纽顿大学top:
li$s2,11#将11存储到$s2寄存器中
mtc1$s2,$f5#将$s1(3)的值移动到coproc 1
mul.s$f1,$f0,$f0#这是x^2
mul.s$f1,$f0,$f1#这会找到x^3
add.s$f2,$f1,$f5#将(x^3)+11的值相加,并按要求将其存储到$f2中
纽顿机器人:
li$s1,-3#将-3存储到$s1寄存器中
mtc1$s1,$f3#将$s1(-3)的值移动到coproc 1
mul.s$f5、$f3、$f0#计算原始函数导数中的-3x
mul.s$f4,$f5,$f0#计算-3x^2并按要求将其存储在$f4中
牛顿错误:
日本航空公司的纽顿公司叫纽顿公司
日本航空公司的牛顿机器人称为牛顿机器人
div.s$f6,$f2,$f4#计算g(Xn)/g'(Xn)并按要求将其存储在$f6中
牛顿:
addi$a0,$a0,1#将当前迭代增加1
日航纽顿厄尔号,叫纽顿厄尔号
sub.s$f7、$f0、$f6#计算En值
mov.s$f7,$f0#查找新的第n个
abs.s$f3,$f3#标志箱
l、 新加坡元f9,精度#精度
c、 lt.s$f3,$f9 |如果| x'-x |<0.00001存储在$v0中,则设置标志
牛顿,重复一遍
牛顿·欧吉:
li$f0,1#将Xn设置为1
li$a0,1#设置当前迭代
日航纽顿公司叫纽顿公司
一些提示:

  • 调用函数时,需要返回,否则代码将继续下一节。Newtons\u top会遇到Newtons\u bot,Newtons\u bot会遇到Newtons\u err,然后它们会再次被调用,导致一个无限循环。标签只是标签;它们不会神奇地结束你的功能。使用
    jal
    指令时,返回地址会自动加载到
    $ra
    中。因此,您可以使用
    jr$ra
    返回

  • 当您有嵌套调用时,例如在newtons\u err中,您的
    $ra
    会被挤压。因此,在使用
    jal
    之前,您需要备份
    $ra
    ,然后在返回之前还原它

  • 你的循环什么时候结束?你没有退出条件。您正在检查精度,但之后没有条件跳转。它将永远持续下去

  • 您希望使用11和-3的值,但没有将它们正确加载到浮点寄存器中。当您使用
    mtc1
    时,您正在逐字复制值。问题是,作为整数的11与作为浮点的11不同。您需要一条附加指令将其转换为浮点:

    cvt.s.w$f5,$f5

    以下是包含该转换的引用:

  • li$f0,1
    无效。实际上,不能将立即数加载到浮点寄存器中。您可以使用与11和-3相同的方法,但仍然需要上面的转换指令

  • 由于您正在将常量(11,-3,1)加载到浮点寄存器中,因此可以通过在数据节中将它们声明为浮点,并使用
    l.s$fX,someLabel
    而不是
    li$s2,someConstant
    ->
    mtc1$s2,$fX
    来保存指令

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


非常感谢您的建议!非常需要帮助:)你在使用火星模拟器吗?如果是这样的话,检查一下打印值:我应该把jr$ra放在哪里?我明白你的意思,只是不确定放在哪里?你应该把它放在每个子程序的末尾。所以对于newtons_top,你会把它放在add.s之后;对于newtons\u bot,您将把它放在第二个mul.s.之后。对于newtons\u err和newtons\n,您也应该有它,但您需要先将$ra复制到另一个寄存器,因为嵌套的jal将覆盖它。