1

私はコンピューターアーチクラスに所属しており、単精度を使用してmipsを実行しています。宿題にはニュートン法の作成が含まれます。必要なすべての関数を記述しましたが、コードの何が問題になっているのか正確に理解できません。また、値を画面に出力する方法も正確にはわかりません。すべての助けは大歓迎です。私がしていることを説明するために、コメントを1行ずつ書いています。

これが私のコードです:

# 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は無効です。即時をfloatレジスタに実際にロードすることはできません。11と-3で使用したのと同じ方法を使用できますが、上記の変換手順が必要です。

  • 定数(11、-3、1)をfloatレジスタにロードしているので、データセクションで定数(11、-3、1)をfloatとして宣言し、 ->l.s $fX, someLabelの代わりに使用することで命令を保存できます。li $s2, someConstantmtc1 $s2, $fX

  • MIPS命令セットは、画面への印刷が何を意味するかを認識していません。画面への印刷には他のハードウェアとの通信が含まれるため、その質問に答えるには、ボード上にあるハードウェアを知る必要があります。

于 2012-03-27T22:25:43.753 に答える