問題タブ [red-zone]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
162 参照

c - gcc がスタックにメモリを割り当てるさまざまな方法

printf()gcc はスタックに割り当てるメモリの量をどのように決定し、メインから (または任意の関数呼び出しを)削除しても %rsp を減らさないのはなぜですか?

1.コード サンプルをいじってみたところ、https: //godbolt.org/z/fQqkNEコードから削除すると6th line、gcc アセンブリ ビューアーsubq $48, %rspが削除されることに気付きました。メイン内から関数呼び出しを行わないと、デクリメントされませんが、データはオフセットに基づいて割り当てられます。スタックが成長したときにのみ変化すると思いました。私の理論は、他の関数呼び出しを行わないため、他の存在しない関数のスタックを保持する必要がないことを知っているというものです。しかし、データが保存されているので、まだ成長するべきではありませんか?printf()Cline 22%rsp%rbp%rsp%rsp

2. my に変数を追加するとrect struct、追加されたデータ型のサイズよりも大きなステップでメモリが割り当てられる場合があることにも気付きました。スタックに割り当てるメモリの量を決定するときに従う規則は何ですか?

3.アセンブリ コードを入力として受け取り、スタックのイメージを描画して、実行の任意の時点でのすべてのレジスタの状態を教えてくれるオンライン ツールはありますか? Godbolt.org は非常に優れたツールです。これら 2 つの追加機能があればいいのにと思います。

Godbolt へのリンクが将来機能しなくなった場合に備えて、以下のコードを貼り付けます。

PS: 私がフォローしている本では、x86 を教えるために AT&T 構文を使用しています。オンラインチュートリアルを見つけるのがずっと難しくなるので、これは奇妙です.

0 投票する
1 に答える
228 参照

assembly - 新しい関数にジャンプした後の rbp の値の変化

次のアセンブリプログラムがあります。

プログラムをステップ実行するとき、以前は $0x0800001e` (8 バイト、0 バイト、0 バイト、30 バイト) だった の値にアクセスしようとした後、call func前に、すべてゼロが表示されるようになりました。push %rbprbp

なぜこれが起こるのですか?rbp関数呼び出し間で値をリセットしますが (アドレスは保持します) ?