程序集致命错误 LNK1190:找到无效修复,类型 0x0001

Posted

技术标签:

【中文标题】程序集致命错误 LNK1190:找到无效修复,类型 0x0001【英文标题】:assembly fatal error LNK1190: invalid fixup found, type 0x0001 【发布时间】:2013-02-04 17:57:50 【问题描述】:

我想在 Visual Studio 2010 中编写 16 位 8086 汇编代码 但给了我错误: 代码:

.MODEL small
.STACK 100h
.data
message BYTE "Hello, world!","$"
.code
mov ah,9
mov dx,OFFSET message ; addr of buffer
int 21h
END

输出给我这个错误:

fm.obj : fatal error LNK1190: invalid fixup found, type 0x0001

我使用 ma​​sm32v11。我该怎么办?

【问题讨论】:

我认为您需要一个较旧的链接器副本。 我试过link,但是当我构建asm masm时崩溃了! 您确定 MASM32 可以编译 16 位应用程序吗?至少您必须有一些指令才能将其切换到 16 位模式。汇编器不知道您要做什么。 IMO,您必须尝试 FASM - 它可以创建 16 位应用程序。 (还有 32 位和 64 位) 具有可以链接此 16 位代码的链接器的 Visual Studio 的最后一个版本是 1.52 版。 20 年 前发布。与您的老师交谈并询问他如何获得您需要的工具,其中大部分是博物馆展览的一部分,很难获得和安装。 【参考方案1】:

汇编器在哪里知道起始地址在哪里? 使用Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994(16 位链接器) 并添加了startend start 代码汇编和链接就好了。 MASM32 在 bin 目录中包含一个 16 位链接器。您必须将不同的命令行参数传递给 ML 以正确组装 16 位代码。

.MODEL small
.STACK 100h
.data
message BYTE "Hello, world!","$"
.code
start:
mov ah,9
mov dx,OFFSET message ; addr of buffer
int 21h
END start

所以回顾一下 - 你的代码需要一个起始地址和一个结束, 您可以使用 MASM32 附带的当前 ML 来组装 16 位和 32 位代码。要链接 16 位代码,您必须使用 16 位链接器,要链接 32 位代码,您必须使用 32 位链接器。

来自我的 16 位 DOS 应用程序之一:

ML.EXE /DMASM /DDOS /Zm /c /nologo /I"f:\masm32\Include" "dosdisplay.asm"
link16.exe /NOLOGO "dosdisplay.obj"

【讨论】:

我找到了 16 位链接器并将其放在 bin 文件夹中,但 vs 没有发生变化【参考方案2】:

用这些命令编译:

ml.exe /omf 文件名.asm

link16.exe 文件名.obj

信息:

当您在没有任何特定参数的情况下调用 ml.exe 时,它​​生成的目标文件类型将为 coff 格式。 coff 格式名称修改要求您的代码应具有“_start”和“end _start”。您所写的内容适用于英特尔的 omf 目标文件。

【讨论】:

您能否说明一下这些命令,以便其他人可以理解您在其中运行的内容?

以上是关于程序集致命错误 LNK1190:找到无效修复,类型 0x0001的主要内容,如果未能解决你的问题,请参考以下文章

致命错误LNK1107:文件无效或损坏:无法读取0x21E00D

C MySQL错误“致命错误LNK1107:无效或损坏的文件:无法在0x368读取”

Visual C++ 2010 - 致命错误 LNK1169:找到一个或多个多重定义符号

致命错误 LNK1112:模块机器类型“X86”与 2010 的目标机器类型“x64”冲突

致命错误 LNK1169:找到一个或多个多重定义符号 (C++)

如何修复“致命错误:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足”错误