链接 asm 代码时出错
Error while linking asm code
我用汇编语言编写了一个简单的程序,它将在 windows 7 32 位
中简单地显示一个消息框
.386
.model flat, stdcall
option casemap :none
extrn MessageBoxA@16 : PROC
extrn ExitProcess@4 : PROC
.data
HelloWorld db "Welcome to SecurityTube.net!", 0
MsgTitle db "First MessageBox", 0
.code
start:
mov eax, 0
push eax
lea ebx, MsgTitle
push ebx
lea ebx, HelloWorld
push ebx
push eax
call MessageBoxA@16
push eax
call ExitProcess@4
end start
我使用以下命令进行组装和链接
ml /c /coff helloworld.asm
link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib helloworld.obj
程序完美组装。但是,在链接时,我收到了这个错误:
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
LINK : fatal error LNK1104: cannot open file "kernel32.lib"
为什么我会收到此错误以及如何缓解它?
您是否检查过 Visual Studio 的目录结构并查找 $(WindowsSdkDir)\lib
以查看它们是否存在?
如果不安装http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx
您要查找的命令是:
ml.exe helloworld.asm
/coff
/link
/subsystem:windows
/defaultlib:kernel32.lib
/defaultlib:user32.lib
/libpath:C:\...somewhere...
helloworld.obj
请注意,而不是 运行ning ml
首先使用 /c
开关(assemble 仅在没有 linking 的情况下),然后 运行ning link
,我只是将它们全部合并到一个命令行中。这将 运行 MASM 转为 assemble 代码,然后立即 link 它。
魔术酱是 /link
开关,它将 在 之后出现的每个参数传递给 linker。
注意另一个您没有的新开关:/libpath
。这是告诉 linker 在哪里可以找到 LIB 文件的信息。它们是 Windows SDK 的一部分,因此您需要在硬盘上找到该目录并将该路径替换为 C:\...somewhere...
。确切位置取决于您安装的 SDK 版本和安装方式(单独安装,或作为 Visual Studio 的一部分)。如果您没有 SDK,请下载它 here for Windows 10, or for earlier versions。 (注意最新版本就够用了,不用每个版本都下载,支持multi-targeting。)
MASM 的文档都是 available online, including a comprehensive listing of command line options. Same thing for the linker; its options are here。
一个更简单的解决方案是打开 Visual Studio 命令提示符并从那里进行所有组装和 linking。这实际上 运行 是一个为您设置环境的批处理文件,因此您不必担心指定所有必需的 SDK 文件(headers、库等)的路径。您可以在“开始”菜单中找到它,或者手动找到它 运行:
C:\Program Files (x86)\Microsoft Visual Studio x.x\VC\bin\vcvars32.bat
设置 32 位构建环境。
我用汇编语言编写了一个简单的程序,它将在 windows 7 32 位
中简单地显示一个消息框.386
.model flat, stdcall
option casemap :none
extrn MessageBoxA@16 : PROC
extrn ExitProcess@4 : PROC
.data
HelloWorld db "Welcome to SecurityTube.net!", 0
MsgTitle db "First MessageBox", 0
.code
start:
mov eax, 0
push eax
lea ebx, MsgTitle
push ebx
lea ebx, HelloWorld
push ebx
push eax
call MessageBoxA@16
push eax
call ExitProcess@4
end start
我使用以下命令进行组装和链接
ml /c /coff helloworld.asm
link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib helloworld.obj
程序完美组装。但是,在链接时,我收到了这个错误:
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
LINK : fatal error LNK1104: cannot open file "kernel32.lib"
为什么我会收到此错误以及如何缓解它?
您是否检查过 Visual Studio 的目录结构并查找 $(WindowsSdkDir)\lib
以查看它们是否存在?
如果不安装http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx
您要查找的命令是:
ml.exe helloworld.asm
/coff
/link
/subsystem:windows
/defaultlib:kernel32.lib
/defaultlib:user32.lib
/libpath:C:\...somewhere...
helloworld.obj
请注意,而不是 运行ning ml
首先使用 /c
开关(assemble 仅在没有 linking 的情况下),然后 运行ning link
,我只是将它们全部合并到一个命令行中。这将 运行 MASM 转为 assemble 代码,然后立即 link 它。
魔术酱是 /link
开关,它将 在 之后出现的每个参数传递给 linker。
注意另一个您没有的新开关:/libpath
。这是告诉 linker 在哪里可以找到 LIB 文件的信息。它们是 Windows SDK 的一部分,因此您需要在硬盘上找到该目录并将该路径替换为 C:\...somewhere...
。确切位置取决于您安装的 SDK 版本和安装方式(单独安装,或作为 Visual Studio 的一部分)。如果您没有 SDK,请下载它 here for Windows 10, or for earlier versions。 (注意最新版本就够用了,不用每个版本都下载,支持multi-targeting。)
MASM 的文档都是 available online, including a comprehensive listing of command line options. Same thing for the linker; its options are here。
一个更简单的解决方案是打开 Visual Studio 命令提示符并从那里进行所有组装和 linking。这实际上 运行 是一个为您设置环境的批处理文件,因此您不必担心指定所有必需的 SDK 文件(headers、库等)的路径。您可以在“开始”菜单中找到它,或者手动找到它 运行:
C:\Program Files (x86)\Microsoft Visual Studio x.x\VC\bin\vcvars32.bat
设置 32 位构建环境。