VS2012下X64平臺嵌入彙編程序

VS2012在win32平臺編譯的時候能夠很好的支持彙編語言的嵌入。創建一個控制檯應用程序,選擇空項目。項目創建好以後添加一個.cpp文件。在cpp文件中寫入以下代碼:php

 

 

[cpp] view plain copy print?html

  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編譯模式下,就會發現有以下的錯誤提示:mysql

error C4235: 使用了非標準擴展: 不支持在此結構上使用「__asm」關鍵字ios

也就是說在x64編譯模式下不支持__asm的彙編嵌入。從網上的資料上查到雖然不能直接嵌入彙編程序段,可是能夠將程序段所有放到一個asm文件下進行編譯,最後asm文件編譯生成的obj文件和.cpp文件編譯生成的obj文件連接到一塊兒就能夠生成exe文件了。sql

新建一個asm文件,這裏創建了文件名爲test.asm的文件。數據庫

寫入以下測試代碼:編程

 

 

[cpp] view plain copy print?函數

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

 

 

[cpp] view plain copy print?

  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文件。

 

 

 

進入屬性—>配置屬性—>常規,設置從生成中排除爲否,選擇項類型爲自定義生成工具依次點擊應用,肯定

 

 

這時候就會發現多了一項自定義生成工具。

 

在自定義生成工具下選擇常規設置紅框中的三項:

Command Line(命令行):  ml64 /c %(fileName).asm

Outputs(輸出):  %(fileName).obj;%(Outputs)

//注意:這時入口不能設置爲main,而是空缺,vc會自動找到c中的main從vcrt進入到main中。
//若是是純彙編,能夠將入口設置爲main,用匯編來寫main

 

設置完成後應用,肯定,而後從新編譯程序,發現這個時候就能夠編譯成功了。

 

 

點擊調試。可能會出現錯誤:

沒法找到「XXX.exe」的調試信息,或者調試信息不匹配。未使用調試信息生成二進制文件

這是由於在連接生成的過程當中都沒有生成pdb調試文件,這時要修改項目屬性,完成如下三項就能夠了。

首先打開菜單 項目->項目屬性頁 
一、選擇 配置屬性->連接器->調試->生成調試信息 改成 是 
二、選擇 配置屬性->C/C++ ->常規->調試信息格式 改成 用於「編輯並繼續」的程序數據庫(/ZI) 
三、選擇 配置屬性->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

相關文章
相關標籤/搜索