スタックについて

スタックとは、計算結果を一時的に保存するのに使ったり、プログラムがジャンプするときに戻り先のアドレスをメモしておくのに使われるRAM領域です。
SNESでは$7E010B~$7E01FFの245バイトがスタック領域として確保されています。
 
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レジスタのような、直接こちらから値を変えることが出来ないレジスタを変更する場合に一度スタックに値を積んで、操作したいレジスタに値を渡すという使われ方もします。