在Visual C 中使用內聯彙編

2021-04-12 23:17:39 字數 2049 閱讀 9026

一、內聯彙編的優缺點  

因為在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...