我正在努力将下面的 C++ 代码翻译成 MIPS(这只是我坚持的程序的一小部分),并且我了解如何设置$t
寄存器以获取给定的数组值的要点,但是我' m 完全卡在
pos[count] = i;
我试过了sw
,lw
但是每次我尝试这些时,我都会得到地址超出范围的异常/等等。
有人可以向我解释这里出了什么问题吗?当循环到达时pos[count] = i
,我需要为每次循环迭代pos[count]
从0xffffffff
to更改。(i)
出现错误是因为我需要调整 -1pos[]
吗?
我完全迷失了,无法找到与这个问题足够相似的任何解释。
(对格式表示歉意,因为 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;
}
}