Microsoft 特定的
__asm 關鍵字會叫用內嵌組合語言,而且可以出現在 C 或 C++ 陳述式有效的任何地方。 它不能單獨出現。 它後面必須接著一個組譯碼指令、一組用大括號括起來的指令,或至少是一對空大括號。 這裡的「__asm 區塊」一詞是指任何指令或指令群組,不論是否放在大括號中。
注意
標準 C++ asm 關鍵字的 MSVC 支援僅限於編譯器不會在關鍵字上產生錯誤。 不過,asm 區塊不會產生任何有意義的程式碼。 使用 __asm 取代 asm。
文法
asm-block:
__asm
assembly-instruction;可選的
__asm {
裝配指令清單};選擇
assembly-instruction-list:
assembly-instruction;可選
assembly-instruction;assembly-instruction-list;選擇
備註
如果不含大括號使用,__asm 關鍵字表示該行的其餘部分是組合語言的陳述式。 如果搭配大括號使用,表示在大括號之間的每一行都是組合語言的陳述式。 為了與舊版相容,_asm是 unless 編譯器選項 /Za 的同義字。
由於 __asm 關鍵字是陳述式分隔符號,您可以在同一行上放置組譯碼指令。
在 Visual Studio 2005 之前,該指令
__asm int 3
在使用 /clr 編譯時不會產生機器碼;編譯器會將該指令轉譯為 CLR 中斷指令。
__asm int 3 現在會產生函式的機器碼。 如果您想要函式在程式碼中產生中斷點,而且還想要將函式編譯為 MSIL,請使用 __debugbreak。
範例
下列程式碼片段是放在大括號中的簡單 __asm 區塊:
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
或者,您可以將 __asm 放在每個組譯碼指令前面:
__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al
由於 __asm 關鍵字是陳述式分隔符號,您也可以將組件指令放在同一行:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
這三個範例會產生相同的程式碼,不過,第一個樣式 (將 __asm 區塊放在括號中) 會比較具有優勢。 大括號會明顯分隔組合語言程式碼與 C 或 C++ 程式碼,並避免 __asm 關鍵字不必要的重複。 大括號也可避免語意模糊。 如果您想要在 __asm 區塊的同一行放置 C 或 C++ 陳述式,則必須以大括號括住區塊。 沒有括號,編譯器就無法分辨組譯碼停止和 C 或 C++ 陳述式開始的位置。 最後,因為在括號中的文字與一般的 MASM 文字格式相同,您可以輕鬆地從現有的 MASM 原始程式檔剪貼文字。
與 C 和 C++ 中的大括號不同,將 __asm 區塊括住的大括號不會影響變數範圍。 您也可以使用巢狀 __asm 區塊;巢狀並不會影響變數範圍。
END Microsoft 特定的