今日勉強するところはなんかややこしそう!
CALL命令っていったら、
CALL C120H
とか書いて、その番地に飛んで、
RET
があったら、また戻ってくるというやつでした。
BASICでいうGOSUB ~ RETURNみたいなの。
別にメカニズムといっても、不思議なところはないのですが^^
読み進めると、
RETがあったときに、どうやって元の行番号へ戻ってくるか?
つまり元の行番号をどこに覚えているか?
ということが書いてありました。
覚えておくところがスタックと言うそうです。
メモリの中にとられるそうです。
そのスタックのアドレスを指定するのが、
SP(スタックポインタ)
というレジスタだそうです。
例:
プログラム
&HC010 CALL C120H
&HC013
~
&HC120 -------------------
&HC14B RET
&C~~ --------------------
&C~~ スタック
&C010 CALL C120Hの時点で、スタックに&HC013が入ります。
(戻ってきた時、&HC013から始めるから)
RETでスタックのアドレスを読んで、そのアドレスに飛びます。
まぁ、戻るアドレスをスタックに入れておきましたよってだけの
話です。
なお、スタックに2バイトのアドレスを入れるわけですが、
入れたときにSPの値が-2されるそうです。
メモリ:
----------- -------------
スタック SPが-2される
----------- ー> -------------
スタック
----------- -------------
ややこしいことに、メモリに2バイトのアドレスを入れるときに、
手前に追加されていくみたいです。
スタックに値を入れると、スタックポインタに入っているアドレスは
2づつ減っていくのだそうです。
ちょっと変ですねぇ。
アドレスの値を減らしていくなんて(怒
まぁそういうものと覚えておきます。
それで、スタックの値を取り出すと、SPは+2されていきます。
SPを元に戻すだけですね。
ふーんって感じですがw
それから、
この原理を使うと、サブルーチンは何重にも入れ子にすることができる
そうです。
サブルーチンの中から、サブルーチンを呼ぶというやつですね。
スタックにアドレスを入れて、さらに手前にアドレスを入れて
ってやっていくそうです。
SPを-2、さらにSPを-2と。
今回はそれだけです。
スタックとSP(スタックポインタ)
というのが新しかったです。
このスタックというのはPUSH / POP命令というのにも
でてくるそうです。
おお!
意外に重要なんですね。
しっかり覚えておいたほうが良さそうです^^
今回はここまでです。それでは〜。
MSX BASIC + マシン語の情報などはこちらへ