2017-05-09 105 views
-1

按照DOCO我可以找到關於調用Windows函數,應用如下: -窗口64位調用約定

微軟64位調用約定[12] [13]隨後在Windows和預啓動UEFI(用於在x86-64上的長模式)。它使用寄存器RCX,RDX,R8,R9作爲前四個整數或指針參數(按此順序),並將附加參數壓入堆棧(從右到左)。如果64位或更少,整數返回值(類似於x86)將在RAX中返回。

在Microsoft x64調用約定中,調用者有責任在調用函數之前在堆棧上分配32個字節的「影子空間」(不管實際使用的參數數量是多少),並在彈出堆棧後彈出堆棧呼叫。陰影空間用於溢出RCX,RDX,R8和R9,但是必須使所有功能都可用,即使參數少於4個也是如此。

。寄存器RAX,RCX,RDX,R8,R9,R10,R11被認爲是易失性(呼叫者保存)。[15]

。寄存器RBX,RBP,RDI,RSI,RSP,R12,R13,R14,和R15被認爲是非易失性的(被調用方保存)。[15]

所以,我一直在呼籲愉快KERNEL32直到在某些情況下未能調用「GetEnvironmentVariableA」。我終於追溯到這樣一個事實,即直接旗幟已經確定,我需要清除它。

我的問題。直到現在,我還沒有找到任何提及這一點的信息,並想知道在通話之前總是清除它是否明智。或者也許會導致其他問題。任何人都知道打電話的約定在這種情況下

81分鐘前

回答

0

窗口假設direction flag被清除。儘管在文章中提到了關於C的運行時間,但對於整個窗口來說這是真的(因爲Windows代碼本身主要寫在c/C++上)。所以當你的程序開始執行 - 你可以假設DF是0.通常你不需要改變這個標誌。然而,如果在一些內部例行你暫時改變它(設置爲1),則必須調用任何Windows API或任何外部模塊(因爲它假設DF爲0)之前CLD清除它。

所有窗口中斷在非常開始執行明確DF 0 - 所以這是安全的臨時集合DF至1自己的內部代碼,主 - 之前的任何外部調用重置回0