-1

私は、トラップ (PUTS) を模倣するサブルーチンを作成することを目標とする質問に取り組んでおり、コンソールに文字列を書き込みます。この文字列アドレスは r0 にあると想定できます

これは私がこれまでに持っているものです。最初の文字 's' で機能し、その後は印刷をループし続けます >>>>>> すべての提案を試しましたか?

 .orig x3000 
 lea r0, string ;


 br putss




 putss

  ldr r1, r0,#0 
   add r0, r1,#0
  add r4, r0, #-4
  brz theend
  out
  and r1,r1,#0
 add r0,r0,#1 ; keeps fetching next chara


   br putss





  theend
   halt









     string .STRINGZ "salazar"

     .end
4

1 に答える 1

0

大丈夫

1.

br putss

サブルーチンは JSR で呼び出されます。サブルーチンに分岐する必要がある場合、サブルーチンが終了したら、制御フローをサブルーチンの呼び出し元に戻すにはどうすればよいでしょうか?

もう 1 つのポイントは、サブルーチン内で TRAP を呼び出す必要がある場合は、R7 を保存して復元する必要があることです。これは、TRAP の呼び出しの一部として、R7 に戻りアドレスが書き込まれ、呼び出し元に戻るために戻りアドレスが上書きされるためです。おそらく、これが代わりに BR を使用した理由ですか?

2.

add r0, r1,#0

これは悪いです。これにより、サブルーチンが呼び出された時点で R0 に含まれていた文字列データのアドレスが上書きされます。なぜあなたがこれをしているのかわかりませんか?

3.

and r1,r1,#0

これは不要に思えます。LDR R1 が発生したときに R1 の値を上書きします。

4.

add r4, r0, #-4

不要に見えますか?PUTS は、値が 0 (ヌル ターミネータ) の文字を読み取ると終了します。

5.

theend
halt

これをサブルーチンで実行しないでください。サブルーチンは終了時に単に ret を使用して呼び出し元に戻る必要があります。他の誰かのサブルーチンを呼び出した場合、プログラムを終了させたくないでしょう。

于 2017-12-10T05:08:11.720 に答える