今回はいよいよアセンブラでの関数
ただし,
- ※1)
- 「サブルーチン」
(sub-routine)/ 「手続き」 (procedure) と呼んだり, これらを厳密に区別する言語もありますが, とりあえずここではこれらをまとめて 「関数」 (function)と呼びます。
復帰位置の取得
「関数」の原理
「関数」
C/
復帰位置
(アドレス) を記録しておいて, 関数での処理が完了したなら, 復帰位置に制御遷移する
という手順を踏めば,
たとえば以下のような実装によって,
リスト1 手製の関数的な仕組み
※ 呼び出し元
:
leal rp, %eax # 復帰位置 rp を eax に格納
jmp func1
rp: # 復帰位置(Return Position)
:
※ 呼び出し先
func1:
:
jmpl *%eax # eax 位置に復帰
呼び出し先func1
)
専用命令の使用
先の実装例では,jmp
を用いた関数呼び出しに先立って,
しかし,
関数から復帰する位置は,jmp
命令の次の命令位置以外にありえません。そして一般的なCPUであれば,
つまり,
期待に違わず,
Intel x86アーキテクチャの場合,call
"ret
"
リスト2 専用命令による関数呼び出しの実現
※ 呼び出し元
:
call func1
:
※ 呼び出し先
func1:
:
ret
- ※2)
- Intel x86 での名称は
「インストラクションポインタ」 ですが…。