前回はスタックについて説明しました。
CALL / RETの時のスタックは、一時的に戻るアドレスを入れておくメモリの場所
のことでした。
SP ( スタックポインタ) は、そのアドレスを指し示すレジスタでした。
今回の勉強は、PUSH / POP 。
PUSH / POP はスタックに関わることみたいですね。
PUSHは、レジスタの内容をスタックに入れる命令。
POPは、スタックの内容を取り出し、レジスタに入れる命令。
なるほど。
簡単ですね。
少しややこしいのが、
First in Last Outというデータ格納形式です。
A、B、Cという 順にデータを入れた時は、
C、B、Aという順にしかデータを取り出せないものだそうです。
図に書くと、
データを入れる時は、
| | | | | C |
| | -> | B | -> | B |
| A | | A | | A |
1 2 3
このように上に上に追加していき、
取り出す時は、
| | | | | |
| B | -> | | -> | |
| A | | A | | |
4 5 6
上から取り出していく方式らしいです。
図にすればわかりますね!
それから注意することが1つ。
PUSH / POP は扱うデータが、
16ビット単位だそうです。
Aレジスタは8ビットなので、使いたい時は、
AFという16ビットレジスタにしてから使います。
マシンコード
| AF BC DE HL IX IY
-------------|---------------------------------------------
PUSH x | F5 C5 D5 E5 DDE5 FDE5
POP x | F1 C1 D1 E1 DDE1 FDE1
-----------------------------------------------------------
PUSH / POPを何に使うのかなぁ〜という疑問が湧きます。
そのあたりも書いてありました。
Z80の8ビットレジスタはA~Lまでの7つしかないです。
これをBASICの変数のように使うと数が足りません。
そこで、レジスタの値を一時的に、スタックに
退避させて、処理があれこれすんだら、レジスタに戻すという
ような使い方をします。
だそうです。
確かにBIOSルーチンを使う時に、いくつかレジスタを使用することが
ありますもんねぇ。
そのときに便利かも。
一時的にスタックにPUSHしておき、
BIOSルーチンを呼び出し処理し、済んだら、
POPで値を元に戻す、という使い方ができますね。
今回はここまでです。
かなり便利な命令なので、是非覚えておきましょう!!
では〜。
スポンサーリンク
MSX BASIC + マシン語の情報などはこちらへ