Share via


將 __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++ 陳述式位於巨集引動過程右邊的同一行而混淆。 少了右邊的大括號,編譯器無法分辨出組譯程式碼從何處停止,因此,它會將 __asm 區塊後的 C 或 C++ 陳述式視為組譯碼指令。

以分號開頭的元件樣式批註 ( ; ) 會繼續行尾。 因為編譯器會忽略註釋後方的所有項目,一直到邏輯程式敘述行的結尾,所以會在巨集中產生問題。 同樣的情形也會出現在單行 C 或 C++ 註解 ( // comment)。 若要避免這個錯誤,請在定義為巨集的 /* comment */ 區塊中使用舊式的 C 註解 (__asm)。

以 C 巨集形式撰寫的 __asm 區塊可以接受引數。 不過,和一般的 C 巨集不同的是,__asm 巨集無法傳回值。 因此您無法在 C 或 C++ 運算式中使用此類的巨集。

請務必小心,不要隨意叫用此類巨集。 例如,在使用 __fastcall 慣例宣告的函式中叫用組合語言巨集可能會導致未預期的結果。 (請參閱 在內嵌元件 中使用和保留暫存器。

END Microsoft 特定的

另請參閱

內嵌組合語言