1. 程式人生 > >VS2012下X64平臺嵌入彙編程式

VS2012下X64平臺嵌入彙編程式

轉載自:https://blog.csdn.net/woshiyuanlei/article/details/54646874

VS2012在win32平臺編譯的時候可以很好的支援組合語言的嵌入。建立一個控制檯應用程式,選擇空專案。專案建立好之後新增一個.cpp檔案。在cpp檔案中寫入如下程式碼:

 

 

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int  Add(int num1, int num2)  
  5. {  
  6.     __asm  
  7.     {  
  8.         mov eax,num1  
  9.         mov ecx,num2  
  10.         add eax,ecx  
  11.     }  
  12. }  
  13.   
  14.   
  15. void main()  
  16. {  
  17.     int a = Add(2,3);  
  18.     cout<< a <<endl;  
  19.     system("pause");  
  20. }  
 
  1. #include <iostream>

  2. using namespace std;

  3.  
  4. int Add(int num1, int num2)

  5. {

  6. __asm

  7. {

  8. mov eax,num1

  9. mov ecx,num2

  10. add eax,ecx

  11. }

  12. }

  13.  
  14.  
  15. void main()

  16. {

  17. int a = Add(2,3);

  18. cout<< a <<endl;

  19. system("pause");

  20. }

 

 

可以發現上述程式碼可以正常使用,然後將工程專案切換至x64編譯模式下,就會發現有如下的錯誤提示:

error C4235: 使用了非標準擴充套件: 不支援在此結構上使用“__asm”關鍵字

也就是說在x64編譯模式下不支援__asm的彙編嵌入。從網上的資料上查到雖然不能直接嵌入彙編程式段,但是可以將程式段全部放到一個asm檔案下進行編譯,最後asm檔案編譯生成的obj檔案和.cpp檔案編譯生成的obj檔案連結到一起就可以生成exe檔案了。

新建一個asm檔案,這裡建立了檔名為test.asm的檔案。

寫入如下測試程式碼:

 

 

  1. .CODE  
  2.   
  3. Int_3 PROC  
  4.         MOV EAX, 1234  ;返回1234  
  5.         RET  
  6. Int_3 ENDP  
  7.   
  8.   
  9. MY_TEST PROC  
  10.         MOV EAX, 23 ;返回23  
  11.         RET  
  12. MY_TEST ENDP  
  13.   
  14. END  
 
  1. .CODE

  2.  
  3. Int_3 PROC

  4. MOV EAX, 1234 ;返回1234

  5. RET

  6. Int_3 ENDP

  7.  
  8.  
  9. MY_TEST PROC

  10. MOV EAX, 23 ;返回23

  11. RET

  12. MY_TEST ENDP

  13.  
  14. END


 

 

上述程式碼段中一個兩個彙編函式Int_3和MY_TEST。

然後新建一個.h檔案來對彙編程式中的程式碼作宣告。這裡建立一個名為test.h的標頭檔案。寫入如下宣告資訊:

 

 

  1. #ifndef __ASMCODE_H  
  2. #define __ASMCODE_H  
  3.   
  4.   
  5. extern "C"  
  6. {  
  7.     int _stdcall Int_3();  
  8.     int _stdcall MY_TEST();  
  9. }  
  10.       
  11.   
  12. #endif  
 
  1. #ifndef __ASMCODE_H

  2. #define __ASMCODE_H

  3.  
  4.  
  5. extern "C"

  6. {

  7. int _stdcall Int_3();

  8. int _stdcall MY_TEST();

  9. }

  10.  
  11.  
  12. #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