0
CASE2:
    la $t9, ARRAY       # Load base address of array into $t9
    li $t8, 36      # Initialize loop counter to 36

LOOP:   
    la $a0, Prompt2     # Load Prompt2 string into $a0.
    li $v0, 4       # system call to print string Prompt2.
    syscall

    li $v0, 12      # read character input. 
    syscall
    move $t8($t9), $v0  # move input character to an array element.

    la $a0, $t8($t9)    # load array element into $a0.
    li $v0, 11      # system call to print array element.
    syscall
    addi $t8, $t8, -4   # decrement loop counter.
    bgtz $t8, LOOP

    la $a0, MSG2        # load MSG2 string into $a0.
    li $v0, 4       # system call to print MSG2 string.
    syscall 
LOOP2:
    la $a0, $t8($t9)    # load element of array into $a0.
    li $v0, 11      # system call to print char.
    addi $t8, $t8, 4    # increment $t8.
    blt $t8, 36, LOOP2  # branch if $t8 is less than 36
    j EXIT          # when $t8 reaches 36 jump to EXIT.
    .data
Prompt2:.asciiz "\nEnter a character: "
ARRAY:  .space 10       # 10 bytes of storage to hold an array of 10 characters

この配列を機能させるのに問題があります。入力から10文字を読み取り、読み取った直後に印刷してから、配列を逆方向に印刷するとします。どんな助けでもいただければ幸いです。

4

1 に答える 1

2

1つの間違いがすぐに明らかになります:

move $t8($t9), $v0 

正しい形式ではありません。MIPSでは、レジスタをオフセットとして使用することはできません。また、MIPSは、移動操作のターゲットレジスタでのオフセットを許可しません。

コードは次のようなものに置き換える必要があります。

addi $t8, $0, 36 # initialize the offset counter to 36
...
sll  $t8, $t8, 2 # multiply the offset counter by 4 to account for word indexing
add  $t9, $t8, $t9 # add the current offset to $t9
sw   $v0, 0($t9)   # store $v0 at the memory location held in $t9

移動操作は、1つのレジスタを取得し、それに含まれる値を別のターゲットレジスタに配置する疑似命令です。代わりに、ストアワード(sw)命令を使用して、レジスタの内容を指定されたメモリ位置に格納します。上記のコードを使用するには、残りのコードを変更する必要がありますが、正しい方向に進むには十分なはずです。

于 2012-05-19T04:36:56.547 に答える