MIPS中的整数数组:将数组[index]设置为迭代值i?

时间:2013-09-30 19:57:27

标签: arrays assembly mips mars-simulator

我正在努力将下面的C ++代码翻译成MIPS(这只是我坚持的程序的一小部分),我理解如何设置$t寄存器的要点给出的数组值,但我完全停留在

pos[count] = i;

我已经尝试了swlw,但每次尝试这些时,我都会从范围异常等处获得地址。

有人可以向我解释这里出了什么问题吗?当循环到达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;
    }

 }

2 个答案:

答案 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次” 退出程序