2

これで、文字を要求し、それを読み取り、エコーし、それを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が次の命令のアドレスを保存することに気付きました。この場合はRETR7サブルーチンのリンクに使用されるレジスタです。これにより、によって保存されたアドレスが上書きさR7JSRます。したがって、停止しているように見える理由は、TRAPルーチンが終了した後、それが私のRET命令をロードするためです。これは、実際にはTRAP、PCカウンターをそれ自体に変更するためです。無限ループのようなものです。

それはすべて素晴らしいことであり、何が起こっているのかは理解していますが、システム命令TRAPを使用しながら、サブルーチン内でシステムルーチンを使用できる方法はありますか?JSR

もちろん、呼び出し後の命令のアドレスを別のレジスタに手動で格納し、サブルーチンJSR PRINT_NEWLINEの最後にそのレジスタのアドレスに格納することもできます。PRINT_NEWLINEJMP

しかし、それは私には間違っているように思えます。私はプログラマーなので、怠け者であり、他の人の労力の成果を楽しんで、との組み合わせを使用したいと思っていJSRますRET

TRAPでは、サブルーチン内のルーチンを呼び出してもRET、そのサブルーチンから「戻る」ために使用することは可能ですか?これをどのように達成しますか?

ありがとう!

4

1 に答える 1

3

R7呼び出す前に別の場所の値を保存し、TRAP後で復元する必要があります。ネストされたサブルーチン呼び出しに対してもこれを行う必要があります。ほとんどのRISCアーキテクチャでは、ユーザーによる何らかの形式の差出人アドレスの保存が必要です。x86プロセッサのようにハードウェアにメモリスタックを実装していません。

于 2011-02-24T06:16:22.490 に答える