●リアルモードからプロテクトモードへの移行
・・・cr0レジスタの最下位ビットに1をセットする
esp・・・スタックポインタ(スタックが使用されているアドレス、「ここまでスタックが
使用されています」というアドレス)
ebp・・・フレームポインタ/ベースポインタ
●フレームポインタ/ベースポインタとは?
・・・ローカル変数などにアクセスする際の基準となるアドレス。
ここからの相対アドレスでアクセスする。
関数コール時はフレームポインタ(レジスタ)の値もスタックに積む。
(呼び出し元のリターンアドレスの前(低位))
直前の関数のフレームポインタの記録位置が自関数のフレームポインタになる(らしい・・・)
LM '01.11参照
・・・特定のfunctionのフレームアクセスにおける基準となるスタックのアドレスをロードする
コールされた関数がスタックにローカル変数をpushする前に
ESPレジスタの内容をEBPレジスタにコピーする
・・・EBPレジスタは一般的にはスタックに積んだリターンアドレス(呼出元の戻りアドレス)の
位置をポイントする。
Intelマニュアル
●サブルーチンコール時のスタックの状態
例えば
main(){
int hoge=1;
int foo =2;
int bar =3;
sub(hoge,foo,bar);
}
sub(int arg1,int arg2,int arg3){
int a;
int b;
int c;
a=arg1;
b=arg2;
c=arg3;
}
のようなプログラムを考えた場合、スタックの状態は以下のようになる。
(低位)
sub内の内部変数c
sub内の内部変数b
sub内の内部変数a
mainのベースポインタ(スタックの「mainの直前の関数のベースポインタ」の位置を示す)
mainへの戻りアドレス
subへの第1パラメータ
subへの第2パラメータ
subへの第3パラメータ
main内の内部変数bar
main内の内部変数foo
main内の内部変数hoge
mainの直前の関数のベースポインタ
mainの直前の関数への戻りアドレス
(高位)