VS2012在win32平台編譯的時候可以很好的支持匯編語言的嵌入。建立一個控制台應用程序,選擇空項目。項目建立好之后添加一個.cpp文件。在cpp文件中寫入如下代碼:
- #include <iostream>
- using namespace std;
- int Add(int num1, int num2)
- {
- __asm
- {
- mov eax,num1
- mov ecx,num2
- add eax,ecx
- }
- }
- void main()
- {
- int a = Add(2,3);
- cout<< a <<endl;
- system("pause");
- }
#include <iostream> using namespace std; int Add(int num1, int num2) { __asm { mov eax,num1 mov ecx,num2 add eax,ecx } } void main() { int a = Add(2,3); cout<< a <<endl; system("pause"); }
error C4235: 使用了非標准擴展: 不支持在此結構上使用“__asm”關鍵字
也就是說在x64編譯模式下不支持__asm的匯編嵌入。從網上的資料上查到雖然不能直接嵌入匯編程序段,但是可以將程序段全部放到一個asm文件下進行編譯,最后asm文件編譯生成的obj文件和.cpp文件編譯生成的obj文件鏈接到一起就可以生成exe文件了。
新建一個asm文件,這里建立了文件名為test.asm的文件。
寫入如下測試代碼:
- .CODE
- Int_3 PROC
- MOV EAX, 1234 ;返回1234
- RET
- Int_3 ENDP
- MY_TEST PROC
- MOV EAX, 23 ;返回23
- RET
- MY_TEST ENDP
- END
.CODE Int_3 PROC MOV EAX, 1234 ;返回1234 RET Int_3 ENDP MY_TEST PROC MOV EAX, 23 ;返回23 RET MY_TEST ENDP END
上述代碼段中一個兩個匯編函數Int_3和MY_TEST。
然后新建一個.h文件來對匯編程序中的代碼作聲明。這里建立一個名為test.h的頭文件。寫入如下聲明信息:
- #ifndef __ASMCODE_H
- #define __ASMCODE_H
- extern "C"
- {
- int _stdcall Int_3();
- int _stdcall MY_TEST();
- }
- #endif
#ifndef __ASMCODE_H #define __ASMCODE_H extern "C" { int _stdcall Int_3(); int _stdcall MY_TEST(); } #endif
在main.cpp中包含上述頭文件,調用匯編中的函數,在x64模式下編譯,這時會發現還是有錯誤。下面步驟是關鍵!!
鼠標右鍵test.asm文件。
進入屬性—>配置屬性—>常規,設置從生成中排除為否,選擇項類型為自定義生成工具,依次點擊應用,確定。
這時候就會發現多了一項自定義生成工具。
在自定義生成工具下選擇常規設置紅框中的三項:
設置完成后應用,確定,然后重新編譯程序,發現這個時候就可以編譯成功了。
點擊調試。可能會出現錯誤:
無法找到“XXX.exe”的調試信息,或者調試信息不匹配。未使用調試信息生成二進制文件
這是因為在鏈接生成的過程中都沒有生成pdb調試文件,這時要修改項目屬性,完成以下三項就可以了。
首先打開菜單 項目->項目屬性頁
1、選擇 配置屬性->鏈接器->調試->生成調試信息 改為 是
2、選擇 配置屬性->C/C++ ->常規->調試信息格式 改為 用於“編輯並繼續”的程序數據庫(/ZI)
3、選擇 配置屬性->C/C++ ->優化->優化 改為 禁用(/Od)
這是就可以正常的在VS2012 x64模式下使用匯編程序了,根據網上資料,X64下匯編指令和32位匯編指令會有些許不同,深入使用的時候還需要去查詢X64下匯編手冊。
參考資料:
http://bbs.pediy.com/showthread.PHP?p=1318183 在VS2012 x64下編譯驅動使用asm關鍵字的完整方案
http://www.cnblogs.com/cryinstall/archive/2011/04/24/2280843.html VS2008中編譯通過,但調試時出現“未使用調試信息生成二進制文件”的問題
http://blog.sina.com.cn/s/blog_6b849dd00100xcgj.html x86平台轉x64平台關於內聯匯編不再支持的解決
注意匯編文件名不能與cpp文件名重復
jpg改rar