サブルーチンの例 割り算 その2(再帰版)

GR0をGR1で割った商をGR2,余りをGR0へ設定するサブリーチン DIVの例です。

int GR0,GR1,GR2,GR3;
void DIV()
{
	GR3=1;
	if(GR0>=GR1){
		GR0-=GR1;
		GR2++;
		DIV();
	}
}
main()
{
	GR0=15;
	GR1=7;
	GR2=0;
	DIV();
}

上記のC言語のイメージで、簡単に引き算の繰り返しですが、再帰する作り方になっています。
再帰とは、サブルーチンの中で、自身のサブルーチンを呼び出す処理で、 この例の太字のように、DIVの中で、CALL DIV と呼び出す処理の形態になります。
DIVを呼び出すごとのスタックの変化を注目ください。

スタックサイズを小さくしています(4語長)。再帰によって、全てのスタック領域を使う再帰まで進むと暴走します。
分母を7から2に変更すると、再帰によりスタック領域を超えて実行エラーになることが確認できます。
(スタックオーバーと呼びます)