一、內聯彙編的優缺點
因為在visual c++中使用內聯彙編不需要額外的編譯器和聯接器,且可以處理visual c++中不能處理的一些事情,而且可以使用在c/c++中的變數,所以非常方便。內聯彙編主要用於如下場合:
1.使用組合語言寫函式;
2.對速度要求非常高的**;
3.裝置驅動程式中直接訪問硬體;
4."naked" call的初始化和結束**。
//(."naked",理解了意思,但是不知道怎麼翻譯^_^,大概就是不需要c/c++的編譯器(自作聰明)生成的函式初始化和收尾**,請參看msdn的"naked functions"的說明)
內聯彙編**不易於移植,如果你的程式打算在不同型別的機器(比如x86和alpha)上執行,應當盡量避免使用內聯彙編。這時候你可以使用ma**,因為ma**支援更方便的的巨集指令和資料指示符。
二、內聯彙編關鍵字
在visual c++使用內聯彙編用到的是__a**關鍵字,這個關鍵字有兩種使用方法:
1.簡單__a**塊
__a**
2.在每條彙編指令之前加__a**關鍵字
__a** mov al, 2
__a** mov dx, 0xd007
__a** out al, dx
因為__a**關鍵字是語句分隔符,因此你可以把彙編指令放在同一行:
__a** mov al, 2 __a** mov dx, 0xd007 __a** out al, dx
顯然,第一種方法和c/c++的風格很一致,並且有很多其它優點,因此推薦使用第一種方法。
不象在c/c++中的"{}",__a**塊的"{}"不會影響c/c++變數的作用範圍。同時,__a**塊可以巢狀,巢狀也不會影響變數的作用範圍。
三、在__a**塊中使用組合語言
1.內聯彙編指令集
內聯彙編完全支援的intel 486指令集,允許使用mmx指令。不支援的指令可以使用_emit偽指令定義(_emit偽指令說明見下文)。
2.ma**表示式
內聯彙編可以使用ma**中的表示式。比如: mov eax, 1。
3.資料指示符和操作符
雖然__a**塊中允許使用c/c++的資料型別和物件,但它不能用ma**指示符和操作符定義資料物件。這裡特別指出,__a**塊中不允許ma**中的定義指示符: db、dw、dd、dq、dt和df,也不允許dup和this操作符。ma**結構和記錄也不再有效,內聯彙編不接受struc、record、width或者mask。
4.even和align指示符
儘管內聯彙編不支援大多數ma**指示符,但它支援even和align,當需要的時候,這些指示符在彙編**裡面加入nop(空操作)指令使標號對齊到特定邊界。這樣可以使某些處理器取指令時具有更高的效率。
5.ma**巨集指示符
內聯彙編不是巨集彙編,不能使用ma**巨集指示符(macro、rept、irc、irp和endm)和巨集操作符(<>、!、&、%和.type)。
6.段說明
必須使用暫存器來說明段,跨越段必須顯式地說明,如es:[bx]。
7.型別和變數大小
我們可以使用length來取得c/c++中的陣列中的元素個數,如果不是乙個陣列,則結果為一。使用size來取得c/c++中變數的大小,乙個變數的大小是length和type的乘積。type用來取得乙個變數的大小,如果是乙個陣列,它得到的乙個陣列中的單個元素的大小。
8.注釋
可以使用c/c++的注釋,但推薦用a**的注釋,即";"號。
9._emit偽指令
_emit偽指令相當於ma**中的db,但一次只能定義乙個位元組,比如:
__a**
在VC中使用內聯彙編
一 內聯彙編的優缺點 因為在visual c 中使用內聯彙編不需要額外的編譯器和聯接器,且可以處理visual c 中不能處理的一些事情,而且可以使用在c c 中的變數,所以非常方便。內聯彙編主要用於如下場合 1.使用組合語言寫函式 2.對速度要求非常高的 3.裝置驅動程式中直接訪問硬體 4.nak...
在C中使用內聯彙編
在visual c 使用內聯彙編用到的是 a 關鍵字,這個關鍵字有兩種使用方法 1.簡單 a 塊 a 2.在每條彙編指令之前加 a 關鍵字 a mov al,2 a mov dx,0xd007 a out al,dx 因為 a 關鍵字是語句分隔符,因此你可以把彙編指令放在同一行 a mov al,2...
在C中使用內聯彙編
在visual c 使用內聯彙編用到的是 a 關鍵字,這個關鍵字有兩種使用方法 1.簡單 a 塊 a 2.在每條彙編指令之前加 a 關鍵字 a mov al,2 a mov dx,0xd007 a out al,dx 因為 a 關鍵字是語句分隔符,因此你可以把彙編指令放在同一行 a mov al,2...