调试MASM程序技巧及参数详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.首先要设置好include、path、lib的路径,可以写成bat文件,如masm安装在D盘,则内容如下
@echo off
set include=d:\masm32\Include
set lib=d:\masm32\lib
set path=d:\masm32\bin;%path%
echo on
运行bat文件以后,在dos shell窗口用path命令检查一下。
2.ML问题,对于如下代码,
MOV AX, @data
MOV DS, AX
编译的时候用ml /c /coff *****.asm
总是出现error A2006: undefined symbol : DGROUP错误信息。
原因在于这种古老的进入程序的代码段的方法在coff格式中已经不用了,因为“/coff ”参数,这是生成32位Windows程序的模块格式,并不适合编译dos程序。至于用什么方法,还得参考PE格式。
COFF –通用对象文件格式(Common Object File Format),是一种很流行的对象文件格式(注意:这里不说它是“目标”文件,是为了和编译器产生的目标文件(*.o/*.obj)相区别,因为这种格式不只用于目标文件,库文件、可执行文件也经常是这种格式)。大家可能会经常使用VC吧?它所产生的目标文件(*.obj)就是这种格式。其它的编译器,如GCC(GNU Compiler Collection)、ICL(Intel C/C++ Compiler)、VectorC,也使用这种格式的目标文件。不仅仅是C/C++,很多其它语言也使用这种格式的对象文件。统一格式的目标文件为混合语言编程带来了极大的方便。
当然,并不是只有这一种对象文件格式。常用格式的还有OMF-对象模型文件(Object Module File)以及ELF-可执行及连接文件格式(Executable and Linking Format)。OMF是一大群IT巨头在n年制定的一种格式,在Windows平台上很常见。大家喜欢的Borland公司现在使用的目标文件就是这种格式。MS和Intel在n年前用的也是这种格式,现在都改投异侧,用COFF格式了。ELF格式在非Windows平台上使用得比较多,在Windows平台基本上没见过。
3.LINK问题
如果用Link /subsystem:(随便哪种系统) *****.obj链接,出现以下提示:
LINK : error : Segment reference in fixup record
hello.obj : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
问题就出在Linker上,注意两个Linker的不同
Microsoft (R) Segmented Executable Linker
Microsoft (R) Incremental Linker
解释一下, Windows平台下, 源代码编译出来的obj主要有两种格式:OMF和COFF, 其中, OMF格式是原来IBM(好像是吧, 不记得了)使用的格式, 而COFF格式则是从微软从UNIX移植过来的, 因为微软公司开发Windows的软件工程师大多对UNIX很熟, 所以自然而然的采用了类似UNIX COFF的这种Win32 COFF格式(和UNIX的"纯种"COFF 是有区别的, 但仍然叫COFF格式)
DOS程序编译的obj文件都是omf格式的, omf格式的obj要用Segmented Linker链接, 生成的是DOS可执行文件或者NE文件, 而Win32程序编译的obj必须是COFF格式
的, 要用Incremental Linker链接, 生成的是32位的PE或16/32位混合的LE文件(主要是VXD, 现在已经淘汰)
masm编译器ml.exe有两个选项
/coff
和
/omf
其中, /coff控制生成的obj为coff格式, /omf类似
在ml的第6版中, 默认选项为omf, 如果编译win32程序忘了指定/coff会出错,但是在ml的第7和第8版,默认选项为coff,这个时候如果编译Dos程序忘了指定/omf会出错的. 补充一下, 常见汇编编译器产生的obj文件格式和常见链接器需要的obj文件格式表名称格式备注
MASM coff, omf 由选项控制
TASM omf 不论是DOS还是Win32程序都是omf
NASM 多种格式由选项控制
Segmented Linker omf 只能链接DOS程序Incremental linker coff 只能链接Win32程序或者16/32混合的VXD
tlink, tlink32 omf TASM系列无论编译器还是链接器使用的都是omf
只要下载masm6.15,link就是Microsoft (R)Segmented Executable Linker,就可以解决问题。
4.ML和LINK命令参数详解
命令行编写调试DOS及WIN32汇编程序
ml /c /coff /Zi /Cp /Zd 文件名.asm
link /subsystem:console /debug /debugtype:cv /libpath:d:\masm32\lib文件名.obj
上面两句可以写成bat文件,或者做成make文件。
Ml参数
感觉最常用得就是/c 仅自动编译,不链接
/coff 必用的,产生obj的文件为coff格式(写win32程序的时候)
/Cp 基本上必用,源代码区分大小写
/Gz函数调用类型为stdcall形式,常用的
/Zi调试的时候用,一般不用
LINK的参数N多,不过绝大部分默认都可以了,/subsystem选项是必须的
/subsystem:windows 普通pe文件
/subsystem:console 控制台文件
ml /coff /Zi [...]
其中,/COFF选项用于生成softice使用的正确的目标文件格式。/Zi选项告诉编译器需要向目标文件添加符号调试信息。
link /subsystem:windows /debug /debugtype:cv [...]