2012-02-28 9 views
2

をポップなぜ(減少ではなく)あなたがスタックに値をプッシュするとき(増加ではなく)、ESPレジスタは減少し、あなたが値をポップする場合、ESPレジスタが増加するということです?これは、この時点で私には直感的ではありません。ASM - /プッシュ

+1

私は* *上向きに成長し、*その*は非常に直感的なカウンタ私にだったのスタックで仕事をしていた時代のカップル:) – harold

答えて

6

ザッツその方法は、スタックがボトムアップ割り当てられたヒープに反対し、上から下に「成長」するため。両方の割り当てられたメモリ領域の唯一の合計が一定の限度を超えてはならない - 限られたアドレス空間を持つアーキテクチャでは

これは、両方のより柔軟に使用することができ、設計上の決定でした。

は今日では、スタックとヒープのアドレス空間は、とにかく別のメモリ領域に保持されますが、彼らは後方成長スタックを維持することを決めました。

1

これは多かれ少なかれ任意のデザインの選択です。スタックポインタは、プッシュでインクリメントし、ポップでインクリメントする場合、同様にうまく機能します。いくつかの言語では、テキストは左から右に書くのではなく、右から左に書かれています。特定の方向性は実際には言語を良くしたり悪くしたりしません。

1

多くの環境でプログラマが直面している単一のメモリシステムでは、ヒープが下位アドレスから上位アドレスに成長し、スタックがメモリの上位アドレスの上から下に向かって衝突なしにそのメモリの使用を最大限に活用することができます。彼らが両方とも育った場合、痛みを伴い醜いやり方で飛び跳ねる必要があります。空き容量があるにもかかわらず、どちらか一方が制限されます。いくつかのプロセッサでは、mallocを書き直したり、独自のスタックを作成したり、スタックを増やしたりすることができます(いくつかの命令セットは、余分な労力を要することなく自由に実行できます)。フローと一緒に行くとスタックが成長し、ヒープが成長していることをお勧めします。