アセンブリ言語で、高級言語にある「関数」のような機能が存在します。それは「サブルーチン」です。
サブルーチンの機能を使用するために、CASL2では「CALL」命令を使用します。
今回は、サブルーチンやその呼び出しについて見てみたいと思います。
コール命令
コール命令はサブルーチン(副プログラム)を呼び出すために使用します。
サブルーチンとは、コール命令が記述されたプログラムから見て別の場所に定義されたプログラムのことで、コール命令を使用することで、呼び出し元のプログラム上でサブルーチンの機能を使うことができるようになります。
名称 | オペコード | 第1オペランド | 第2オペランド
|
CALL subroutine | CALL | ラベル | ---
|
アドレス | レジスタ
|
使用例1: CALL FUNC
ラベルFUNCから始まるプログラムを実行せよ。
使用例2: CALL 0, GR1
メモリ
汎用レジスタGR1のデータ+0番地から始まるプログラムを実行せよ。
通常、使用例1のような使い方をします。
サブルーチンは、関数と同じものと捉えて問題ありません。
プログラムレジスタにサブルーチンの先頭アドレスを格納し、呼び出し元に戻るときのアドレスをスタックにプッシュします。
リターン命令
リターン命令は、サブルーチンの最後に記述される命令です。
リターン命令が実行された瞬間にサブルーチンの実行が終了します。
例えば、あるサブルーチンにおいて行の初めにリターン命令が記述された場合、それ以降の命令は一切実行されません。
名称 | オペコード | 第1オペランド
|
RETurn from subroutine | RET | ---
|
使用例1: RET
サブルーチンを終了し、呼び出し元プログラムに戻れ。
RETは、RET以下の行にプログラムが続いているとしても、この命令が実行された瞬間にそのプログラムは終了します。
コール命令とサブルーチンの使い方
コール命令とサブルーチンの使い方は、単純にコール命令と呼び出したいサブルーチンの名前を記述するだけです。
メインルーチンにおいてコール命令が実行された段階で、サブルーチンの実行が開始されます。
サブルーチンは、リターン命令が実行された瞬間、呼び出し元のメインルーチンに戻ります。関数のように引数を設定する必要はありません。
コール命令や呼び出し先のサブルーチンはどのように記述するのか、以下の例を用いて見てみましょう。
例1:1 + 2の加算を行うプログラム
1 | MAIN | START |
|
2 | | CALL ADDER | ;「ADDER」サブルーチン呼び出し
|
3 | | RET |
|
4 | | |
|
5 | ADDER | LD GR1, A |
|
6 | | LD GR2, B |
|
7 | | ADDA GR1, GR2 |
|
8 | | ST GR1, ANS |
|
9 | | RET |
|
10 | | |
|
11 | A | DC 1 | ;足される数
|
12 | B | DC 2 | ;足す数
|
13 | ANS | DS 1 | ;答え
|
14 | | END |
|
2行 CALL ADDER
「ADDER」というラベルが付いたサブルーチンを実行します。
3、9行 RET
サブルーチン間の境目は、RET命令で区切られています。
END命令を書かないように注意してください。
5行 LD GR1, A
「ADDER」サブルーチン開始の行です。
サブルーチンの名前もラベルに記述して表します。
最後に
長いプログラムを記述するとき、加算・減算など機能毎にサブルーチンに分けて記述すればプログラムを見やすくできるため、積極的に使用してはどうでしょうか。
続きはまた次回にご期待を!