使用,並保留在內嵌組譯碼中的暫存器

Microsoft 專有的

一般情況下,您不應該假設暫存器就可以指定的值時__asm區塊開始。暫存器值並不保證會保留至不同的__asm區塊。如果您結束的內嵌程式碼區塊,並開始另一個,您不能保留它們的值從第一個區塊的第二個區塊中的暫存器。__asm區塊會繼承任何註冊控制項的一般流程中的值結果。

如果您使用__fastcall呼叫慣例,編譯器傳遞函式引數暫存器,而不是在堆疊上。這可能會產生問題,函式,在__asm因為函式有辦法知道是哪一個暫存器中的哪一個參數會封鎖。如果函式會在 EAX 中接收的參數會受到影響,並立即儲存 EAX 中的其他項目,原始的參數將會遺失。此外,您必須保留 ECX 暫存器,以宣告的任何函式在__fastcall。

若要避免這類登錄衝突,請勿使用__fastcall之函式包含的慣例__asm區塊。如果您指定__fastcall慣例使用 /Gr 編譯器選項時,全域宣告每個函式包含__asm區塊__cdecl或__stdcall。( __cdecl屬性會告知編譯器該函式使用到 c 呼叫慣例。) 如果您不以 /Gr 進行編譯,而不必宣告該函數與__fastcall屬性。

當使用__asm C/C++ 函式中寫入組件的語言,您不需要保留 EAX、 EBX、 ECX、 EDX、 ESI 或 EDI 的暫存器。例如,在 POWER2 中。C 的範例,在具有內嵌組譯碼的撰寫函式、 power2函式並不會保留在 EAX 登錄中的值。不過,使用這些暫存器會影響程式碼品質因為暫存器配置器無法使用它們來存放值用於__asm區塊。此外,使用 EBX、 ESI 或 EDI 內嵌組譯程式碼中,您會強制編譯器儲存並還原在函式初構和終這些暫存器。

您應該保留其他您使用 (例如 DS、 SS、 預存程序、 BP 和旗標的暫存器) 的暫存器的領域__asm區塊。除非您有一些變更,(例如切換堆疊) 的理由,您應該保留 ESP 和 EBP 暫存器。請參閱最佳化內嵌組譯碼

有些 SSE 類型需要八位元組的堆疊的對齊方式,強制編譯器將發出動態堆疊對齊程式碼。若要對齊方式之後,存取本機變數和函式參數,編譯器會維護兩個框架指標。如果編譯器執行框架指標省略 (FPO) 時,它會使用 EBP 和 ESP。如果編譯器不會執行 FPO,它會使用 EBX 和 EBP。若要正確地確保在程式碼執行,請勿修改 EBX 組譯程式碼中如果函數需要動態堆疊的對齊方式,因為它無法修改框架指標。將八位元組對齊的類型的函式,或是避免使用 EBX。

注意事項注意事項

如果您內嵌組譯程式碼會變更使用的標準或 CLD 指示的方向旗標,您必須還原成原來的值的旗標。

結束 Microsoft 特定

請參閱

參考

內嵌組譯工具