0

Windows関数の呼び出しで見つけることができるドキュメントによると、以下が適用されます:-

Microsoft x64 呼び出し規則 [12][13] は、Windows およびプリブート UEFI (x86-64 でのロング モード用) に準拠しています。最初の 4 つの整数またはポインター引数にレジスター RCX、RDX、R8、R9 を (この順序で) 使用し、追加の引数を (右から左に) スタックにプッシュします。整数の戻り値 (x86 と同様) は、64 ビット以下の場合、RAX で返されます。

Microsoft x64 呼び出し規約では、関数を呼び出す直前にスタックに 32 バイトの "シャドウ スペース" を割り当て (実際に使用されるパラメーターの数に関係なく)、呼び出し後にスタックをポップするのは呼び出し元の責任です。シャドウ スペースは、RCX、RDX、R8、および R9 をスピルするために使用されますが、[14] すべての関数で使用できるようにする必要があります。

レジスタ RAX、RCX、RDX、R8、R9、R10、R11 は揮発性 (呼び出し元保存) と見なされます [15]。

レジスタ RBX、RBP、RDI、RSI、RSP、R12、R13、R14、および R15 は、不揮発性 (callee-saved) と見なされます。[15]

GetEnvironmentVariableAそのため、特定の状況でへの呼び出しが失敗するまで、kernel32 を喜んで呼び出していました。DF最終的に、方向フラグが設定されていて、それをクリアする必要があるという事実にたどり着きました。

私は今までこれについての言及を見つけることができず、電話の前に常にそれをクリアするのが賢明かどうか疑問に思いました.

あるいは、他の問題を引き起こす可能性があります。この場合の呼び出しの規則を知っている人はいますか?

4

1 に答える 1