アセンブリ言語 CASL2 サブルーチン呼出し・リターン
アセンブリ言語の「サブルーチン」とは、高級言語の「関数」に相当する機能です。
CASL2ではサブルーチンの機能を使用するのに、コール命令を使用します。
今回は、コール命令やサブルーチンの呼び出しなど、CASL2の基本的な情報を共有したいと思います。
コール命令
コール命令はサブルーチン(副プログラム)を呼び出すために使用します。
サブルーチンとは、主となるプログラムから見て別の場所に定義されたプログラムのことで、コール命令を使用することでサブルーチンを呼び出すことができます。
また、呼び出したプログラム上でサブルーチンの機能を利用することができるようになります。
名称 | オペコード | 第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」サブルーチン開始の行です。
サブルーチンの名前もラベルに記述して表します。
さいごに
サブルーチンは高級言語でいう「関数」のことでした。その関数(サブルーチン)を呼び出すために「コール命令」を使う。
それでは次回にお会いしましょう。