visual+c%2b%2b中使用內聯匯編

visual+c%2b%2b中使用內聯匯編

ID:20211320

大?。?3.00 KB

頁數:12頁

時間:2018-10-11

visual+c%2b%2b中使用內聯匯編_第1頁
visual+c%2b%2b中使用內聯匯編_第2頁
visual+c%2b%2b中使用內聯匯編_第3頁
visual+c%2b%2b中使用內聯匯編_第4頁
visual+c%2b%2b中使用內聯匯編_第5頁
資源描述:

《visual+c%2b%2b中使用內聯匯編》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。

1、一、內聯匯編的優(yōu)缺點  因為在VisualC++中使用內聯匯編不需要額外的編譯器和聯接器,且可以處理VisualC++中不能處理的一些事情,而且可以使用在C/C++中的變量,所以非常方便。內聯匯編主要用于如下場合:  1.使用匯編語言寫函數;  2.對速度要求非常高的代碼;  3.設備驅動程序中直接訪問硬件;  4."Naked"Call的初始化和結束代碼?! ?/(."Naked",理解了意思,但是不知道怎么翻譯^_^,大概就是不需要C/C++的編譯器(自作聰明)生成的函數初始化和收尾代碼,請參看MSDN的"NakedF

2、unctions"的說明)  內聯匯編代碼不易于移植,如果你的程序打算在不同類型的機器(比如x86和Alpha)上運行,應當盡量避免使用內聯匯編。這時候你可以使用MASM,因為MASM支持更方便的的宏指令和數據指示符?! 《?、內聯匯編關鍵字  在VisualC++使用內聯匯編用到的是__asm關鍵字,這個關鍵字有兩種使用方法:  1.簡單__asm塊__asm{MOVAL,2MOVDX,0XD007OUTAL,DX}  2.在每條匯編指令之前加__asm關鍵字__asmMOVAL,2__asmMOVDX,0xD007__a

3、smOUTAL,DX  因為__asm關鍵字是語句分隔符,因此你可以把匯編指令放在同一行:  __asmMOVAL,2__asmMOVDX,0XD007__asmOUTAL,DX  顯然,第一種方法和C/C++的風格很一致,并且有很多其它優(yōu)點,因此推薦使用第一種方法?! 〔幌笤贑/C++中的"{}",__asm塊的"{}"不會影響C/C++變量的作用范圍。同時,__asm塊可以嵌套,嵌套也不會影響變量的作用范圍。  三、在__asm塊中使用匯編語言  1.內聯匯編指令集  內聯匯編完全支持的Intel486指令集,允許使用

4、MMX指令。不支持的指令可以使用_EMIT偽指令定義(_EMIT偽指令說明見下文)?! ?.MASM表達式  內聯匯編可以使用MASM中的表達式。比如:MOVEAX,1?! ?.數據指示符和操作符  雖然__asm塊中允許使用C/C++的數據類型和對象,但它不能用MASM指示符和操作符定義數據對象。這里特別指出,__asm塊中不允許MASM中的定義指示符:DB、DW、DD、DQ、DT和DF,也不允許DUP和THIS操作符。MASM結構和記錄也不再有效,內聯匯編不接受STRUC、RECORD、WIDTH或者MASK?! ?.

5、EVEN和ALIGN指示符  盡管內聯匯編不支持大多數MASM指示符,但它支持EVEN和ALIGN,當需要的時候,這些指示符在匯編代碼里面加入NOP(空操作)指令使標號對齊到特定邊界。這樣可以使某些處理器取指令時具有更高的效率?! ?.MASM宏指示符  內聯匯編不是宏匯編,不能使用MASM宏指示符(MACRO、REPT、IRC、IRP和ENDM)和宏操作符(<>、!、&、%和.TYPE)。  6.段說明  必須使用寄存器來說明段,跨越段必須顯式地說明,如ES:[BX]。  7.類型和變量大小  我們可以使用LENGTH來

6、取得C/C++中的數組中的元素個數,如果不是一個數組,則結果為一。使用SIZE來取得C/C++中變量的大小,一個變量的大小是LENGTH和TYPE的乘積。TYPE用來取得一個變量的大小,如果是一個數組,它得到的一個數組中的單個元素的大小?! ?.注釋  可以使用C/C++的注釋,但推薦用ASM的注釋,即";"號?! ?._EMIT偽指令  _EMIT偽指令相當于MASM中的DB,但一次只能定義一個字節(jié),比如:__asm{JMP_CodeOfAsm_EMIT0x00;定義混合在代碼段的數據_EMIT0x01_CodeOfAs

7、m:;這里是代碼_EMIT0x90;NOP指令} 四、在__asm塊中使用C/C++語言元素  C/C++與匯編可以混合使用,在內聯匯編可以使用C/C++的變量和很多其它C/C++的元素。在__asm塊中可以使用以下C/C++元素:  1.符號,包括標號、變量和函數名;  2.常量,包括符號常量和枚舉型(enum)成員;  3.宏定義和預處理指示符;  4.注釋,包括"/**/"和"http://";  5.類型名,包括所有MASM中合法的類型  6.typedef名稱,像PTR、TYPE、特定的結構成員或枚舉成員這樣的通用操作符。

8、  在__asm塊中,可以使用C/C++或ASM的基數計數法(比如:0x100和100H是相等的)。  __asm塊中不能使用像<<一類的C/C++操作符。C/C++和MASM通用的操作符,比如"*"和"[]"操作符,都被認為是匯編語言的操作符。舉個例子:intarray[10];__asmMOVarr

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯系客服。
3. 下載前請仔細閱讀文檔內容,確認文檔內容符合您的需求后進行下載,若出現內容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯系客服處理。