問題タブ [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 投票する
2 に答える
6776 参照

c++ - C++ インライン asm でのベース ポインター レジスタの使用

%rbpインライン asm 内でベース ポインタ レジスタ ( ) を使用できるようにしたいと考えています。このおもちゃの例は次のようになります。

古い をプッシュしてポップする通常のプロローグ/エピローグ関数呼び出し方法を使用しているので、これで問題ないことを願っていました%rbpxただし、インライン asm の後にアクセスしようとすると、seg fault が発生します。

GCC で生成されたアセンブリ コード (少し簡略化) は次のとおりです。

このセグメントが失敗する理由を誰か教えてもらえますか? どういうわけか破損しているようです%rbpが、方法がわかりません。前もって感謝します。

64 ビットの Ubuntu 14.04 で GCC 4.8.4 を実行しています。

0 投票する
2 に答える
1695 参照

assembly - レッド ゾーンがあるのに、なぜスタック割り当てが必要なのですか?

次の疑問があります。

私たちが知っているように、System V x86-64 ABI は、スタック フレーム内に約固定サイズ (128 バイト) の領域、いわゆるレッドゾーンを提供します。したがって、結果として、たとえば を使用する必要はありませんsub rsp, 12。作るだけmov [rsp-12], X、それだけです。

しかし、私はその考えを理解することはできません。なぜそれが重要なのですか?sub rsp, 12レッドゾーンなしにする必要はありますか?結局のところ、最初はスタック サイズが限られているのに、なぜsub rsp, 12重要なのでしょうか? スタックの一番上を追跡できることはわかっていますが、その時点では無視しましょう。

rsp一部の命令が値 ( など)を使用することは知っていretますが、その瞬間は気にしません。

問題の核心は次のとおりです。レッドゾーンはありません。

との違いは?

0 投票する
2 に答える
5775 参照

assembly - x86-64 のレッド ゾーンは正確にはどこですか?

ウィキペディアから:

コンピューティングでは、レッド ゾーンは、その関数によって保持されない戻りアドレスを超えた、関数のスタック フレーム内の固定サイズの領域です。呼び出し先関数は、スタック ポインターを変更する余分なオーバーヘッドなしで、ローカル変数を格納するためにレッド ゾーンを使用できます。このメモリ領域は、割り込み/例外/シグナル ハンドラによって変更されません。System V で使用される x86-64 ABI では、128 バイトのレッド ゾーンが義務付けられています。レッド ゾーンは、リターン アドレスの直後から始まり、関数の引数が含まれます。OpenRISC ツールチェーンは、128 バイトのレッド ゾーンを想定しています。

System V x86-64 ABIから:

%rspが指す場所を超える 128 バイトの領域は、予約されていると見なされ、シグナルまたは割り込みハンドラによって変更されません。したがって、関数は、関数呼び出し間で必要のない一時データのためにこの領域を使用する場合があります。特に、リーフ関数は、プロローグとエピローグでスタック ポインターを調整するのではなく、スタック フレーム全体にこの領域を使用する場合があります。このエリアはレッドゾーンとして知られています。

  • これら 2 つの引用符が与えられた場合、レッド ゾーン は積み上げられた返品先住所の上ですか、それとも積み上げられた返品先住所のですか?

  • このレッド ゾーンは に対して相対的なので、それぞれでRSP下に移動し、それぞれpushで上に移動しますpopか?

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

c - Aleph One 記事の作業中に 64 ビット システムでスタック割り当てがない

Aleph One の「Smash the Stack for Fun and Profit」をいじっていたところ、64 ビット プロセッサ用のコードをコンパイルしているときに、通常の「sub $VALUE, %」を使用してスタック メモリが割り当てられないことがわかりました。 REG.」

これは関数のソース コードです。

そして、これがコンパイルされたバージョンです

gcc で -m32 オプションを使用すると表示されるのに、標準のスタック割り当てがないのはなぜですか?