PUSH命令はレジスタの値をスタックに書き込みます。レジスタが8bit幅なら8bitの値を、16bit幅なら16bitの値を書き込みます。
PULL命令はスタックに積んだ値を取り出します。これもやはりレジスタが8bit幅なら8bitの値を、16bit幅なら16bitの値を取り出します。
スタックに値が積まれる場合は、$7E01FFから順に書き込まれていきます。スタックに値が書き込まれるたびにスタックポインタが更新され、スタックを上書きしてしまわないようになっています。
スタックポインタは
次に値を書き込んでも大丈夫なアドレスを指定します。たとえばスタックに何も値が無い場合はスタックポインタは$01FFですし、$01E7までスタックが埋まっている場合はスタックポインタは$01E6となります。
スタックから値が取り出されてもスタックとして使っているRAMの値はクリアされません。その代わりスタックポインタを書き換えて上書きが可能になるようにします。
| ADDR |
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
0A |
0B |
0C |
0D |
0E |
0F |
→ |
ADDR |
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
0A |
0B |
0C |
0D |
0E |
0F |
| 01D0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
01D0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
| 01E0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
01E0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
| 01F0 |
00 |
00 |
23 |
01 |
67 |
45 |
AB |
89 |
EF |
CD |
54 |
00 |
FE |
00 |
80 |
FF |
01F0 |
00 |
00 |
23 |
01 |
67 |
45 |
AB |
89 |
EF |
CD |
54 |
00 |
FE |
00 |
80 |
FF |
| スタックポインタ |
01F1 |
スタックポインタ |
01F3 |
赤字は上書きが禁止されている(=スタックに積まれた)値です。左の状態から16bit分の値を取り出すと、メモリの内容はそのまま、スタックポインタが書き換わって上書き禁止領域が変更されます。
スタックは、値の一時保存にも使えますが、DBレジスタのような、直接こちらから値を変えることが出来ないレジスタを変更する場合に一度スタックに値を積んで、操作したいレジスタに値を渡すという使われ方もします。