kernel/memo/architecture/pentium

Last-modified: 2009-04-14 (火) 23:32:37

●リアルモードからプロテクトモードへの移行
・・・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の直前の関数への戻りアドレス
(高位)