16

Intel Pentium のスタックに 1 バイトを直接プッシュできないことを知りました。これについて誰か説明してもらえますか?

私が与えられた理由は、esp レジスタがワード アドレス指定可能 (または、モデルの仮定) であり、「偶数アドレス」でなければならないためです。32 ビットの 2 進数の値をデクリメントしても、レジスターのアライメントが乱れることはないと思っていたのですが、どうやら十分に理解できていないようです。

NASM テストをいくつか試してみたところ、変数を宣言し (db 123 を噛む)、それをスタックにプッシュすると、esp が 4 減ります (32 ビットをプッシュしたことを示していますか?)。しかし、「プッシュ バイト バイト」(変数名の選択については申し訳ありません) は一種のエラーになります。

test.asm:10: エラー: サポートされていない非 32 ビット ELF 再配置

この困難な時期に知恵の言葉をいただければ幸いです。私は学部 1 年生です。

4

4 に答える 4

13

場合によっては、スタック ポインターが機能しなくなります。たとえば、1 バイトをスタックにプッシュしてから別の関数を呼び出す関数があるとします。呼び出しは、最終的に、位置合わせされていない戻りアドレスをスタックに書き込もうとするため、エラーが発生します。

于 2010-04-06T16:45:55.293 に答える
6

スタックの作成方法に基づいています。

スタック セグメントのアドレス サイズ属性によって、スタック ポインターのサイズ (16、32、または 64 ビット) が決まります。現在のコード セグメントのオペランド サイズ属性によって、スタック ポインターが減少する量 (2、4、または 8 バイト) が決まります。

非 64 ビット モード: アドレス サイズとオペランド サイズの属性が 32 の場合、32 ビットの ESP レジスタ (スタック ポインター) は 4 減分されます。両方の属性が 16 の場合、16 ビットの SP レジスタ (スタック ポインター)ポインター) が 2 減ります。

出典: http://www.intel.com/Assets/PDF/manual/253667.pdf

ページ。4-320巻 2B

編集

また、興味深い読み物がマニュアルのスタックに関するセクションであることも指摘したいと思います。スタックセグメントの作成についてさらに説明します。

http://www.intel.com/Assets/PDF/manual/253665.pdf

第6.2章

于 2010-04-06T16:50:00.203 に答える
1

やりたいことは、ビット ローテーション オペコードを使用して各 32 ビット メモリ ロケーションをローテーションし、開始ビット位置にローテーションして戻るまで、一度に 8 ビットをレジスタに配置することです。これで、32 ビット レジスタに 4 つの 8 ビット量が並んでいるはずです。これをスタックにプッシュすれば完了です。

于 2010-04-06T16:49:45.733 に答える
0

スタック ポインターは (いくつかの最適化の理由で) 4B にアラインされている必要があります -> 4 で割り切れる必要があります (したがって、最後の 2 ビットはゼロになります)。

于 2010-04-06T16:44:36.530 に答える