RPUSHとRPOP の擬似命令

一般にサブルーチンの中では、レジスタを駆使して目的の機能を実現するコードが存在します。
サブルーチンは、利用する側から見てブラックボックスとして取り扱えた方が使いやすく、望ましい形です。
 (例えば、printfを使う時にその中で行っているメモリの処理を知らなくても、使い方さえ知っていれば使えます。)
  このようなサブルーチンでは、サブルーチンの呼び出し前と、戻ってきた後で、 レジスタの内容に違いがあると使い勝手が悪くなります。

このような場合、レジスタを変更する前にPUSH命令で、レジスタ内容をスタックに退避し、
処理が終わったらPOP命令でスタックからレジスタへ変更前の状態に戻す技法が使われます。

この退避と復元を容易に行わせる擬似命令として、RPUSHとRPOPがあります。
RPUSH擬似命令は、GR1からGR7レジスタをスタックへ格納します。 RPOP擬似命令では、これらレジスタ(GR1からGR7)をスタックから取り出して元の状態に復元します。以下でこの例を示します。

このプログラムは、2回連続的に入力させ、それぞれで入力した文字列を、連結した文字列として表示ものです。
その手法として、文字列をコピーするCOPYの名前のサブルーチンを作って利用しています。
1回目入力用の文字列格納位置(BUF1)と文字数域(SIZE1)を、出力用にも使っています。 そして2回目で入力した文字列は、1回目入力した文字列の最後にCOPYで連結し、それから表示しています。
COPYサブルーチンの仕様は使う場合に、コピー先アドレスをGR5に、コピー元アドレスをGR6に、コピー元の文字数をGR7に、セットして使います。
そして、呼び出し前と、戻ってきた後で、レジスタの内容が変化しないようRPUSHとRPOPの擬似命令を使っています。

次のプログラムを実験しましょう(RPUSHとRPOPの擬似命令を削除するとどうなるか)

検討:2回とも入力が無いと、COPYは無限ループになります。直してみましょう。