【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

JITで関数呼び出し

第4回 コンパイラ実装会で出た質問です。

※ 例は32bit Windows限定のコードです。

【追記】Python版は以下を参照してください。

相対アドレス

i386のcall命令は相対アドレスで指定するため、JITで呼ぼうとすると少し苦労します。

※ 相対アドレスの起点はcallの次の命令(add)のアドレスです。

絶対アドレス

レジスタ経由で呼び出せば、相対アドレス計算が不要になります。

引数渡し

関数を呼び出す部分で毎回書き換えをするのは面倒です。関数のアドレスを引数で渡すと書き換えずに済みます。

call命令が実行されるとき、スタックの状態は以下のようになっています。

[esp+0] 65
[esp+4] 戻り先のアドレス
[esp+8] 引数

まとめ

引数渡しが一番楽ではないでしょうか。

Pythonにコールバックさせる例でもこの方法を使っています。