ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、セガサターン)と、MSXぽいアプリ開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハックほか雑記を綴っています

MSXマシン語入門(Z80 アセンブラ・機械語) 勉強レポート 第18回 PUSH / POP命令とスタック

前回はスタックについて説明しました。

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で値を元に戻す、という使い方ができますね。

 

今回はここまでです。

かなり便利な命令なので、是非覚えておきましょう!!

 

では〜。

 

スポンサーリンク

 

 

www.nyaonyao21.com


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください