スタック

1. はじめに

スタックとはデータを保持する構造の考え方の一つです。
最後に入れた物が、最初に出てくるデータの保持方法です。
以下はスタックを利用したサンプルです。

2. デバッグ実行

今回は実際に動く内容を確認するためにデバッグ実行します。

global _start
_start:

の_startの箇所をmainに変更してgdbでデバッグ実行してみます。
以下の画像はデバック実行で、21行目のpush の実行が終わった段階です。

(gdb) x/24xb  0x7fffffffdf08

により、1byte単位(8bit)ごとに16進数でメモリーの内容を24個表示します。
RSPには該当のメモリーの番地が格納されています。
下位のbyteから(0x45 -> 0x46 -> 0x00 ・・・)順に格納されて行きます(リトル・エンディアン)。

上記画面では、33行目まで進めて、メモリーの内容を表示しています。
番地:0x7fffffffdef8 から1byte単位で値を出力します 。 40行目のPOPでは、一つ前にPUSHしたアドレスをレジスタRAXに設定して、該当のbyteデータを出力します。
実際に実行すると

$ABCDEF

と出力します。