0

文字列の長さ関数をmipsでテストしようとしています。「幸せ」などの言葉で試してみたいのですが……どうしたらいいのかわかりません。それを画面に印刷する方法も学ぶのは素晴らしいことです。

これは私のコードです:

.globl StringLength

StringLength:
li $t0,0

StringLengthLoop:
lb $t1,0($a0)
beq $t1,$zero, StringLengthExit
add $a0,$a0,1
add $t0,$t0,1
j StringLengthLoop

StringLengthExit:
move $v0, $t0
jr $ra
4

1 に答える 1

1

コンソールに印刷するには、システムで利用可能な多くのシステムコールの1つを利用する必要があります。(正確なシステムコール値は、システム/エミュレーターによって異なります。)

文字列は、文字列の先頭のアドレスを取得するために使用できるラベルを使用して、実行可能ファイルのデータセグメントに配置できます。「.ascii」はnullで終了しない文字列を意味し、「。asciiz」はnullで終了する文字列を意味します。

文字列と整数値を出力する方法の簡単な例を次に示します。

        .data
str:    .asciiz "This is a string\n"  # a null-terminated string to be printed.
        .align 2                      # make sure it's aligned to word boundary
int:    .word 1234                    # some number

        .text
        .global main
main:
        la    $a0, str        # load the address of the start of our string
        li    $v0, 4          # syscall 4 usually means print string
        syscall

        la    $t0, int        # the address of our number
        lw    $a0, 0($t0)     # get our number
        li    $v0, 1          # syscall 1 usually means print int
        syscall

        li    $v0, 10         # syscall 10 usually means exit
        syscall               # exit.

より実用的な例:

もし私があなたの関数を利用するとしたら、それは次のようになります:(それが$ aNの引数と$vNの戻り値の標準的な呼び出し規約に従っていると仮定します。それは確かにそうです。)

        .data
str:    .asciiz "This is an example"

        .text
        .global main
main:
        la    $a0, str        # first argument, a pointer to the string
        jal   StringLength    # call StringLength(str)

        # print the length
        add   $a0, $zero, $v0
        li    $v0, 1
        syscall

        li    $v0, 10
        syscall               # exit

ほとんどのエミュレーターは同じシステムコールを使用します。これは、MARSシミュレータのシステムコールのリストです

最後の注意:lw命令を使用して値をロードする場合は、最初の例で行ったように、値をワード境界(.align 2)に揃えるようにアセンブラーに指示してください。

于 2012-03-02T04:59:27.680 に答える