调试MASM程序技巧及参数详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 [...]

相关文档
最新文档