ここで最も簡単な部分は、ループを記述することです。それについては私がお手伝いします。私はかなり錆びていますが、あなたが始められるように最善を尽くします。
ループは、一時値、即値の追加、分岐命令、および/またはジャンプ命令によって実現できます。
探している基本的なフローは次のようになります。
- カウント変数を作成します (例として、for (int i=..; i < ...; i++) の i 部分)
- ループの開始命令にラベルを付けます (以下のようになります) label_name: ループ命令
- ループ命令を実行する
- ステップ1からループ変数を増やします
- $s2 に 2*n+74 を入力します (これが現在の部分です)
- カウンターが目的の反復回数と等しくない場合は、ループの先頭に分岐します。注: 十分なループ命令がある場合は、より複雑な分岐/ジャンプ構造を使用する必要がある場合があります。
ループコードの例:
andi $t1, $t1, 0 # set a counter variable to 0 (t1)
loop:
# do some work - whatever you want to accomplish by looping
addi $t1, $t1, 1 # increment the counter
add $s2, $s1, $s1 # this is the code you devised
addi $s2, $s2, 74
bne $s2, $t1, loop #branch to the beginning of the loop if you need more iterations
次に必要な部分は、メモリ アドレスで値を取得することです。それにはいくつかの方法があります。MIPS で利用可能なロード/ストア命令を調べる必要があります。特にlw(ロードワード)命令を活用したいと思うと思います。
lw r1, label -> 'label' に格納されているアドレスに格納されているメモリからワードをレジスタ r1 にロードします
私は少しグーグルで検索し、http://pages.cs.wisc.edu/~cs354-2/cs354/karen.notes/MAL.instructions.htmlにいくつかの合理的な説明とそれらの指示の例がありました。
特定のビットにアクセスするには、いくつかのビット操作を利用する必要があります。特に、ビットシフトとマスキングが役立つと思います。
MIPS は、あなたが好きかもしれないいくつかの指示を提供します:
sll d, s1, s2 d = s1 の s2 桁分の論理左シフト
sra d, s1, s2 d = s1 の s2 桁の算術右シフト
srl d, s1, s2 d = s1 の s2 桁分の論理右シフト
および d、s1、s2 d = s1 & s2; ビットごとの AND
-- 上で引用した情報源より
あなたの質問に答えるのに十分であり、少なくとも問題に取り掛かることができないことを願っています. 宿題のように聞こえるので、コードを手渡したくありませんでした。不明な点や説明が必要な場合は、その旨をお伝えください。
そのすべての少なくとも一部があなたに役立つことを願っています!