VS2012下X64平臺嵌入彙編程式
轉載自:https://blog.csdn.net/woshiyuanlei/article/details/54646874
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");
-
}
可以發現上述程式碼可以正常使用,然後將工程專案切換至x64編譯模式下,就會發現有如下的錯誤提示:
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平臺關於內聯彙編不再支援的解決
--------------------- 本文來自 woshiyuanlei 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/woshiyuanlei/article/details/54646874?utm_source=copy