これで、文字を要求し、それを読み取り、エコーし、それを4回繰り返してから、それらの文字を連続した文字列に出力するアセンブリプログラムを終了しました。次に、サブルーチン(クラスではまだ学習していません)を試してみたかったので、次のサブルーチンを作成して、コンソールに改行文字を出力しました。
PRINT_NEWLINE ;procedure to print a newline
AND R0,R0,#0 ;clear output register
LD R0,NEWLINE ;load newline into output regiester
TRAP x21 ;print it out
RET ;jump to address in R7
次のように「呼び出され」ます。
JSR PRINT_NEWLINE
これを実行した後、私は何か奇妙なことに気づきました。プログラムは、への最初の呼び出しの後に停止したように見えましたPRINT_NEWLINE
。次に、TRAPが次の命令のアドレスを保存することに気付きました。この場合はRET
、R7
サブルーチンのリンクに使用されるレジスタです。これにより、によって保存されたアドレスが上書きさR7
れJSR
ます。したがって、停止しているように見える理由は、TRAP
ルーチンが終了した後、それが私のRET
命令をロードするためです。これは、実際にはTRAP
、PCカウンターをそれ自体に変更するためです。無限ループのようなものです。
それはすべて素晴らしいことであり、何が起こっているのかは理解していますが、システム命令TRAP
を使用しながら、サブルーチン内でシステムルーチンを使用できる方法はありますか?JSR
もちろん、呼び出し後の命令のアドレスを別のレジスタに手動で格納し、サブルーチンJSR PRINT_NEWLINE
の最後にそのレジスタのアドレスに格納することもできます。PRINT_NEWLINE
JMP
しかし、それは私には間違っているように思えます。私はプログラマーなので、怠け者であり、他の人の労力の成果を楽しんで、との組み合わせを使用したいと思っていJSR
ますRET
。
TRAP
では、サブルーチン内のルーチンを呼び出してもRET
、そのサブルーチンから「戻る」ために使用することは可能ですか?これをどのように達成しますか?
ありがとう!