1

私は、Mipsアセンブリを出力するコンパイラであるDecafプログラミングプロジェクトに取り組んでいます。ReadLineこれは、標準入力から文字列を読み取る組み込み関数のアセンブリです。

 input:
      .space 40
 _ReadLine:
    subu $sp, $sp, 8
    sw $fp, 8($sp)
    sw $ra, 4($sp)
    addiu $fp, $sp, 8
    subu $sp, $sp, 4
    li $a1, 40
    la $a0, input
    li $v0, 8              #read_string syscall
    syscall
    la $t1, input
bloop4:
    lb $t5, ($t1)
    beqz $t5, eloop4
    addi $t1, 1
    b bloop4
eloop4:
    addi $t1, -1
    li $t6, 0
    sb $t6, ($t1)
    la $v0, input
    move $sp, $fp
    lw $ra, -4($fp)
    lw $fp, 0($fp)
    jr $ra

したがって、結果(実際には参照)を文字列に割り当てることができます

 string s = ReadLine();

ただし、すべてのユーザー入力は同じアドレスに読み込まれ、s参照にすぎないため、の呼び出しに続いて、ReadLineが指す値が変更されsます。もちろん、変数がユーザー入力の独自のコピーを保持するようにしたいです。

私はこれまでMipsアセンブリのコーディングを行ったことがなく、率直に言って、上記のコードのほとんどは私のものではありません。私はマニュアルを持っているので、ReadLineすべてのユーザー入力に新しいスペースを割り当てる関数を実装する方法について何か提案はありますか?

ありがとう。

4

1 に答える 1

1

ヒープにスペースを割り当てます。syscall 9 であるほとんどのシミュレーターの場合。静的に割り当てられたスペースを送信する代わりにla $a0, input、ヒープ割り当てのアドレスを送信します。

于 2012-05-18T23:39:52.107 に答える