0

以下の C++ コードを MIPS に変換する作業を行っています (これは、私が立ち往生しているプログラムのほんの一部です)。$t指定された配列値を取得するようにレジスタを設定する方法の要点は理解していますが、 m 完全に立ち往生

pos[count] = i;

sw、を試しましlwたが、これらを試すたびに、範囲外の例外などのアドレスが表示されます。

誰かがここで何がうまくいかないのか説明できますか? ループが に到達したら、ループの反復ごとにからにpos[count] = i変更する必要があります。の-1を調整する必要があるため、エラーが発生していますか?pos[count]0xffffffff(i)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;
    }

 }
4

2 に答える 2

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++います。条件内にある必要があります。そのためには、最後の 2 行 (ラベルを含む) を交換する必要があります。

わずかにクリーンアップされたバージョンは次のようになります。

    .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
于 2013-09-30T22:40:00.573 に答える
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; }

上記の関数 count を利用する MIPS アセンブリ プログラムを次のように記述します。 -code n = 10  次のように値を入力するようにユーザーに促します:「整数値を入力してください」 、10、x)  次のように結果を出力します。「x がリストに表示される回数は res 回です」  プログラムを終了します。

于 2014-04-07T02:21:23.527 に答える