【问题标题】:How to assemble and link .asm files to a Win32 executable?如何将 .asm 文件组装和链接到 Win32 可执行文件?
【发布时间】:2016-03-31 18:32:07
【问题描述】:

我的系统上安装了 NASMDev-CppDev-cpp 带有 LD(GNU 链接器)。我不熟悉汇编代码和从汇编文件创建 32 位 Windows 可执行文件的过程。我试过用这个:

nasm -f win32 ass.asm
nasm -o ass ass.o

我没有成功使用这些命令创建可执行文件。组装(使用 NASM)和链接以生成将在 32 位 Windows 上运行的可执行文件的正确方法是什么?

【问题讨论】:

  • nasm 是一个汇编程序,它生成目标文件(或平面二进制文件,但不适用)。您需要使用链接器链接对象。
  • nasm -f win32 输出一个目标文件,而不是 Win32 可执行文件。你需要一个链接器。如果您的系统(或 Microsoft 链接器)上没有 GNU Binutils 工具(具有 LD 链接器),我建议您下载GoLink,然后将其安装在路径中的某个位置。那就看看这个Stackoverflow answer
  • 赞成,因为这不是一个糟糕的问题。它问得很好,很容易理解 OP 需要什么,也很容易回答。这是非常微不足道的,但是在你知道事情是如何运作的之前,神秘的事情并不少见,然后它就是微不足道的。我很惊讶没有人找到它的副本。作为问题的一部分,我在搜索时发现的大多数问题都有答案。这个很好很简短:stackoverflow.com/questions/21010335/…。哦,迈克尔的评论确实链接到一个很好的问答。重复投票。
  • @Lesta:作为一个菜鸟,你会想看看x86 tag wiki。在学习 asm 时,您将需要一个调试器。如果您发现一个非常有用的教程,但未在 wiki 中提及,请为 wiki 留下建议的编辑。 (或回复此评论,我会添加。)
  • 我对 dev-cpp 的评论基于不再存在的评论,但我已经更新了问题。我也投票决定重新开放它。即使它被标记为重复,它仍然可以在搜索类似问题时帮助其他人。

标签: windows assembly x86 linker nasm


【解决方案1】:

您的一个似乎不再存在的 cmets 确实提到您在 Windows 上安装了 Dev-Cpp。如果您的路径上有 Dev-Cpp MinGW bin 目录,那么 GNU 链接器 LD 可供您使用。

我不知道您使用的是 32 位还是 64 位 GCC 和 Dev-Cpp,但这应该适用于生成 32 位可执行文件:

nasm -f win32 ass.asm -o ass.obj
ld -mi386pe -o ass.exe ass.obj

这将告诉 NASM 生成一个 32 位 Win32 对象,并且 LD 会将对象链接到 i386pe 32 位 Windows 可执行文件。

您也可以下载GoLink linker。将其提取到路径上后,您可以执行以下操作:

nasm -f win32 ass.asm -o ass.obj
GoLink.exe  /console ass.obj kernel32.dll user32.dll gdi32.dll 

您可能必须使用以下内容指定代码入口点(标签):

GoLink.exe  /console /entry _start ass.obj kernel32.dll user32.dll gdi32.dll 

_start 可能是您希望程序开始的标签。如果您不调用任何 Win32 API,则不需要列出的任何 DLL。

如果您不创建控制台应用程序,则可以不使用 /console

【讨论】:

  • 可能与 devs 链接器很好地链接了它,但会引发警告:“ld: warning: cannot find entry symbol _mainCRTStartup; defaulting to 00401000”。我可能错过了什么???
  • @LestaCrenay 奇怪,你有没有使用 gcc ?您现在使用什么命令来编译/组装和链接?
  • @LestaCrenay :听起来您正在尝试与 Microsoft C 运行时库链接。
  • 警告消失了。设法擦除它,但程序崩溃。运行时显示hello.exe已停止工作弹出窗口。链接命令为:ld -e _WinMain@16 hello.o -o hello.exe。至少,它没有显示任何警告。可能是什么缺陷?感谢@Michael Petch 的编辑。这个问题听起来更酷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多