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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
相关文章《DOS的古董美》 MD DocUmEnT: 3/26/2016 10:26:57 AM by Jimbowhy 当计算机技术越来越先进,越来越快速更新,作为电子FANS,发现这样的现状不仅带给从事这个行业的人更多的便利,还有更多的迷失!而DOS就像是那个本应有活力的游乐园,收集资料的过程中发现,国外确实把DOS当成了计算机世界的大游乐场!国内很多在玩开发板的的同学几乎都不懂得,其实个人电脑才是功能最齐全的“开花板”! - by Jimbowhy 为了混用汇编和C语言进行编程,就需要配套使用微软的C/C++语言编译器,也即是 Visual C++,它的前身是 Microsoft C/C++,最高版本好像是1992年的Microsoft(R) C/C++, Version 7.0,我手上就有MSC70.zip,还有1991年发布的MSC60.zip两个版本。更早的C语言开发工具就是1990年的QuickC(R) Compiler 2.51 Professional。然后就是Visual系列的天下了,最早的一版是1992年发行的Visual C++ 1.0,20张3.5英寸磁盘装,现在能看到的只有磁盘镜像了,镜像中的Link.EX_是SZDD压缩格式。这个版本支持16位和32位开发,集成MFC框架,集成资源编辑器。链接程序为32位 Executable Linker 1.00,同时提供 link.exe 和 link32.exe 两个命令。在 Win PC World 上下载到一个称为 msvc10_32s.iso 的镜像,它包含了 Win32 和 NT两个套开发工具,标明是 Visual C++ 1.0,但感觉不是,像是一个未发布的版本。因为最后一个DOS开发版本是 Dec 5, 1994发行的 Visual C++ 1.52c,也就是从这一套工具开始,链接程序不再叫做 Executable Linker,而是叫做分段模式程序链接Segmented Executable Linker,随CD发行的链接程序版本为 5.60.339,这个链接程序也是MASM32中使用的16位程序链接器。直到今天,它仍然具有强大的生命力,一些为MSDOS、Windows 3.1编写16位应用程序的程序员还在使用这个版本,我个人也很喜欢这样小巧的开发工具,因为我只需库文件和编译工具而已,完成编码后剩下的工作就交给make工具而不是IDE。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值