作者:maxzhou88(周哥)
開發(fā)高性能的程序少不了用匯編編程,限于C語言中內(nèi)嵌匯編語言的局限(如在C代碼中混合匯編語言編程時,很難實現(xiàn)跳表),一些代碼必須書寫在獨立的匯編源文件中。遺憾的是,在調(diào)試時,只能看到裸的匯編碼,而不能到懂標號,變量等,現(xiàn)在能這樣C與ASM混合編程就方便多了。
編程環(huán)境:VC6.0,Masm32v8
優(yōu)點:
[1] 使用VC6.0集成開發(fā)環(huán)境可以利用其強大的Debug功能來實現(xiàn)源代碼級調(diào)試(Source Code Debug),(看變量、設置斷點、查看MASM32的高級命令展開......)
[2] 使用VC6.0的資源編輯器,可視化編輯資源。
[3] 實現(xiàn)C/C++與ASM的混合編程。
[4] 在窗口下比在CMD下工作符合一般人的習慣,再也不需要寫makefile文件或xxx.bat文件了。
方法:
[1] 安裝VC6.0,這個我就說了,大家都會的哦,一般我將它安裝在 C:\Program Files\ Microsoft Visual Studio。
[2] 安裝MASMv8.exe,一般我將它安裝在 D:\MASM32 下。
[3] 將Win32ASM(masm32)中的ml.exe和ml.err拷貝到C:\Program Files\ Microsoft Visual Studio\VC98\Bin
[4] 使用VC6.0新建一個空工程,如:hello(類型為:win32 console、win32 application、DLL等均可)。
[5] 把匯編和資源文件拷至新建工程目錄下(hello.asm,hello.rc),并把這些文件加入工程中(將*.asm添加到Source Files, 將*.rc添加到Resource Files)。
[6] 配置IDE(這就配置一次就搞定):在VC的菜單tools/option…/paths(include files)中添加一個路徑d:\MASM32\INCLUDE
[7] 配置工程(每個工程都要這樣配置):打開工程設置(project settings),點擊*.asm文件選擇(Custom Build),
命令中加上: ml /c /coff /Zi /Fo$(TargetDir)\$(InputName).obj $(InputPath)
輸出中加上: $(TargetDir)\$(InputName).obj
注意選Settings for: Win32 Debug 和 Win32 release,將上面的兩條都加上,而且每個*.ASM文件(如有多個ASM時)都這樣設置。
[8] 點擊VC的編譯(build)就可以運行了哦。
至此就可以使用VC調(diào)試器源碼級調(diào)試匯編程序了,可以設置斷點,察看變量、內(nèi)存、寄存器等,masm出現(xiàn)語法錯誤時可以雙擊output window中的錯誤行定位到程序中的指定行。
為了不在debug和release目錄中產(chǎn)生超大的預編譯頭文件xxxx.pch,在工程設置(projectsettings)中的C/C++ -> PrecompiledHeaders的選項上選擇"不使用預編譯頭",其實就現(xiàn)在的電腦而言,不使用預編譯頭也能快速地編譯C代碼的哦.
資源編譯/編輯器蠻好用的.只是還有個問題我也沒有搞懂:VC6.0的資源編譯/編輯器不支持16進制的資源ID,非要用10進制的,我是用兩種方法解決的:一是將資源文件*.rc中的ID改成10進制,這樣就可以編輯修改了;二是直接用老羅書中的rc文件導入,但在VC6.0中不要打開編輯它就可以了.有人能告訴我VC6.0的資源編輯器用16進制ID的方法嘛,可能這很簡單,我沒有去深究罷了.
有空來踩踩我的空間哦:http://hi.baidu.com/maxzhou88
該文在我的百度空間:http://hi.baidu.com/maxzhou88/blog/item/7c7b4b09181ce186d1581b8f.html
Win32 C++/ASM 混合編程的Demo下載: http://maxzhou88.ys168.com/pc
我在學老羅的MASM32程序時都是象這樣在VC6.0的集成環(huán)境下工作的,他書中的例子我基本都試驗過,比在DOS(CMD窗口)下方便多了,也不要什么makefile文件,建個proj項目就搞定,最重要的是用VC的資源編輯器來編輯資源比原先手工編輯方便多了,如果有什么問題歡迎大家交流哦!
周哥(maxzhou88) 寫于 2009-01-21
為了方便大家配置VC6.0 ,我在這里貼兩張圖:
這是配置項目中每個ASM文件的Custom Build 注意:Debug 和 Release 版本都要設置)
這是配置VC6.0的IDE,就設置一遍就搞定了。
不過這兩張圖是我百度空間的,但百度是不提供圖片外鏈服務的哦!別急,先分別右擊這兩張圖的圖框,在彈出菜單的“屬性”中COPY圖片的URL地址,然后將地址在IE中打開,這時圖片就下載你機器的IE緩沖區(qū)中,再將這個看不到圖的頁面按F5刷新一下,哈哈!IE就直接從緩沖區(qū)中取圖了,你也就看得見了。沒有辦法啊,對不能外鏈的圖就只能這樣麻煩得做了哦。
另外,我在調(diào)試MASM32程序時還經(jīng)常開CMD窗來實時查看變量,這也是種很好的Debug方法,其實在Win32下無所謂windows窗口程序和console 控制臺程序,也就是說在建立工程時可以選console控制臺程序類型來寫windows窗口程序,反之亦然。我一般是這樣做的,先將工程以windows窗口程序類型來建立新工程,當要用CMD窗口來調(diào)試輸出變量時,我就將工程的link選項卡中的Project options中的subsystem:windows 換成subsystem:console就可以了,這時候編譯連接后程序運行就會出CMD窗口,當調(diào)試完后再改回subsystem:windows即可。
CMD控制臺輸出的代碼片段如下:
.data?
szBuffer db 'hello the world' ,0dh, 0ah ;要調(diào)試的輸出內(nèi)容
hStdOut dd ? ;控制臺標準輸出句柄,在CMD中是默認打開的
dwBytesWrite dd ?
;用下列語句就可以實現(xiàn)CMD的輸出
invoke WriteConsole, hStdOut, addr szBuffer, sizeof szBuffer, addr dwBytesWrite, NULL