私は、次の疑問があります。我々は、System Vのx86-64のABIはとてもレッドゾーンと呼ばれる、スタックフレームで固定サイズのエリア(128バイト)についての私達を与える知っているよう赤いゾーンがあるときにスタック割り当てが必要なのはなぜですか?
を。 その結果、たとえばsub rsp, 12
を使用する必要はありません。ちょうどmov [rsp-12], X
とそれだけです。
しかし、私はそれの考えを把握することはできません。なぜそれは重要ですか?レッドゾーンなしでsub rsp, 12
が必要ですか?結局のところ、スタックのサイズは最初は制限されているので、なぜsub rsp, 12
が重要ですか?私はそれがスタックの上をたどることを可能にするが、それを無視することを可能にすることを知っている。
rsp
の値(ret
など)の使用方法はわかりますが、その瞬間は気にしないでください。
問題の核心がある: 私たちは何のレッドゾーンを持っていないし、私たちがやった:
function:
mov [rsp-16], rcx
mov [rsp-32], rcx
mov [rsp-128], rcx
mov [rsp-1024], rcx
ret
それはとの違いですか?
function:
sub rsp, 1024
mov [rsp-16], rcx
mov [rsp-32], rcx
mov [rsp-128], rcx
mov [rsp-1024], rcx
add rsp, 1024
ret
ここに示した2番目のコードスニペットは間違っています。スタックポインタを減らす場合は、関数から戻る前にスタックポインタを復元する必要があります。したがって、 'ret rpの前に' add rsp、1024'を追加する必要があります。 –
これはどれですか?私はLinuxを想定していますが、他にもLinuxがあります。 Windows 64、Mac OS X 64ビットなど –
@rudy私が理解する限り、x8664 ABIは2つしかありません:System V AMD64 ABI(Linux、Solaris、OS X、その他のPOSIXで使用されています)準拠のオペレーティングシステム)、およびMicrosoftの実装はWindows上で使用されます。問題は前者の問題だと思われる。 –