以下の C++ コードを MIPS に変換する作業を行っています (これは、私が立ち往生しているプログラムのほんの一部です)。$t
指定された配列値を取得するようにレジスタを設定する方法の要点は理解していますが、 m 完全に立ち往生
pos[count] = i;
sw
、を試しましlw
たが、これらを試すたびに、範囲外の例外などのアドレスが表示されます。
誰かがここで何がうまくいかないのか説明できますか? ループが に到達したら、ループの反復ごとにからにpos[count] = i
変更する必要があります。の-1を調整する必要があるため、エラーが発生していますか?pos[count]
0xffffffff
(i)
pos[]
私は完全に道に迷っており、この問題に十分に類似した説明を見つけることができませんでした。
(MIPS には非常に多くのタブ付き行があるため、書式設定についてお詫びします。ここに投稿するための書式設定は非常に風変わりです)
.data
x: .word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
pos: .word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
d: .word 73
.word 47
.word 23
.word 26
.word 67
.word 99
.word 13
.word 53
.word 1
.word 97
sp: .asciiz " "
endl: .asciiz "\n"
# $s0 count
# $s1 key
# $s2 i
.text
main: addi $s0, $0, 0 # int count = 0;
addi $s1, $0, 24 # int key = 24;
addi $s2, $0, 0
la $s3, d
la $s4, pos
la $s5, x
# for (int i=0; i<10; i++) {
loop: mul $t0, $s2, 4 # if (d[i] >= key) {
add $t0, $t0, $s3
lw $t0, ($t0)
blt $t0, $s1, loop1
sll $t1, $s0, 2 # $t1 = count * sizeof(int)
addu $t2, $s4, $t1 # $t2 = &pos[count];
lw $t2, ($t2) # $t2 = pos[count];
add $t3, $s5, $t1 # $t3 = &x[count];
lw $t3, ($t3) # $t3 = x[count];
sw $s2, ($t2) # pos[count] = i;
# x[count] = d[i];
loop1: addi $s2, $s2, 1 # i++;
addi $s0, $s0, 1 # count++;
# }
# }
同等の C++ コードは次のとおりです。
#include <iostream>
using namespace std;
int x[10] = {0};
int pos[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
int d[10] = {73, 47, 23, 26, 67, 99, 13, 53, 1, 97};
int main() {
int count = 0;
int key = 24;
for (int i=0; i<10; i++) {
if (d[i] >= key) {
pos[count] = i;
x[count] = d[i];
count++;
}
}
for (int i=0; i<10; i++) {
if (pos[i] < 0)
break;
cout << pos[i] << " " << x[i] << endl;
}
}