windows - 如何将 .asm 文件汇编并链接到 Win32 可执行文件?

标签 windows assembly x86 linker nasm

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

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

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

最佳答案

您的一条评论(似乎已不复存在)确实提到您在 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

关于windows - 如何将 .asm 文件汇编并链接到 Win32 可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467592/

相关文章:

Windows 保护模式 - 内存

visual-studio - Visual Studio遇到未知的断点

assembly - 如何以与操作系统无关的方式打印字符串?

c - 为什么不同 gcc 版本的简单 C 程序的汇编代码不同?

c# - 如何在 C# 的 Unity3D 中从 Steamworks API 获取 steamID?

python - 魔杖+ImageMagick+Anaconda : "' wand' has no attribute 'image' "

x86 - AVX-512 浮点比较和屏蔽

windows - 一个简单的 MASM32 程序的奇怪行为

.net - 为什么 "vcredist_x86_2010_sp1.exe,Asia"不允许我安装 SQLite?

c++ - Windows 事件日志中没有类别