我正在使用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.onasm -f elf hello.asm
现在我正在尝试使用此命令创建 exe 文件:
ld -s -o hello hello.o
但现在我收到了这个错误:
ld不被识别为内部或外部命令,可操作程序或批次
为什么我会收到此错误,我该如何解决?
答案 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)
@Michael Petch指出教程源是为Linux设计的 - 给出的代码永远不适用于Windows。他继续提到NASM不提供链接器:OP需要从Microsoft获得它。
答案 2 :(得分:2)
这是一个老问题,但我想知道为什么没有人提到标准窗口的解决方案link /subsystem:console /entry:_main main.obj