分类: LINUX
2008-06-01 13:04:23
安装
可以下载并安装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会出错的。
|