[解決済み] 配列のループ処理 MIPSアセンブリ
2022-02-10 22:59:13
質問内容
10個の数値からなる配列をループするプログラムを作成しています。最初の9個の要素は0より大きい値を持ち、10個目の要素は0である。ループは0に遭遇したときに中断する必要がある。
i=0;
while(A[i]!=0)
{
A[i]=A[i]+1;
i++;
}
レジスタの値が0になったら'beq'を使ってループを解除できることは知っていますが、メモリ内の値の操作については十分な知識がありません。
初めてMIPSを使ったので、ごちゃごちゃしているのがわかると思います。もし、解決できないのであれば、何かポイントを教えていただけませんか?
.data #by default, the "data segment" starts at address 0x10010000
.word 1
.word 2
.word 3
.word 4
.word 5
.word 6
.word 7
.word 8
.word 9
.word 0
.text #instructions start below
# MIPS assembly code
lui $a0, 0x1001 # $a0 = 0x10010000
addi $a1, $zero, 0 # i = 0
jal increment # call the procedure
ここが一番迷うところです。
increment:
lui $a0, 0x1001 # $a0 = 0x10010000
beq $a0, $zero, else # if $a0 holds 0 goto 'else'
addi $a0, $a0, 2 # +2
addi $a1, $zero, 1 # i = i + 1
jr $ra #jump to caller
v0は、増分されたすべての値の合計を保持する必要があります。
else:
add $a0, $v0, $zero #copy result as input to syscall
addi $v0,$zero,1 #service 1 for syscall is print integer
syscall
無限ループで終了します。
infinite: j infinite
解決方法は?
メモリから値をロードするには、ロード命令(
lw
,
lh
または
lb
はワード、ハーフワード、バイトの場合)。
lw $a1, 0($a2) # load a word from the address in $a2 + offset 0 to $a1
で値をメモリに書き込むには、例えばstoreコマンドのいずれかを使用します。
sw $a1, 0($a2) # store the word in $a1 into the address in $a2 + offset
レジスタへのアドレスのロードは、例えば la を使って行われます。
la $a2, label_of_array # load the address of the label 'label_of_array' into $a2
さて、配列の中の値を操作するには、上の3つの命令を組み合わせる必要があります。
la $a1, label_of_array # load the address of the array into $a1
lb $a2, 0($a1) # load a byte from the array into $a2
addi $a2, $a2, 1 # increment $a2 by 1
sb $a2, 0($a1) # store the new value into memory
addi $a1, $a1, 1 # increment $a1 by one, to point to the next element in the array
そしてもう一点。
あなたは次のように書きました。
addi $a1, $zero, 1 # i = i + 1
が、これは間違いです。あなたがしたことは
$zero + 1
である。
1
を
$a1
. をインクリメントするために
$a1
と書く必要があります。
addi $a1, $a1, 1
の結果を保存します。
$a1 + 1
を
$a1
.
関連
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] Bashで文字列の配列をループする?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】配列に何かを追加する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み] struct has no member named
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない