0

サイズと文字列が指定されたときに、int の文字列を逆にしようとしています。これが私がこれまでに持っているものです。私の問題はループセクションにあることを知っています.

どんな助けでも大歓迎です:

        .data

Size: .word 9 # Size is 9

Vals: .word 1, 2, 3, 4, 5, 6, 7, 8, 9 # Vals[9]={1,2,..}

        .text
main:

la $t1, Size # get the address of variable Size
la $t2, Vals # get the address of variable Vals
lw $t3, 0($t1) # fetch the value of Size to register $t3
sra $t4, $t3, 1 # right shift arithematic, now $t4 contains Size/2
sll $t3, $t3, 2 # left shift logic, now $t3 contains Size*4

loop:
lb $t5, 0($t2)
sb $t0, 36($t2)
sb  $t0, ($t5)
addi $t0, $t0, 4
addi $t5, $t5, -4
bne $t5, $t4, end
j loop

end:

la $t0, Vals # get the address of Vals to $t0
la $t1, Size # get the address of Size to $t1
lw $t3, 0($t1) # get Size to $t3
sll $t3, $t3, 2 # left shift logic, now $t3 contains Size*4
add $t1, $t0, $t3 # $t1=Vals+Size*4 => array bound
li $v0, 1       # service 1 is print integer

lab4:
lw $a0, 0($t0)  # load desired value into argument register $a0
syscall         # print the value in $a0
addi $t0, $t0, 4 # increase array index
bne $t0, $t1, lab4 # check if reach array bound
4

1 に答える 1

1

そのループにはいくつかの問題があります。

  • 単語ではなくバイトを読み込んでいます ( lw/swの代わりにlb/を使用します)sb
  • コンテンツとアドレスを混在させています (レジスタ $t5 の使用)
  • 配列へのポインターの代わりに、読み取った内容に 4 を加算/減算しています
  • 36 (= 9x4) を追加すると、配列の末尾の後の場所を指すため、配列を逆にしようとしている方法が間違っているようです

あなたがすべきことは、2 つのポインターを使用することです。1 つは配列の先頭を指し始め、もう 1 つは配列の末尾を指し始めます。次に、両方の項目を読み取り、その内容を交換します。ここで、各ポインターの次の要素を移動し (一方のポインターが前方に移動し、もう一方のポインターが後方に移動します)、すべての項目が処理されるまで (つまり、両方のポインターが交差するとき) プロセスを繰り返します。

例 (中略):

addu $t7, $t2, $t3 # $t5 contains address of end of string

loop:
  addi $t7, $t7, -4 # moves pointer backwards
  lw $t5, 0($t2)
  lw $t0, 0($t7)
  sw $t5, ($t7)    # interchange
  sw  $t0, ($t2)   # contents
  addi $t2, $t2, 4 # moves pointer forward
  ble $t2, $t7, loop
于 2012-09-25T15:07:56.553 に答える