PUSHとPOP、上りはどっち?

(New:1998/6/1)
アセンブリ言語でPUSH/POP命令を使うと、スタックポインタ(以下SP)の値が増減するわけですが、さてどっちが増える方で、どっちが減る方でしたっけ?

結論から言うと、PUSHが減る方で、POPが増える方です。 つまりスタックは、上位アドレスから下位アドレスに向かって積まれていきます。
※念のために書いておくと、増減は共に2ずつです。

なんでわざわざこんな(当たり前のことを)書くのかといいますと、自分が逆だと思っていたからです、あほや〜。

それは、10年前のことであった…じゃなくて(^_^;)、「ビーバースイーパー2」開発中のことでした。
このプログラム、スタックを大量に積むのが特徴(理論最大値2KB弱だったかな)で、デフォルトのスタック領域ではオーバーフローしそうだったので、専用のスタック領域を用意しました。
その領域を使うときは当然、SPをその領域に合わせるわけですが、ここで自分はなんと、SPをその領域のアドレスの小さい方の端にしていたのです! PUSH/POPによるSPの増減を逆に思っていたわけですから。
結果、その領域は使われることはなく、それより若い番地のメモリにどんどんスタックが積まれていき、ついにはプログラムやワークエリアも壊していき、暴走…。

でまあ、いろいろ調べていくうちに、PUSH/POPの正しい増減に気が付いたわけですが、皆さんの中にも、ひょっとして勘違いしている方もいるかもしれないと思ったので、ここに書き記しておきます…え? こんなの間違えるのビーバーだけ? …しょぼ〜ん(©阿部 広樹氏)。


MSXの適当手帳 MSX駅 西山駅