[32位移植到64]_[C/C++程式碼嵌入彙編程式碼移植篇]
阿新 • • 發佈:2019-02-03
情景
在C/C++一些程式碼中為了高效及方便,是允許嵌入彙編。這在VS的32位編譯中,直接嵌入都是沒問題的,不需要另外處理,但在64位中編譯就會報錯了。64位就不支援混編了,錯誤如下:
1>.\test2.cpp(16) : error C4235: 使用了非標準擴充套件: 不支援在此結構上使用“__asm”關鍵字
1>.\test2.cpp(19) : error C2065: “rdtsc”: 未宣告的識別符號
我的程式碼例子是
int _tmain(int argc, _TCHAR* argv[]) { __asm { rdtsc mov lowtick, eax mov hightick, edx } return 0; }
開發環境
我用的開發環境是
開發工具:VS 2005
作業系統:win 8 pro
CPU:AMD
解決步驟
VS支援C/C++跟彙編混編,不需要其他設定,64位不支援混合編怎麼辦呢,還好vs支援自定義生成規則,可以通過自定義生產規則檔案設定達到64彙編編譯;
因為VS有預設對32位彙編編譯支援,所以我們只要參照著32位的自定義規則設定就行;
在說解決步驟之前我們先看看32的彙編生成規則檔案設定。
32位自定義生成規則檔案
- 開啟自定義生成規則檔案視窗,專案->自定義生成規則,如圖:
- 可以看到字尾為.asm檔案的編譯規則設定,使用的是ml.exe;
- 點選修改可以看到使用的是哪個規則檔案:
64位自定義生成規則檔案步驟
- 我們通過上面可以知道,32位的規則檔案在哪,以及放在哪,我這裡的目錄為:C:\Program Files (x86)\Microsoft Visual Studio 8\VC\VCProjectDefaults;
- 把masm.rules複製一份,並命名為masm64.rules;
- 我們再開啟自定義生成規則設定視窗或者點選《自定義生成規則檔案》視窗中的重新整理列表,可以看到多了一條記錄,點選選擇多出那條也就是第三條,點選修改按鈕進入修改視窗,可以看到規則檔名是masm64.rules;
- 選中自定義規則,這裡只有一條,再點選修改生成規則,進入視窗後修改,把ml.exe改成ml64.exe,如圖:
- 點選確定,如果提示不能修改只讀檔案,儲存失敗,得修改masm64.rules檔案的許可權;
- 到這裡基本完成設定了,不過記得把第三項的規則檔案選上,要不然在64環境下,編譯.asm檔案是不行的,找不到規則去編譯。
最後
把彙編程式碼移出來單獨形成單元檔案,生成單獨的.obj,連結的時候要記得加上這個.obj,要不然連結失敗。我彙編不怎麼樣,就不獻醜,就不單獨寫出例子來了。