VS2012下X64平台嵌入匯編程序



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. }  
#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的文件。

寫入如下測試代碼:


 

  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  
.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的頭文件。寫入如下聲明信息:


 

  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  
#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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM