关于masm615 link问题

时间:2021-08-16 01:15:28
程序编译结束后,link不能生成.exe文件。
提示如下:
ex0.obj: fatal error L1101: invalid object module
object file offset: 1 record type: 4c
请问个位,这是什么错???

16 个解决方案

#1


根据字面意思看,是obj文件格式问题。obj是编译产生的目标文件。ML.exe 编译器用法:
ml /c /coff [,源文件]
这样产生obj文件是coff格式的通用文件。必须是coff文件才能link,产生pe格式的.exe文件。如果obj文件格式不正确,则链接也会出问题。

如果你用命令行编译,注意加上/coff选项,如果你用的是批处理文件,打开看一下ml.exe编译设置有没有问题。我给出你我的批处理文件格式:
ML -Zi -c -Fl -coff %1.asm
if errorlevel 1 goto terminate

REM add the /MAP option for a map file in the link command.

LINK32 %1.obj irvine32.lib kernel32.lib /SUBSYSTEM:CONSOLE /DEBUG
if errorLevel 1 goto terminate

#2


楼上的看的是Intel汇编语言程序设计(第4版)这本书吗?
我看的是windows 汇编语言程序设计教程  戴水贵    清华大学出的
现在.exe也生成了,可以双击运行后还是报错。不知是什么原因造成的

#3


C:\Masm615>ml /Zi /c /Fl /coff ex0.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.

 Assembling: ex0.asm

C:\Masm615>link32 /subsystem:console ex0.obj
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

完了以后可以正常生成ex0.exe

#4


ml /c /coff xxx.asm
link /subsystem:console xxx.obj

#5


.386
.model flat,stdcall
option casemap:none

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib

.code
start:
xor eax,eax
xor ebx,ebx
mov eax,1000
mov ebx,1000
mul ebx
end start


C:\Masm615>ml /c /coff 11.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.

 Assembling: 11.asm

C:\Masm615>link /subsystem:console 11.obj

Microsoft (R) Segmented Executable Linker  Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992.  All rights reserved.

LINK : warning L4017: /subsystem : unrecognized option name; option ignored
Run File [11.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
11.obj : fatal error L1101: invalid object module
Object file offset: 1 Record type: 4c
为什么会是这样???

#6


你这个 link.exe 版本不对吧,不是针对 Win32 类的程序来的。看你在上面 #3楼 的说法,应该是用 link32.exe 这个程序才对。或者将 link.exe 改个名字,将 link32.exe 改为 link.exe ?

#7


用link32可以生成.exe,但是双击就会出错。

#8


你这个程序当然会出错了,都没有正常的结束代码。Win32 最简单的就是最后用 retf 指令返回系统的加载模块结束;更规范的是调用 ExitProcess 系统 API 函数: invoke  ExitProcess, NULL,当然了调用这样的系统 API 函数,前面就需要  include kernel32.inc 和  includelib kernel32.lib 这样的原型说明和库调用说明语句了。

#9


如果照楼上的这样写,编译的时候就会报错。我本地安装的是masm615的版本,不知道为什么会编不过

#10


在 end  start 语句前加个 retf 指令会报错?
如果是用 invoke  ExitProcess, NULL 的话,报错,要么是没有 include kernel32.inc 要么就是没有指定好 include 目录,要么就是include 里没有 kernel32.inc 文件了;具体的看错误信息是什么。
还错,估计你这个 Masm615 就不对了。一般地,Win32 类的汇编,还是建议去下载 Masm32v7/8/9/10 来做;以前的些版本,支持上或有不妥。

#11


现在装了一个Masm32v10,装完后还需要重新写.bat文件吗?

#12


c重新写 .bat,什么意思?是给 Masm32 设置环境变量的,诸如 path、include、includelib 等的,还是对程序进行编译链接的?如果是前者,是要写的,毕竟安装目录之类的都可能不同,起码也要核实一下;如果是后者,没有必要了吧,简单的程序,一个 ml 和 一个 link 命令就可以了,而且手工单步运行的话,也容易看出来错误提示信息。

#13


很久以前在都是8086的,所以这次问题特别多。装好之前,用ml进行编绎就报错了。ml不能识别,我自已也加了一个.bat文件进去可是还是不行。Masm32v10装完以后没有.bat文件,没有link32.exe文件。这些需要手动加吗?

#14


Masm32 没有 link32.exe 的,其 link.exe 就是专门针对 Win32 类的;如果要创建 dos16 类的程序,可能有 link16.exe 程序,可以用它。
至于 .bat 文件,设置 Masm32 运行环境的话,通常是要下面三行的:(假设 Masm32 安装在 E:\Masm32)
path=E:\Masm32\bin;%path%
set include=e:\masm32\include
set lib=e:\masm32\lib

这三个环境变量,也可以直接添加到系统里,Windows 的“系统属性”.“高级”.“环境变量”,“编辑”path 项以加入 e:\masm32\bin,“新建”include 和 lib 两项。
如果不想影响到整个系统,也可以将这个批处理放到个“命令行窗口”的快捷方式里,如下面似的,这样运行该“命令行窗口”就会自动运行这个批处理设置好环境,无须自己再手工运行设置了:
%SystemRoot%\system32\cmd.exe /K E:\Masm32\setenv.bat

#15


还有一个问题
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib

.data
text db 10,20,30,40
buffer db 10 dup(0)
szFmt db '结果是: %d',0
.code
start:
xor eax,eax
mov al,text
mov bl,text+1
mov cl,text+2
mov dl,text+3
add al,bl
add al,cl
add al,dl

invoke wsprintf,addr buffer,addr szFmt,eax
invoke ClearScreen
invoke locate,10,10
invoke StdOut,addr buffer
invoke ExitProcess,NULL
end start
编译这个,会报错。clearscreen,locate,stdout没有定义。如果不这样写,那我怎么输出程序的结果呢?

#16


少了 include masm32.inc 这样函数说明文件吧,虽然你将库说明包括进去了。
另外,既然用到了这几个函数,说明这程序是控制台模式的,所以,链接时应该用 /subsystem:console 选项,而不是 /subsystem:windows

#1


根据字面意思看,是obj文件格式问题。obj是编译产生的目标文件。ML.exe 编译器用法:
ml /c /coff [,源文件]
这样产生obj文件是coff格式的通用文件。必须是coff文件才能link,产生pe格式的.exe文件。如果obj文件格式不正确,则链接也会出问题。

如果你用命令行编译,注意加上/coff选项,如果你用的是批处理文件,打开看一下ml.exe编译设置有没有问题。我给出你我的批处理文件格式:
ML -Zi -c -Fl -coff %1.asm
if errorlevel 1 goto terminate

REM add the /MAP option for a map file in the link command.

LINK32 %1.obj irvine32.lib kernel32.lib /SUBSYSTEM:CONSOLE /DEBUG
if errorLevel 1 goto terminate

#2


楼上的看的是Intel汇编语言程序设计(第4版)这本书吗?
我看的是windows 汇编语言程序设计教程  戴水贵    清华大学出的
现在.exe也生成了,可以双击运行后还是报错。不知是什么原因造成的

#3


C:\Masm615>ml /Zi /c /Fl /coff ex0.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.

 Assembling: ex0.asm

C:\Masm615>link32 /subsystem:console ex0.obj
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

完了以后可以正常生成ex0.exe

#4


ml /c /coff xxx.asm
link /subsystem:console xxx.obj

#5


.386
.model flat,stdcall
option casemap:none

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib

.code
start:
xor eax,eax
xor ebx,ebx
mov eax,1000
mov ebx,1000
mul ebx
end start


C:\Masm615>ml /c /coff 11.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.

 Assembling: 11.asm

C:\Masm615>link /subsystem:console 11.obj

Microsoft (R) Segmented Executable Linker  Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992.  All rights reserved.

LINK : warning L4017: /subsystem : unrecognized option name; option ignored
Run File [11.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
11.obj : fatal error L1101: invalid object module
Object file offset: 1 Record type: 4c
为什么会是这样???

#6


你这个 link.exe 版本不对吧,不是针对 Win32 类的程序来的。看你在上面 #3楼 的说法,应该是用 link32.exe 这个程序才对。或者将 link.exe 改个名字,将 link32.exe 改为 link.exe ?

#7


用link32可以生成.exe,但是双击就会出错。

#8


你这个程序当然会出错了,都没有正常的结束代码。Win32 最简单的就是最后用 retf 指令返回系统的加载模块结束;更规范的是调用 ExitProcess 系统 API 函数: invoke  ExitProcess, NULL,当然了调用这样的系统 API 函数,前面就需要  include kernel32.inc 和  includelib kernel32.lib 这样的原型说明和库调用说明语句了。

#9


如果照楼上的这样写,编译的时候就会报错。我本地安装的是masm615的版本,不知道为什么会编不过

#10


在 end  start 语句前加个 retf 指令会报错?
如果是用 invoke  ExitProcess, NULL 的话,报错,要么是没有 include kernel32.inc 要么就是没有指定好 include 目录,要么就是include 里没有 kernel32.inc 文件了;具体的看错误信息是什么。
还错,估计你这个 Masm615 就不对了。一般地,Win32 类的汇编,还是建议去下载 Masm32v7/8/9/10 来做;以前的些版本,支持上或有不妥。

#11


现在装了一个Masm32v10,装完后还需要重新写.bat文件吗?

#12


c重新写 .bat,什么意思?是给 Masm32 设置环境变量的,诸如 path、include、includelib 等的,还是对程序进行编译链接的?如果是前者,是要写的,毕竟安装目录之类的都可能不同,起码也要核实一下;如果是后者,没有必要了吧,简单的程序,一个 ml 和 一个 link 命令就可以了,而且手工单步运行的话,也容易看出来错误提示信息。

#13


很久以前在都是8086的,所以这次问题特别多。装好之前,用ml进行编绎就报错了。ml不能识别,我自已也加了一个.bat文件进去可是还是不行。Masm32v10装完以后没有.bat文件,没有link32.exe文件。这些需要手动加吗?

#14


Masm32 没有 link32.exe 的,其 link.exe 就是专门针对 Win32 类的;如果要创建 dos16 类的程序,可能有 link16.exe 程序,可以用它。
至于 .bat 文件,设置 Masm32 运行环境的话,通常是要下面三行的:(假设 Masm32 安装在 E:\Masm32)
path=E:\Masm32\bin;%path%
set include=e:\masm32\include
set lib=e:\masm32\lib

这三个环境变量,也可以直接添加到系统里,Windows 的“系统属性”.“高级”.“环境变量”,“编辑”path 项以加入 e:\masm32\bin,“新建”include 和 lib 两项。
如果不想影响到整个系统,也可以将这个批处理放到个“命令行窗口”的快捷方式里,如下面似的,这样运行该“命令行窗口”就会自动运行这个批处理设置好环境,无须自己再手工运行设置了:
%SystemRoot%\system32\cmd.exe /K E:\Masm32\setenv.bat

#15


还有一个问题
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib

.data
text db 10,20,30,40
buffer db 10 dup(0)
szFmt db '结果是: %d',0
.code
start:
xor eax,eax
mov al,text
mov bl,text+1
mov cl,text+2
mov dl,text+3
add al,bl
add al,cl
add al,dl

invoke wsprintf,addr buffer,addr szFmt,eax
invoke ClearScreen
invoke locate,10,10
invoke StdOut,addr buffer
invoke ExitProcess,NULL
end start
编译这个,会报错。clearscreen,locate,stdout没有定义。如果不这样写,那我怎么输出程序的结果呢?

#16


少了 include masm32.inc 这样函数说明文件吧,虽然你将库说明包括进去了。
另外,既然用到了这几个函数,说明这程序是控制台模式的,所以,链接时应该用 /subsystem:console 选项,而不是 /subsystem:windows