« RZ1Basic v0.19 公開 | トップページ | RZ1Basic v0.2.0 公開 »

ROBOBASIC講座(GOSUB...RETURN)

【GOSUB(ゴーサブ)】
 サブルーチンを呼ぶ(ラベルの行にジャンプする)
 書 式: GOSUB ラベル

【RETURN(リターン)】
 サブルーチンから復帰する(呼び出したGOSUBの次の行へ戻る)
 書 式: RETURN

 例: GOSUB hogehoge
    ......................
    ......................
    GOTO MAIN

    hogehoge:
      ......................
      ......................
      RETURN

GOSUBGOTOは、よ〜く考えないと何かと問題を起こしやすいコマンドなんですが、使わずにBASICプログラミングするのは、それまた大変なので、どんなものなのか理解して、賢く使えるようにしましょう。

まず、GOSUBRETUENの仕組みは以下のような感じになります。

  • GOSUBは、スタックポインタが示すアドレスに自分の次の行のアドレスを記録し、スタックポインタの値をひとつ(2バイト)増やします。
  • RETUENは、スタックポインタの値をひとつ(2バイト)減らし、スタックポインタが示すアドレスに記録されているアドレスにジャンプします。

Gosub72

GOSUBRETUENで戻らなくてはいけません。その戻る場所をスタックという方式で記録しています。GOSUBがあると、戻る場所スタック領域に記録します。この時、最後に記録した場所を覚えておくのがスタックポインタになります。プログラムの中では、GOSUBが呼ばれて、次にRETUENが呼び出される前に、またGOSUBが呼ばれる場合も当然あります。GOSUBが呼ばれるたびに、戻る場所を次々と積み重ねるように記録していくということで、スタック(=積み重ねる)と呼んでいます。RETUENはその逆の処理になります。GOSUBでどんどん上に積み重ねていくのに対して、RETUENが呼ばれると、戻る場所を上から順に取っていきます(上図)。

  • スタックポインタ値 SRAM 0x04D6-0x04D5 初期値=0x0D02
  • スタック領域    SRAM 0x0D02から(MR-C3000系は5個、2000系は4個)

MR-C3024のスタックは場合、具体的には上記になります。細かいことはいいとして、積み重ねられるのは、5個までなので、GOSUBを呼び過ぎてスタックオーバーフローにならないようにプログラミングすることが大切ですね(上図)。また、さらに、GOTO文による危険も出てきます。RETUENが呼ばれることでスタックはひとつ減ります。GOSUBを呼んでおいて、GOTOでMAINループに戻ったりしたら、RETUENが呼ばれないままになってしまうかもしれないのです(下図)。そうなるとスタックは溜まるいっぽうになり、オバーフローしてしまうかもしれませんし、RETUENが呼ばれた時、予期せぬ所へジャンプしてしまうかもしれません。

Gosubgoto72

ということで、以上のことを踏まえて、もう一度、正しくGOSUBRETUENGOTOが使われているか確認して見て下さい。テンプレートだからと言って正しいとは限りませんよ。テンプレートに関しては、また別に書く予定でいます。

|

« RZ1Basic v0.19 公開 | トップページ | RZ1Basic v0.2.0 公開 »

ROBOBASIC講座」カテゴリの記事

コメント

ヒロビです。こんばんは。

ROBOBASIC講座、快調ですね。

スタックオーバーフローの概念も非常に分かり易く感じられました。

例題がある意味最もタイムリー、というか注目を集めているGOSUB~RETURNというところがミソかな。

ハイリスク・ハイリターンと言うのは馴染みのある言葉ですが、GOSUBでNO RETURNはちとまずいようですね。

本来はある程度roboBASIC側でエラー処理してもらえれば良いのかもしれませんが。

講座の方、楽しみにしてますがご多忙のご様子、機体の製作はいかがですか?

投稿: ヒロビ | 2008年2月 8日 (金) 21時33分

ヒロビさん、コメントありがとうございました。
昨日、今日と、研修に出ていまして、レスポンス遅くなりまして申し訳ありませんでした。

機体の作成はまだ止まったまま進んでいませんが、30号から昨日届いた所まで、ざっと目を通してみたら、GOSUB~RETURNの説明ももう書かれてありましたね。

ROBOBASIC講座の方は、冊子の方だけで解ることだけ書いていても仕様がないので、冊子やリファレンスマニュアルには無い、特別な(マニアック?な)ネタをまとめながら、紹介できればと思っています。

ただ、私は専門家ではありませんので、いろいろ調べて解ったことを書いているだけに過ぎません。だから間違ったことも書いてしまうかもしれませんので、何かお気づきの点がありましたら、修正しますので、よろしくお願い致します。

投稿: micono | 2008年2月10日 (日) 14時19分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: ROBOBASIC講座(GOSUB...RETURN):

« RZ1Basic v0.19 公開 | トップページ | RZ1Basic v0.2.0 公開 »