本人拙笨,如有错误请批评指正,如有更好的方法或者技巧,欢迎互相交 zhougeng@tom.com
使用一个好的调试器无疑对学习win32汇编是至关重要的,本人更偏爱VC的强大调试环境, 不要makefile文件。
编程环境:VC6.0,Masm32v8
方法如下:
1、 使用VC6新建一个空工程如test(win32 console,win32 application等均可)。
2、 把汇编工程中的文件拷至新建工程目录下(hello.asm,hello.rc),并把这些文件加入工程中(将*.asm添加到Source Files, 将*.rc添加到Resource Files)。
3、 配置IDE:
(1)、tools/option…/paths(include files)中添加一个路径d:\MASM32\INCLUDE 这是假设你的Masm32v8安装在d:\MASM32
(2)、打开工程设置(project settings),点击*.asm文件选择(Custom Build),
命令中加上: ml /c /coff /Zi /Fo$(TargetDir)\$(InputName).obj $(InputPath)
输出中加上: $(TargetDir)\$(InputName).obj
注意选Settings for: Win32 Debug 和 Win32 release,将上面的两条都加上。
(3)、将Win32ASM中的ml.exe和ml.err拷贝到C:\Program Files\ Microsoft Visual Studio\VC98\Bin
5、点击VC的编译就可以运行了哦。
至此就可以使用VC调试器源码级调试汇编程序了,可以设置断点,察看变量、内存、寄存器等,masm出现语法错误时可以双击output window中的错误行定位到程序中的指定行。
为了不在debug和release目录中产生超大的预编译头文件xxxx.pch,在工程设置(project settings)中的C/C++ -> Precompiled Headers的选项上选择"不使用预编译头",其实就现在的电脑而言,不使用预编译头也能快速地编译C代码的哦.
WIN32 C/ASM 混合编程Demo下载: maxzhou88.ys168.com/PC/
WIN32 ASM 编程 Demo.rar 117KB
WIN32 C 与 ASM 混合编程 Demo.rar 21KB
其实我只是告诉大家一个设置VC6.0用于C与MASM32的混合编程的环境设置,具体的debug操作方法,大家要是用过VC6.0来调试C/C++,就一定会调试ASM32,方法是统一的,在我的网盘http://maxzhou88.ys168.com/中有两个例子我都调试过,很好用的哦!该例子都是老罗的《Windows环境下32位汇编语言程序设计》中的例子改写的,感觉比用makefile好多了,资源编译/编辑器也蛮好用.只是还有个问题我也没有搞懂:VC6.0的资源编译/编辑器不支持16进制的资源ID,非要用10进制的,我是用两种方法解决的:一是将资源文件*.rc中的ID改成10进制;二是直接用老罗书中的rc文件,但在VC6.0中不要打开编辑它就可以了.有人能告诉我VC6.0的资源编辑器用16进制ID的方法嘛,可能这很简单,我没有去深究罢了.
我说的这种调试方法是VC6.0本身的源代码级调试(source code debug),是可以像调试C源码那样,边改边调,跟踪时你就会看到,debug window一会儿在C源代码中, 一会儿在ASM源代码中,很方便的哦!
==================================================================================================
2009-01-20 编辑:
这篇文章我最先发表在华储论坛http://www.huachu.com.cn/bbs的罗云彬汇编网站上,但老罗这么有名的人--《Windows 环境下32位汇编语言程序设计》的作者,华储购书网站居然给人家挂了,真就点过河拆桥的味道。后来有网友liangbch将该文转载到数学研发论坛http://bbs.emath.ac.cn/redirect.php?tid=390&goto=lastpost上,在这里我得感谢这位网友了。
为了方便大家配置VC6.0 ,我在这里贴两张图:
这是配置项目中每个ASM文件的Custom Build 注意:(Debug 和 Release 版本都要设置)
![](http://hiphotos.baidu.com/fish_running/pic/item/51baa01766f08d73f3de32ab.jpg)
这是配置VC6.0的IDE,就设置一遍就搞定了。
另外,我在调试MASM32程序时还经常开CMD窗来实时查看变量,这也是种很好的Debug方法,其实在Win32下无所谓 windows窗口程序和console 控制台程序,也就是说在建立工程时可以选console 控制台程序类型来写windows窗口程序,反之亦然。我一般是这样做的,先将工程以windows窗口程序类型来建立新工程,当要用CMD窗口来调试输出变量时,我就将工程的link选项卡中的Project options中的subsystem:windows 换成 subsystem:console就可以了,这时候编译连接后程序运行就会出CMD窗口,当调试完后再改回subsystem:windows即可。
![](http://hiphotos.baidu.com/fish_running/pic/item/14758e1d980c83a987d6b6b6.jpg)
CMD控制台输出的代码片段如下:
.data?
szBuffer db 'hello the world' ,0dh, 0ah ;要调试的输出内容
hStdOut dd ? ;控制台标准输出句柄,在CMD中是默认打开的
dwBytesWrite dd ?
;用下列语句就可以实现CMD的输出
invoke WriteConsole, hStdOut, addr szBuffer, sizeof szBuffer, addr dwBytesWrite, NULL