ASM

VC內嵌彙編

ASM是C++中的一個關鍵字,用於在C++源碼中內嵌彙編語言。ASM能寫在任何C++合法語句中,目前asm還不是C的標準關鍵字,C11標準未加入正文,僅在Annex J中標記為“公共擴展”。

關鍵字


雖然asm並不是C的標準關鍵字(C11標準未加入正文,僅在Annex J中標記為“公共擴展”),但是大多數C實現都將其視為一個關鍵字。
asm是C++標準關鍵字,但是標準沒有規定其詳細用法。相應的用法為實現定義。

詳述


下面介紹Visual C++中的asm關鍵字用法。
Visual Studio 2015起始頁
Visual Studio 2015起始頁
__asm關鍵字啟動內聯彙編並且能寫在任何C++合法語句之處。它不能單獨出現,必須接彙編指令、一組被大括弧包含的指令或一對空括弧。術語“__asm 塊”在這裡是任意一個指令或一組指令無論是否在括弧內。
以下代碼片段是在括弧內的一個簡單的__asm塊。
_asm { mov al, 2 mov dx, 0xD007 out al,dx }
另一種方法是,你可以在每個彙編指令前放置__asm
__asm mov al,2
__asm mov dx,0xD007
__asm out al,dx
因為__asm關鍵字是一個語句分隔符,你也可以將彙編指令放在同一行:
__asm mov al,2__asm mov dx, 0xD007__asm out al,dx
以上三個的例子產生相同的代碼,但是第一種風格(把__asm塊用括弧括起來)有一些優勢。括弧可以清晰的將C或C++代碼和彙編代碼分開,並且避免了不必要的重複__asm關鍵字。括弧也能避免模糊性。如果你想在__asm塊的同一行放置一個C或C++語句,你必須將塊用括弧括起來。沒有括弧,編譯器不能區分彙編代碼在哪裡停止以及C或C++代碼在哪裡開始。最後,因為在括弧的文字有和原始MASM一樣的格式,你能輕鬆的從一個已有的MASM源文件里剪切和黏貼文字到文件來。
不同於C和C++的括弧,在Visual Studio中,包含__asm塊的括弧對變數的作用域並沒有效果。你也能嵌套__asm塊,嵌套對變數作用域也沒有效果。