まず square 関数が実行される前には、 main 関数で定義された変数 a, b はスタック領域に図 7(a) のように確保される。 スタックポインタ $sp は演習で取扱ったように使用されているスタック領域の low address 側の境界を指し示している。 このとき、教科書図 3.12 のようにフレームポインタ $fp はスタック領域の high address 側の境界を表す [2]。 なお、図は教科書と本資料で上下が逆転していることに注意しよう。
square 関数が実行されている最中のスタック領域の模式図は 図 7(b) である。本演習で扱ったように、 リターンアドレス $ra が保存されるとともに、$fp などの他の レジスタも保存される。さらに square の引数である a の値、 すなわち 5 も確保されていることがわかる。 この 5 の 2 乗が CPU で計算されて戻り値を表すレジスタ $v0 に 格納される。
square 関数が終了するとスタック領域は図 7(c) のようになり、 戻り値 $v0 の値が変数 b に代入されてプログラムが終了する。
なお、第 3 章で記述してもらった関数 square は図 7 をそのままアセンブリ言語化しているわけではなく、 その簡略版になっていることに注意しておく。
以上のように C 言語のプログラムを書く際、使用されるメモリの状態を
想像できるようになれば、C 言語の初心者のレベルを卒業したと言えるのでは
ないだろうか[3]。