現在、x86 システムでアセンブリ言語を学ぼうとしています。そのため、「ゼロからのプログラミング」という本を準備しています。( http://download.savannah.gnu.org/releases/pgubook/で無料で入手可能)
53 ページでは、コンピューターのスタックの仕組みが説明されています。
コンピュータのスタックは、メモリの最上位アドレスに存在します。pushl という命令を使用して、値をスタックの一番上にプッシュできます。[...] ええと、スタックの「トップ」は実際にはスタックのメモリのボトムです。[...] メモリ内では、スタックはメモリの一番上から始まり、アーキテクチャ上の考慮事項により下に向かって成長します。したがって、「スタックの一番上」と呼ぶときは、スタックのメモリの一番下にあることを思い出してください。
私が得るその部分。スタックのメモリがアドレス 0 で始まり、アドレス 11 (包括的) で終わるとします。つまり、スタックには現在 3 つのワード (1 ピースあたり 4 バイト) があります。私の理解によると、スタックの「トップ」にあるワードは現在、アドレス 8、9、10、および 11 を占有しています (1 ワードは 4 バイトであり、したがってメイン メモリ内の 4 つの格納場所を占有するため)。しかし、本は現在、次のように述べています。
スタック レジスタ %esp には、常にスタックの現在のトップへのポインタが含まれています。
さて、私の例では、%esp レジスターはアドレス 8 を保持します。これは、現在スタックの一番上にあるワードを指します。しかし...
pushl を使用して何かをスタックにプッシュするたびに、%esp が 4 減算され、スタックの新しいトップを指すようになります (各ワードは 4 バイトの長さであり、スタックは下に向かって成長することに注意してください)。
何?まったく逆じゃない?別の 4 バイト サイズのマシン ワードをスタックにプッシュすると、このワードはメイン メモリ アドレス 12 ~ 15 を占有します。%esp レジスタは、現在スタックの一番上にあるワードを指します。それはアドレス 12 から始まります。別のワードをスタックにプッシュする前は、%esp に格納されていたアドレスは 8 でした。したがって、%esp は明らかに減算ではなく 4 が加算されています。彼らはどこから減算を取得しますか? 私は何を取りこぼしたか?私は非常に混乱しています...
助けていただければ幸いです;)