2017-05-09 8 views
-1

を呼び出す: - のために([12] [13]は、WindowsとプリブートUEFIに続いている呼び出し規約マイクロソフトのx64Windowsの64ビットIは、窓関数を呼び出すに見つけることができますDOCO、以下が適用による条約

x86-64ではロングモード)。最初の4つの整数またはポインタ引数(その順番)にレジスタRCX、RDX、R8、R9を使用し、追加の引数がスタック(右から左)にプッシュされます。 64ビット以下の場合、整数戻り値(x86に似ています)がRAXに返されます。

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

レジスタRAX、RCX、RDX、R8、R9、R10、R11は揮発性(発呼者保存)とみなされます。

レジスタRBX、RBP、RDI、RSI、RSP、R12、R13、R14、およびR15は不揮発性(呼び出し先保存)とみなされます。

私は、特定の状況下で "GetEnvironmentVariableA"の呼び出しが失敗するまで、うれしくkernel32を呼び出しています。私は最終的に、それが直接の旗がセットされ、それをクリアする必要があるという事実にそれを戻した。

私の質問です。私はこれまで何の言及も見つけられず、電話の前にいつもそれをクリアするのが賢明かどうか疑問に思った。あるいはそれは他の問題を引き起こすでしょう。この例では呼び出しの慣習を知って誰もが

81分前

答えて

0

窓がdirection flagがクリアされていることを前提としています。記事にもかかわらず約C実行時のみ、これはすべてのウィンドウに当てはまります(Windowsはc/C++で書かれた主なコードなので)。あなたのプログラムが実行を開始すると、DFが0であると仮定できます。通常、このフラグを変更する必要はありません。ただし、内部ルーチンで一時的に変更(1に設定)した場合は、cldでクリアする必要があります(DFが0であると仮定しているため)。これは、安全な一時的なセットあるDF 1に独自の内部コードでは、メイン - - 任意の外部コールバック0

にそれをリセットする前に、すべてのウィンドウが非常に実行が0にDF 明らかである開始時に割り込み

関連する問題