VS2012在win32平臺編譯的時候能夠很好的支持彙編語言的嵌入。創建一個控制檯應用程序,選擇空項目。項目創建好以後添加一個.cpp文件。在cpp文件中寫入以下代碼:php
[cpp] view plain copy print?html
#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?函數
.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?
#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