私は現在、「アセンブリ言語のガイド」のx86アセンブリを学習しています.241ページには、16ビットワードまたは32ビットワードのみがスタックに保存されると書かれています。これは本当ですか? C言語では、char配列は1バイトで構成されており、Cはコールスタックを使用する関数で構成されているため、スタックに保存されます。では何が間違っているのですか?x86の呼び出しスタックで1バイトを節約する
答えて
偶数バイトはゼロで埋められ、プッシュされる前に16ビットまたは32ビットワードに変換されます。
スタックを特定のサイズ(16または32)のプレートの積み重ねとして考えます。あなたがサイズプレートの半分を押すことができる方法はありますか?いいえ?サイズの半分を押したい場合でも、フルサイズのプレートを作って押します。
私は、他の投稿でコメントしたいと思っていましたが、誰かまたは作者がそれを削除しました。これは私の他の質問です。つまり基本的にCはchar配列の最初の要素を初期化するようにします:movb $ 65、(%esp)forインデックス0?それ以前は、sub sizeofarray、%espのようなことをするでしょうか? – rob
@rob:私はこれを元に戻しました。これはもう間違っていません:-)基本的にはそうですが、あなたの実装が何をするかを正確に見るために逆アセンブリを見てください。配列の先頭が 'esp'かどうかは、あなたが持っている他の自動変数に依存します。 –
これはpush
命令に当てはまりますが、スタックを使用する唯一の方法ではありません。 x86には、現在のスタック位置へのポインタを格納するespレジスタもあります。
関数の引数はスタック上にあります。逆アセンブリのいくつかをチェックすると、コンパイラがそれらを取得する方法がわかります。通常の呼び出し規約では、char
の引数はそれぞれ4バイトを占めます。配列は値で渡すことはできません。そのため、可能であればchar配列をどのように保存するかは問題になりません。
自動変数もスタックを占有しますが、配列要素は「プッシュ」を使用してスタックに個別に保存されません。一般に、関数は開始時にすべての自動変数のためのスペースを作成します - "esp"を含む "sub"命令を探します。次に、配列の開始点はespの既知のオフセットになります。自動変数と同じように、コンパイラはこのオフセットを使用して配列へのアクセスを生成します。スタックポインタを正しく整列させるために、配列の最後の後にはいくつかの部分があるかもしれませんが、要素間のパディングは必要ありません。
- 1. コルーチンの呼び出しスタック
- 2. 1つのバッチを複数の呼び出しに分割してメモリを節約する方法
- 3. ルビーコード "around"呼び出しスタック
- 4. VS 2010/DotNet 4.0 x86ターゲットアプリケーションからx86 dllを呼び出す
- 5. Javaのメソッド呼び出しスタックのコピー
- 6. 1回の呼び出しでメソッドを呼び出す
- 7. WinDbg呼び出しスタックの16進オフセット
- 8. JavascriptとJqueryの呼び出しスタック
- 9. Androidのメソッド呼び出しスタック
- 10. アンマネージド関数のフック、呼び出し規約のスタック/レジスタの問題?
- 11. setTimeoutを呼び出すと、呼び出しスタックがクリアされますか?
- 12. Cとx86アセンブリを結合するときの呼び出し規約を前提とします。
- 13. WindowsでC++呼び出しスタックを取得する例
- 14. where節への関数呼び出しを呼び出すと、オーバーラッピングインスタンスでタイプチェッカーが破られる
- 15. C#スタックがスタック上で呼び出されたときに検出する
- 16. Javaで呼び出されるメソッドのスタックを取得する
- 17. 異なる呼び出し規約を持つ呼び出し可能オブジェクト
- 18. バックボーンのビューを変更する:最大呼び出しスタックExcedeed
- 19. 3回の再帰呼び出しを1行で呼び出しますか?
- 20. Djangoのシグナルは、約2呼び出し
- 21. 約束の呼び出しメソッド
- 22. Twistedで倹約の呼び出しをブロックする
- 23. swift 3 REST API呼び出しは、1(int)の代わりに1バイトを返します。なぜですか?
- 24. MQTTパホがmessage_callback_addへの呼び出しでスタックしました
- 25. 同じ呼び出しスタック内で重複呼び出しを識別する - Java
- 26. Javaメソッド呼び出しのCPU /スタックを制限しますか?
- 27. c#のコードのデバッグと呼び出しスタックを避ける
- 28. CDECL呼び出し規約では、スタックにプッシュした引数を再利用できますか?
- 29. Javaメソッド呼び出しスタックを印刷するには?
- 30. メソッド呼び出しをスタックする方法は?
[なぜPentium IA-32のスタックにバイトをプッシュできないのですか?](http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to -push-a-byte-on-a-stack-on-pentium-ia-32)あなたのコンパイルがコンパイルするものを逆アセンブルし、それについて議論しましょう。 –