ベースポインタとは、サブルーチン*が開始された時点でのスタックポインタの値を格納するアドレスレジスタのことです。
ベースポインタを基準とした相対アドレスを利用することで、呼び出したサブルーチン*に関連したスタック上のデータにアクセスしやすくなります。
通常、サブルーチン*が開始された時点でのスタックポインタの値をベースポインタに格納する前に、ベースポインタの値をPUSH命令でPushしておきます。
これは、あるサブルーチン*内で別のサブルーチン*が呼び出された場合に、呼び出し元のベースポインタの値を覚えておくためです。内側のサブルーチン*が終了したらPOP命令を使って、ベースポインタの値を元に戻します。
ベースポインタは、以下の流れで利用します。
1. あるサブルーチン*を呼び出すためにコール命令を実行する。
2. サブルーチン*の開始直後にPUSH命令でベースポインタの値をPushする。
3. 転送命令でベースポインタにスタックポインタの値をコピーする。
このとき、ベースポインタの値をBPとした場合、BPを基準とした相対アドレスに格納されているそれぞれのデータは、以下になります。
BP + 12:コール命令を実行する前に最後から2番目にPUSH命令でPushした値
BP + 8:コール命令を実行する前に最後にPUSH命令でPushした値(4バイトのデータの場合)
BP + 4:サブルーチン*が終了した後、呼び出し元に戻るための基準のメモリアドレス(コール命令でPushされた値)(1ワード4バイトの場合)
BP:呼び出し元のベースポインタの値
BP - 4:サブルーチン*内で手順2を除いて最初にPUSH命令でPushした値(4バイトのデータの場合)
BP - 8:サブルーチン*内で手順2を除いて2番目にPUSH命令でPushした値(4バイトのデータの場合)
これらの相対アドレスを使って、プロセッサのスタックに保存したデータにロード命令やストア命令で直接アクセスできます。
4. リターン命令を実行する前に、POP命令でベースポインタの値を元に戻す。