0

Computer Organizations クラスの MIPS コードに取り組んでいますが、MIPS を正しく動作させることができず、オンラインの MIPS リソースもそれほど多くありません。PCSPIM でコードを実行しています。このコードは、array2 の内容に 10 を加算し、それらを array1 に格納してから、配列 1 を出力することになっています。コードが修正され、適切に動作するようになりました。

.text
main:
    la $t0, array1
    la $t1, array2
    la $s0, valuec
    li $s2, 6
    add $t6, $zero, 1 #i = 1

Loop:
    addi $t6, $t6, 1 #i++

    lw  $t2, ($t0)
    lw  $t5, ($t1)
    lw  $s1, ($s0)
    addu $t2, $t5, $s1
    sw  $t2, ($t0)
    add $t0, $t0, 4
    add $t1, $t1, 4
    li $v0, 1
    move $a0, $t2
    syscall
    blt $t6, $s2, Loop

    li $v0, 10
    syscall
.data
    array1: .space 20
    array2: .word 1,2,3,5,9
    valuec: .word 10

PCSPIM は 0 を 5 回出力し、例外 7 [Bad data Address] が発生して無視を返します

4

2 に答える 2

2

これは宿題なので、今のところ手がかりだけを提供し、随時追加します。いくつかのこと:

1/ 何をすべきかを教えてください。それが最も重要なことです。

2/ array1 アドレスを t0 に格納し、最初のループ内で t0 を再利用します。

3/ あなたはアドレスとそのアドレスの内容について混乱しているようです ("la $s0, valuec""addu $t0, $t1, $s0")。

アップデート:

実際、私はしばらくサインオフする必要があるので、あなたを慌てさせないように私の解決策を投稿します.

前に言及した混乱は、2 つのアドレスを $t1 と $s0 にロードし、それらを追加して別のアドレスを取得しているという事実でした。これは、データ領域をはるかに超えている可能性があります (実際には、アドレスとオフセット)。

これは基本的に、コードで発生する問題です (ゼロが出力されることとクラッシュすることの両方)。あなたの最善の策は、それを修正し、以下の私のコードを最後の手段として参照して、私がどのようにそれを行ったかを確認することです. コードをコピーしても長期的には役に立ちません。教育者もすべての Web サイトの盗用をチェックしていると想定するのが賢明です。

これは私が思いついたコードです (すぐにテストする必要があります - バグがあるかもしれません)。コメントを詳しく読んで、それが何をしているのかを理解することをお勧めします

数時間後に戻ってきて、あなたの様子を見に行きます。乾杯。

.text
main:

# Initialization of array pointers and loop

    la      $t0, array1       # address of array 1
    la      $t1, array2       # address of array 2
    li      $t2, 1            # element number
    li      $t3, 6            # upper limit of elements

# Process each word in array 2, adding 10 and placing
# into array 1.

Loop:
    lw      $t3, 0($t1)       # get word from array 2
    addi    $t3, $t3, 10      # add 10 to word
    sw      $t3, 0($t0)       # store word into array 1
    addi    $t0, $t0, 4       # move to next entry in array 1 and 2
    addi    $t1, $t1, 4
    addi    $t2, $t2, 1       # increment element number
    blt     $t2, $t3, Loop    # loop until all elements done

# Initialize printing loop by going back to start of array 1

    la      $t0, array1       # address of array 1
    li      $t2, 1            # element number

# Loop through array 1, printing each element.

pLoop:  
    lw      $t2, 0($t0)       # get word from array 1
    li      $v0, 1            # 'print' command code
    move    $a0, $t2          # needs value in $a0
    syscall                   # print it
    addi    $t0, $t0, 4       # move to next entry in array 1
    addi    $t2, $t2, 1       # increment element number
    blt     $t2, $t3, Loop    # loop until all elements done

    li      $v0, 10           # 'terminate' command code
    syscall                   # exit

# Data arrays for array 1 and 2

.data
array1: .word 0,0,0,0,0
array2: .word 1,2,3,4,5
于 2009-04-08T03:33:03.407 に答える
-1

考えられる問題はいくつかありますが、最も明白/可能性が高いのは、データ セクションの開始前にメインから戻っていないことです。

jr ra
于 2009-04-08T03:27:35.840 に答える