ちょうどx64アセンブリの学習を始めました。関数、引数、スタックに関する質問があります。私が理解する限り、関数の最初の4つの引数は、Windowsではrcx、rdx、r8、およびr9レジスタ(およびfloatの場合はxmm0-xmm3)に渡されます。私はdocumentation that mentions this渡って来ている引数が4つ未満の関数に必要なスタック領域を予約していますか?
add:
mov r10, rcx
add r10, rdx
add r10, r8
add r10, r9
mov rax, r10
ret
しかし、::だから些細な追加機能4つのパラメータで次のようになります
私が作っている関数が4つ以下の引数をとってもスタック空間を確保しなければならないのか、それともちょっとお勧めですか?最低でも、各機能は、32バイト(4を予約する必要があります64ビット値)をスタックに格納します。このスペースにより、関数に渡されたレジスタを、よく知られたスタック位置に簡単にコピーすることができます。 呼び出し元関数は、入力レジスタparamsをスタックに流す必要はありませんが、スタック領域の予約によって、必要に応じて確保できます。
http://www.agner.org/:インスタンスのGetAsyncKeyStateの最初の2つの命令は、あなたがパラメータに使用する呼び出し先のために確保することになっているの0x20バイト領域での戻り値以上のスタックを上書きoptimize/optimizing_assembly.pdfの第4章には、スペースを確保する必要があることを示すような例があります。 – user786653
編集に時間がかかりません。 [oldnewthing](http://blogs.msdn.com/b/oldnewthing/archive/2004/01/14/58579.aspx)amd64呼び出し規約のブログエントリ。 – user786653
あなたのためのもう一つのパズル:あなたは***リーフ機能***を持っています、それは他の機能を呼び出さないことを意味します。 – jww