微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在32位Windows上与NASM汇编创build一个exe文件

我在32位Windows 7上用NASM汇编语言编写一个hello世界程序。 我的代码是:

section .text global main ;must be declared for linker (ld) main: ;tells linker entry point mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data msg db 'Hello,world!',0xa ;our dear string len equ $ - msg ;length of our dear string

我把这个程序保存为hello.asm 。 接下来,我创build了hello.o

nasm -f elf hello.asm

现在我试图用这个命令创buildexe文件

ld -s -o hello hello.o

但是现在我收到这个错误

从x86 asm在Linux中访问命令行参数的问题

Main()被调用之前Windows做了什么?

无法理解下面的macros

从命令行创build一个文件

程序集x86中的Math.h库函数

ld不被识别为内部或外部命令,可操作程序或批处理

为什么我得到这个错误,我该如何解决

访问x64 TEB C ++&Assembly

将内联GASM移植到x64 MASM访问冲突问题

英特尔指令的LOCK前缀。 有什么意义?

在32位操作系统上,虚拟8086模式下运行16位程序吗?

我们可以读取和错误注入另一个线程的程序计数器吗?

下载并安装Mingw。 然后把nasm放在Mingw bin文件夹中。 在名为Hello的bin文件夹中创建一个文件夹。 在此文件夹中,使用以下代码创建一个名为main.asm的文件

extern _printf global _main section .data msg: db "Hello,world!",10,0 section .text _main: push msg call _printf add esp,4 ret

文件夹内打开终端,首先编译为带有nasm的目标代码

D:MinGWbinHello> ..nasm -fwin32 main.asm

其次,调用gcc链接

D:MinGWbinHello> ..gcc main.obj -o main.exe

最后,测试一下:

D:MinGWbinHello> main.exe Hello,world!

OP给出了一些他从教程中得到的代码,然后和NASM进行了汇编。 当他把输出连接到一个Windows可执行文件时,他无法让它工作。

@Michael Petch指出,该教程的源代码是为Linux设计的 – 所给出的代码在Windows上无法工作。 他接着提到链接器不是由NASM提供的:OP需要从微软获得它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐