「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで
●スタックへのアクセスにはフレーム・ポインタを利用
では,変数部をスタックに確保しながら具体的にどのようにプログラムが動いていくかを説明します.
ここで関数factの引き数は,この変数部に格納されて呼び出されることとします(関数の引き数をどう渡すかはコンパイラに依存する).さて,プログラムがこの関数factの計算を行うには,引き数のほかにどのような情報が必要でしょうか?
プログラムは,fact(1)の計算をするためにfact(1)の変数部に着目して動きますが,fact(1)の計算が終わったら,fact(1)を呼び出したfact(2)の変数部に着目して動く必要があります.そのための情報,つまり,fact(2)の変数部の始まる場所(これをベース・アドレスと呼ぶ)を知っている必要があります.スタックの場合はデータを0番地方向に(図1-3で言えば上方向に)積んでいくのが習わしなので,具体的にはfact(2)の変数部のうちのいちばん下のアドレスを知っておく必要があります.
この切り替えを統一的に取り扱うために,今着目している変数部のいちばん下の番地を格納するポインタ(これをフレーム・ポインタと呼ぶ)を作っておきます.プログラムのコードは変数部のデータにアクセスする際に,このフレーム・ポインタからの相対位置(フレーム・ポインタからデータまでのオフセット)を利用してアクセスするようにします.これにより,フレーム・ポインタの内容を切り替えることによって着目する計算を切り替えられます.