__asm
Microsoft 特定的
__asm
關鍵字會叫用內嵌組合語言,而且可以出現在 C 或 C++ 陳述式有效的任何地方。 它不能單獨出現。 它後面必須接著元件指令、一組以大括弧括住的指令,或至少一組空的大括弧。 這裡的「__asm
區塊」一詞是指任何指令或指令群組,不論是否放在大括號中。
注意
Visual C++ 對 Standard C++ asm
關鍵字的支援受到「編譯器不會發生關鍵字的錯誤」的這個事實所限制。 不過,asm
區塊不會產生任何有意義的程式碼。 使用 __asm
取代 asm
。
文法
asm-block :
__asm
assembly-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 特定的
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應