定義在 __asm 區塊視為 c 的巨集

Microsoft 專有的

C 的巨集提供便利的方式,將組譯程式碼插入程式碼中,但它們會要求額外進行處理,因為巨集展開成單一邏輯程式敘述行。若要建立簡單的巨集,請遵循下列規則:

  • 請將__asm封鎖大括號中。

  • 將__asm關鍵字前面的每個組件的指示。

  • 使用舊式 c 的註解 ( /* comment */) 而非組件樣式註解 ( ; comment) 或單行 c 的註解 ( // comment)。

為了說明,下列範例會定義簡單的巨集:

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

第一眼看,其中最後三個__asm關鍵字起來好像多餘。有需要,不過,因為巨集展開成單行:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

第三個和第四個__asm關鍵字所需做為陳述式分隔符號。唯一的陳述式分隔符號識別的__asm區塊是新行字元和__asm關鍵字。由於區塊定義為巨集是一個邏輯程式敘述行,您必須區隔每一項指令,以__asm。

大括號也很重要。如果您省略,編譯器可以在同一行右邊的 [巨集引動過程的 c 或 C++ 的陳述式所混淆。沒有右括號,編譯器無法確定其中的組件程式碼會停止,並看到 c 或 C++ 的陳述式__asm區塊為組件的指令。

組件樣式註解開頭分號的 (;) 繼續執行下一行的結尾。在巨集中中,因為編譯器會忽略所有項目之後的註解,一直到邏輯程式敘述行的結尾,這會造成問題。也是一樣的單行的 c 或 C++ 的註解 ( // comment)。如果要避免錯誤,請使用 [舊式 c 的註解 ( /* comment */) 在__asm區塊定義為巨集。

__asm區塊寫入如 c 的巨集可以取得引數。與一般 c 巨,不過,不同的是__asm巨集無法傳回值。因此,您無法在 c 或 C++ 運算式中使用這類巨集。

請小心,不要隨意叫用這種類型的巨集。舉個例說,叫用一個組合語言的巨集函式中宣告的__fastcall慣例可能會造成未預期的結果。(請參閱使用,並保留在內嵌組譯碼中的暫存器。)

結束 Microsoft 特定

請參閱

參考

內嵌組譯工具