1

文字列へのポインターの配列を作成しようとしていますが、期待どおりに動作しません。配列には、アドレスではなく文字列の内容が含まれます。ソースコードは次のとおりです。

    showhelp:
        .data
    help1:  .asciiz "\nHELP FOR HW4_2b\n"
    help2:  .asciiz "Purpose: Displays the output from a one-bit full adder with inputs provided on the command line.\n"
    help3:  .asciiz "HW4_2b c a b\n"
    help4:  .asciiz "c\t\tThe carry in bit: 0|1\n"
    help5:  .asciiz "a\t\tOne of the bits to be added: 0|1\n"
    help6:  .asciiz "c\t\tThe other bit to be added: 0|1\n"
    helpar: .word help1, help2, help3, help4, help6
    helpsiz:.word 6
            .text
            lw          $t0, helpsiz    # load size of help array
            lw          $t1, helpar     # load address of address of first help string
    nxthlp: la          $a0, ($t1)      # specify string to print
            li          $v0, 4          # specify print string 
            syscall                     # print it
            addi        $t1, $t1, 4     # increment pointer to next string
            subi        $t0, $t0, 1     # decrement counter
            bgtz        $t0, nxthlp     # if not last string loop

            jr $ra          # return

これを実行すると、次の出力が得られます。

    HELP FOR HW4_2b
    P FOR HW4_2b
    R HW4_2b
    4_2b

    rpose: Displays the output from a one-bit full adder with inputs provided on the command line.

ご覧のとおり、helpar: には、アドレスではなく、連結されたすべての文字列が含まれています。また、「la $a0, ($t1)」の間接アドレス指定は、$t1 に含まれるアドレスの内容ではなく、$t1 の内容をロードしています。

私は何を誤解していますか?

ありがとう、ケビン

4

1 に答える 1

1

Here's the problem:

        lw          $t0, helpsiz
        lw          $t1, helpar     # load address of 1st string
nxthlp: la          $a0, ($t1)      # NOT SURE IF THIS IS EVEN VALID
        li          $v0, 4
        syscall
        addi        $t1, $t1, 4     # skip 4 chars in string; must be unsigned add!
        subi        $t0, $t0, 1
        bgtz        $t0, nxthlp

Here's what you should do instead:

    lw      $t0, helpsiz
    la      $t1, helpar # t1 points to element 0 of helpar
nxthlp:
    lw      $a0, 0($t1) # fetch element of helpar that t1 points to
    li      $v0, 4
    syscall
    addu    $t1, $t1, 4 # t1 points to next element of helpar
    subi    $t0, $t0, 1
    bgtz    $t0, nxthlp
于 2013-02-21T04:07:32.803 に答える