定義在 __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 特定