我正在努力将下面的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;
}
}
答案 0 :(得分:2)
这部分错了:
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;
为什么要在同时写入时加载pos[count]
和x[count]
?这不仅是不必要的,它还会破坏$t2
和$t3
,所以当你真的想写时,它们将不再有效。
此外,循环结束是错误的,count++
应该在条件内。为此,您需要交换最后两行(包括标签)。
稍微清理过的版本可能如下所示:
.data
x: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
pos: .word -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
d: .word 73, 47, 23, 26, 67, 99, 13, 53, 1, 97
# $s0 count
# $s1 key
# $s2 i
.text
.globl main
main: addi $s0, $0, 0 # int count = 0;
addi $s1, $0, 24 # int key = 24;
addi $s2, $0, 0 # int i = 0;
# for (int i=0; i<10; i++) {
loop: sll $t0, $s2, 2 # $t0 = i * sizeof(int)
lw $t0, d($t0) # $t0 = d[i]
blt $t0, $s1, loop1 # if (d[i] < key)
sll $t1, $s0, 2 # $t1 = count * sizeof(int)
sw $s2, pos($t1) # pos[count] = i
sw $t0, x($t1) # x[count] = d[i]
addi $s0, $s0, 1 # count++;
loop1: addi $s2, $s2, 1 # i++;
blt $s2, 10, loop
答案 1 :(得分:0)
int count(int a[], int n, int x){ int res = 0; int i = 0; for(i = 0; i != n; i++) if(a[i] == x) res = res + 1; return res; }
编写一个MIPS汇编程序,它将使用上面的函数计数,如下所示: 将以下10个值硬编码到数组a中: 128,10,23,12,128,9,220,46,128,5 硬编码n = 10 提示用户输入值,如下所示:“请输入整数值” 读取整数值并存储它(让我们称之为x) 使用以下参数调用函数计数:count(a,10,x) 输出结果如下:“x出现在列表中的次数是res次” 退出程序