Linuxはx86-64(AMD64)アーキテクチャ用のSystem V ABIを使用します。詳細はSystem V ABI at OSDev Wikiを参照してください。
これは、スタックがになったことを意味します。;より小さいアドレスはスタック内で「上位」になります。典型的なC関数が
pushq %rbp ; Save address of previous stack frame
movq %rsp, %rbp ; Address of current stack frame
subq $16, %rsp ; Reserve 16 bytes for local variables
; ... function ...
movq %rbp, %rsp ; \ equivalent to the
popq %rbp ;/'leave' instruction
ret
にコンパイルされているローカル変数のために予約されるメモリの量は、16バイトにアラインスタックを維持するために、常に16バイトの倍数です。ローカル変数にスタック領域が必要ない場合は、subq $16, %rsp
またはそれに類する命令はありません。
(リターンアドレススタックにプッシュ前%rbp
サイズは両方の8バイト、合計16バイトであることに留意されたい。)
一方の上部に現在のスタックフレームに%rbp
点、%rsp
点スタックコンパイラは%rbp
と%rsp
の差を関数内の任意の点で知っているため、ローカル変数のいずれかを自由に使用できます。
スタックフレームは、ローカル関数の遊び場です。現在の関数が使用するスタック領域です。
現在のバージョンのGCCでは、最適化が使用されるたびにスタックフレームが無効になります。 Cで書かれたプログラムの場合、スタックフレームはデバッグには最も役立ちますが、あまり多くはありません。
同じABIがすべてのバイナリに適用されますが、どの言語で書かれていても、特定の他の言語では、「巻き戻し」のためにスタックフレームが必要になります(たとえば、-O2 -fno-omit-frame-pointer
を使用すると、スタックフレームを維持できます。 "(例えば、現在の関数の祖先呼び出し側に"例外をスロー "するため)。スタック上に不要なものを残すことなく、1つまたは複数の機能を中止し、いくつかの祖先関数に制御を渡すことができるスタックフレームを「巻き戻す」ことができる。スタックフレームが省略されている
から GCCのため - 、基本的
subq $8, %rsp ; Re-align stack frame, and
; reserve memory for local variables
; ... function ...
addq $8, %rsp
ret
の機能の実装の変更なしスタックフレームが存在しないので(%rbp
は、他の目的のために使用され、その値が押されることはありません各関数呼び出しは8バイトの量のスタックへの戻りアドレスのみをプッシュするので、%rsp
から8を引いて16の倍数にしておく必要があります(一般に、 〜%rsp
は8の奇数倍です)。
関数のパラメータは、通常、レジスタに渡されます。 %xmm0
%xmm7
にレジスタ内の浮動小数点引数を指定して、詳細については、この回答の冒頭でABIのリンクを参照してください、しかし、短期では、整数型とポインタは、レジスタ%rdi
に渡され、%rsi
、%rdx
、%rcx
、%r8
、および%r9
。
rep
の代わりにrep ret
が表示される場合もあります。混乱しないでください。rep ret
は、ret
と全く同じことを意味します。 rep
という接頭辞は、文字列命令(繰り返し命令)で通常使用されますが、ret
命令に適用されても何も実行されません。特定のAMDプロセッサの分岐予測器がret
命令にジャンプするのを好まないのは、その代わりにrep ret
を使用することです。
最後に、スタックの先頭(%rsp
未満の128バイト)の上にあるred zoneを省略しました。通常のスタックフレームの場合、デバッグを可能にするためにローカルのものがスタックフレーム内にあることが望ましいでしょう。 omit-stack-frameの場合、スタックアライメントの要件では、すでに%rsp
から8を引く必要があることを意味しています。
最適化を有効にするのを忘れました。減算する量は、配置要件と赤いゾーンを使用できるかどうかによって異なります。 – Jester
@Jester最適化を有効にしても、フレームポインタの省略が有効になるわけではありません。 –
[基本ポインタとスタックポインタとはまったく同じですか?彼らは何を指しているのですか?](http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-theypoint)。それはx86_32コードと同じです。 – usr2564301