將 __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)。 若要避免這個錯誤,請在定義為巨集的 __asm 區塊中使用舊式的 C 註解 (/* comment */)。
以 C 巨集形式撰寫的 __asm 區塊可以接受引數。 不過,和一般的 C 巨集不同的是,__asm 巨集無法傳回值。 因此您無法在 C 或 C++ 運算式中使用此類的巨集。
請務必小心,不要隨意叫用此類巨集。 例如,在使用 __fastcall 慣例宣告的函式中叫用組合語言巨集可能會導致未預期的結果。(請參閱在內嵌組譯碼中使用和保存暫存器)。
END Microsoft 特定的