問題タブ [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.
c++ - C++ インライン asm でのベース ポインター レジスタの使用
%rbp
インライン asm 内でベース ポインタ レジスタ ( ) を使用できるようにしたいと考えています。このおもちゃの例は次のようになります。
古い をプッシュしてポップする通常のプロローグ/エピローグ関数呼び出し方法を使用しているので、これで問題ないことを願っていました%rbp
。x
ただし、インライン asm の後にアクセスしようとすると、seg fault が発生します。
GCC で生成されたアセンブリ コード (少し簡略化) は次のとおりです。
このセグメントが失敗する理由を誰か教えてもらえますか? どういうわけか破損しているようです%rbp
が、方法がわかりません。前もって感謝します。
64 ビットの Ubuntu 14.04 で GCC 4.8.4 を実行しています。
assembly - レッド ゾーンがあるのに、なぜスタック割り当てが必要なのですか?
次の疑問があります。
私たちが知っているように、System V x86-64 ABI は、スタック フレーム内に約固定サイズ (128 バイト) の領域、いわゆるレッドゾーンを提供します。したがって、結果として、たとえば を使用する必要はありませんsub rsp, 12
。作るだけmov [rsp-12], X
、それだけです。
しかし、私はその考えを理解することはできません。なぜそれが重要なのですか?sub rsp, 12
レッドゾーンなしにする必要はありますか?結局のところ、最初はスタック サイズが限られているのに、なぜsub rsp, 12
重要なのでしょうか? スタックの一番上を追跡できることはわかっていますが、その時点では無視しましょう。
rsp
一部の命令が値 ( など)を使用することは知っていret
ますが、その瞬間は気にしません。
問題の核心は次のとおりです。レッドゾーンはありません。
との違いは?
assembly - x86-64 のレッド ゾーンは正確にはどこですか?
ウィキペディアから:
コンピューティングでは、レッド ゾーンは、その関数によって保持されない戻りアドレスを超えた、関数のスタック フレーム内の固定サイズの領域です。呼び出し先関数は、スタック ポインターを変更する余分なオーバーヘッドなしで、ローカル変数を格納するためにレッド ゾーンを使用できます。このメモリ領域は、割り込み/例外/シグナル ハンドラによって変更されません。System V で使用される x86-64 ABI では、128 バイトのレッド ゾーンが義務付けられています。レッド ゾーンは、リターン アドレスの直後から始まり、関数の引数が含まれます。OpenRISC ツールチェーンは、128 バイトのレッド ゾーンを想定しています。
%rspが指す場所を超える 128 バイトの領域は、予約されていると見なされ、シグナルまたは割り込みハンドラによって変更されません。したがって、関数は、関数呼び出し間で必要のない一時データのためにこの領域を使用する場合があります。特に、リーフ関数は、プロローグとエピローグでスタック ポインターを調整するのではなく、スタック フレーム全体にこの領域を使用する場合があります。このエリアはレッドゾーンとして知られています。
これら 2 つの引用符が与えられた場合、レッド ゾーン は積み上げられた返品先住所の上ですか、それとも積み上げられた返品先住所の下ですか?
このレッド ゾーンは に対して相対的なので、それぞれで
RSP
下に移動し、それぞれpush
で上に移動しますpop
か?
c - Aleph One 記事の作業中に 64 ビット システムでスタック割り当てがない
Aleph One の「Smash the Stack for Fun and Profit」をいじっていたところ、64 ビット プロセッサ用のコードをコンパイルしているときに、通常の「sub $VALUE, %」を使用してスタック メモリが割り当てられないことがわかりました。 REG.」
これは関数のソース コードです。
そして、これがコンパイルされたバージョンです
gcc で -m32 オプションを使用すると表示されるのに、標準のスタック割り当てがないのはなぜですか?