【发布时间】:2013-09-30 19:57:26
【问题描述】:
我正在努力将以下 C++ 代码转换为 MIPS(这只是我坚持的程序的一小部分),并且我了解如何设置 $t 寄存器以获取数组的要点给定的值,但我完全坚持
pos[count] = i;
我试过sw、lw,但每次我尝试这些时,我都会得到地址超出范围的异常/等等。
有人可以向我解释这里出了什么问题吗?当循环到达pos[count] = i 时,我需要为每个循环迭代将pos[count] 从0xffffffff 更改为(i)。出现错误是因为我需要调整 pos[] 中的 -1 吗?
我完全迷失了,找不到任何与这个问题足够相似的解释。
(抱歉格式化,因为 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++ 代码,将会很有帮助,然后我们就会知道它应该做什么。
-
明白了。我只是在帖子底部更清楚地添加了 C++ 等效项。我的主要问题是翻译 pos[count] = i;和 x[count] = d[i];到 MIPS
标签: arrays assembly mips mars-simulator