我正在將以下C++代碼翻譯成MIPS(這只是我卡住的程序的一小部分),並且我理解如何設置$t
寄存器以獲取給定的數組值的要點,但我完全停留在MIPS中的整數數組:將array [index]設置爲迭代值i?
pos[count] = i;
我試過sw
,lw
,但每次我嘗試這些,我得到的地址超出範圍例外的/ etc。
有人可以向我解釋這裏出了什麼問題嗎?當循環達到pos[count] = i
時,我需要將pos[count]
從0xffffffff
更改爲(i)
用於每個循環迭代。錯誤是因爲我需要調整-1的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;
}
}
我無法制作此正面或反面。如果你展示了你想要複製的C++代碼,那麼這將會很有幫助,然後我們就會知道這個應該做什麼。 –
Gotcha。我只是在帖子底部添加了C++等價物。 我的主要問題是翻譯pos [count] = i;和x [count] = d [i]; MIPS – blunatic