「Abi64」のようなものはありません。 MASMの質問にタグを付けたので、あなたはWindowsプラットフォームを使用していると推測できます。明らかに "64"はこれが64ビットコードであることを意味するため、可能性を大幅に絞り込んでいます。しかし、Windows上の64ビットコードには、依然として2つの共通呼び出し規約があります。そのうちの1つは__vectorcall
で、もう1つはMicrosoft x64呼び出し規約です(他のすべての呼び出し規約は廃止され、&hellipにするために考案されたものです)。
Microsoft x64呼び出し規約が最も一般的で、この特定のケースでは__vectorcall
を使用しても何も変更されないため、使用していると仮定します。そして、必要なコードは絶対に些細なことになります。スタックが同じように設定されるので、f1
からf2
にジャンプするだけです。 f1
の最初の2つのパラメータは、f2
に渡すべき2つのパラメータであり、戻り値f2
はf1
の戻り値です。したがって、
これは書き込みが簡単であるだけでなく、サイズと速度の両方にとって最適な実装です。
したい場合でも例えば、事前にv1
またはv2
パラメータを変更することができます:あなたはもっと複雑なものをやってみたかった場合
f1:
inc ecx ; increment v1 (passed in ecx)
; multiply v2 (xmm1) by v1 (ecx)
movd xmm0, ecx
cvtdq2ps xmm0, xmm0
mulss xmm1, xmm0
rex_jmp r8 ; third parameter (pointer to f2) is passed in r8
を、ここではそれがうまくいく方法は次のとおりです。
f1:
sub rsp, 40 ; allocate the required space on the stack
call r8 ; call f2 through the pointer, passed in r8
add rsp, 40 ; clean up the stack
ret
に留意されたいです。質問に表示されているプロローグ/エピローグコードは必要ありませんが、それを含めると何かを傷つけることはありません。
ただし、質問に表示されているサンプルコードで行っていたパラメータのシャッフルは、が間違っています! Microsoft x64呼び出し規約では、最初の4つまでの整数引数は、RCX、RDX、R8、およびR9の左から右へレジスタで渡されます。その他の整数引数はすべてスタックに渡されます。最初の4つまでの浮動小数点値は、左から右、XMM0、XMM1、XMM2、およびXMM3のレジスタにも渡されます。残りはレジスタには大きすぎる構造体と共にスタックに渡されます。
しかし、変わったことは、スロットが「固定」であるため、整数とfpの引数が混在している場合でも、合計4つのレジスタのargだけが使用できることです。したがって:
╔═══════════╦══════════════════════════╗
║ ║ TYPE ║
║ PARAMETER ╠═════════╦════════════════╣
║ ║ Integer ║ Floating-Point ║
╠═══════════╬═════════╬════════════════╣
║ First ║ RCX ║ XMM0 ║
╠═══════════╬═════════╬════════════════╣
║ Second ║ RDX ║ XMM1 ║
╠═══════════╬═════════╬════════════════╣
║ Third ║ R8 ║ XMM2 ║
╠═══════════╬═════════╬════════════════╣
║ Fourth ║ R9 ║ XMM3 ║
╠═══════════╬═════════╩════════════════╣
║ (rest) ║ on stack ║
╚═══════════╩══════════════════════════╝
第2パラメータは、渡される最初の浮動小数点値ではありません。最初の浮動小数点値なのでXMM0には入りません。これは2番目のパラメータであり、2番目の「スロット」にあるためXMM1に入ります。 (これはthe x86-64 System V ABIとは異なります。最初の6つの整数引数がレジスタに入りますが、FP引数があるかどうかは関係ありません)。
Windowsパラメータの受け渡しに関する詳細なドキュメントは、例を含めてhereです。
現在使用しているプラットフォーム上のアプリケーションバイナリインターフェイスは何ですか?それは、パラメータがどこにあり、呼び出し規約が何であるかを定義します。 –
@DavidHoelzer Abi64 – helloFromTheOtherSide
これは何ですか?そのようなABIはありません。 –