Share via


__asm

Microsoft 特定的

__asm 關鍵字會叫用內嵌組合語言,而且可以出現在 C 或 C++ 陳述式有效的任何地方。 它不能單獨出現。 它後面必須接著元件指令、一組以大括弧括住的指令,或至少一組空的大括弧。 這裡的「__asm 區塊」一詞是指任何指令或指令群組,不論是否放在大括號中。

注意

Visual C++ 對 Standard C++ asm 關鍵字的支援受到「編譯器不會發生關鍵字的錯誤」的這個事實所限制。 不過,asm 區塊不會產生任何有意義的程式碼。 使用 __asm 取代 asm

文法

asm-block
__asmassembly-instruction ; opt
__asm {assembly-instruction-list }; opt

assembly-instruction-list
assembly-instruction ; opt
assembly-instruction assembly-instruction-list ; opt ;

備註

如果不含大括號使用,__asm 關鍵字表示該行的其餘部分是組合語言的陳述式。 如果搭配大括號使用,表示在大括號之間的每一行都是組合語言的陳述式。 為了與舊版相容,_asm__asm 的同義字。

由於 __asm 關鍵字是陳述式分隔符號,您可以在同一行上放置組譯碼指令。

在 Visual Studio 2005 之前,指示

__asm int 3

未在以 /clr 編譯時產生機器碼;編譯器會將指令轉譯為 CLR 中斷指令。

__asm int 3 現在會產生函式的機器碼。 如果您想要讓函式在程式碼中造成中斷點,而且如果您想要將該函式編譯為 MSIL,請使用 __debugbreak

為了與舊版相容, _asm 除非指定編譯器選項 /Za(停用語言延伸模組), 否則 是 的 __asm 同義字。

範例

下列程式碼片段是放在大括號中的簡單 __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 特定的

另請參閱

關鍵字
內嵌組合語言