MASM 链接问题

安装

可以下载并安装MASM32。这是个提供汇编IDE环境的安装软件。安装后,masm、link等命令程序都包含在安装目录下的bin目录下。微软把masm和Link结合在一起生成一个命令程序ml.exe,在编译汇编程序时,就是用ml命令在编译,具体的编译选项查看ml -help。

源代码

用vim写入一个简单的程序test.asm,代码如下:

 page 60,132
TITLE A04ASM1(EXE) Move and add operations
;--------------------------------------------------
STACK SEGMENT PARA STACK 'stack'
 DW 32 DUP(0)
STACK ENDS
;--------------------------------------------------
DATASEG SEGMENT PARA 'Data'
WELCOME DB 13,10,'Hello,World!!',13,10,'$' 
DATASEG ENDS
;--------------------------------------------------
CODESEG SEGMENT PARA 'Code'
MAIN PROC FAR
 ASSUME SS:STACK,DS:DATASEG,CS:CODESEG
 MOV AX,DATASEG ;把数据段地址
 MOV DS,AX  ;设置在DS中
 LEA DX,WELCOME
 MOV AH,9
 INT 21H
;----------------------------------------------------
 MOV AX,4C00H ;结束处理
 INT 21H
MAIN ENDP   ;过程结束
CODESEG ENDS   ;段结束
 END MAIN  ;程序结束

问题: 在命令行下ml test.asm,错误显示如下:

Assembling: test.asm
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/z2
"test.obj"
"test.exe"
NUL
LINK : warning LNK4044: unrecognized option "z2"; ignored
LINK : error : Segment reference in fixup record
test.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会出错的。

注意:
在安装MASM32后,bin目录下包含的LINK是Microsoft (R) Incremental Linker Version 5.12.8078,是专门生成32位的PE文件,所以上面写的代码用MASM32的ML.EXE编译和连接会出现错误。
从这里下载的MASM6.RAR
文件: masm6.rar
大小: 845KB
下载: 下载
可以编译和运行上面的代码,因为里面包含的LINKer是Microsoft (R) Segmented Executable Linker

你可能感兴趣的:(链接,link,masm)