在32位Windows上使用NASM在程序集中创建exe文件

时间:2016-05-24 07:47:02

标签: windows assembly linker x86 nasm

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

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 。接下来,我使用:

创建了 hello.o
nasm -f elf hello.asm 

现在我正在尝试使用此命令创建 exe 文件:

ld -s -o hello hello.o 

但现在我收到了这个错误:

  

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

为什么我会收到此错误,我该如何解决?

3 个答案:

答案 0 :(得分:6)

下载并安装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:\MinGW\bin\Hello> ..\nasm -fwin32 main.asm

其次,调用gcc链接:

D:\MinGW\bin\Hello> ..\gcc main.obj -o main.exe

最后,测试一下:

D:\MinGW\bin\Hello> main.exe
Hello, world!

答案 1 :(得分:2)

OP提供了一些他从教程中得到的代码,然后他用NASM组装了代码。当他将输出链接到Windows可执行文件时,他无法使其工作。

@Michael Petch指出教程源是为Linux设计的 - 给出的代码永远不适用于Windows。他继续提到NASM不提供链接器:OP需要从Microsoft获得它。

答案 2 :(得分:2)

这是一个老问题,但我想知道为什么没有人提到标准窗口的解决方案link /subsystem:console /entry:_main main.obj