使用 NASM 生成 .OBJ 并使用 LINK.EXE 链接成功生成 .exe 但程序挂起,为什么?
Generating .OBJs with NASM and linking with LINK.EXE successfully generates a .exe but the Program hangs, Why?
我使用 NASM 作为汇编程序,我正在尝试在 C++ 之后学习汇编语言,但我遇到了太多问题,例如在使用命令 nasm -f win32 c:\asm\assembly.asm
生成 .OBJ 之后生成一个 assembly.obj 文件,并在 CMD link c:\asm\assembly.obj /OUT:c:\asm\assembly.exe /SUBSYSTEM:CONSOLE /ENTRY:start
中使用命令后生成一个 assembly.exe 文件。
但是如果我尝试打开它,Windows 会显示一个框,上面写着“程序已停止工作”这是什么??我很困惑,我知道 Internet 上的 IDE,但不想使用它们中的任何一个,我喜欢命令提示符 window,但从未用它来链接我的任何应用程序(c++),这是从 TutorialsPoint.com:
复制的代码
注意*:TutorialsPoint 网站上的所有评论都是原创的,不是我的...
section .text
global _start ;must be declared for linker (ld)
_start: ;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
我尝试将 _start 更改为网站上的 _WinMain@16
(Windows 程序在 linux 上使用 _WinMain 而不是 _start)但它给链接器 error:Unresolved 外部,但是这个代码组装和链接正常,我面临的唯一问题是应用程序挂起或停止工作。
提前致谢!!
它崩溃是因为您试图在 Windows 上 运行 为 Linux 制作的组件。在这里,您的代码试图调用一些 Linux 内核的系统调用来编写 Hello World 并退出,但这在 Windows 上不起作用。汇编很少是多平台的。
根据经验,如果您看到 int 0x80
,此代码可能无法在 Windows 上运行。
在 Windows 上,您可以尝试调用 kernel32.dll 中的 MessageBox 函数,例如显示您的 HelloWorld,请参阅 this post if you need some help with this。
我使用 NASM 作为汇编程序,我正在尝试在 C++ 之后学习汇编语言,但我遇到了太多问题,例如在使用命令 nasm -f win32 c:\asm\assembly.asm
生成 .OBJ 之后生成一个 assembly.obj 文件,并在 CMD link c:\asm\assembly.obj /OUT:c:\asm\assembly.exe /SUBSYSTEM:CONSOLE /ENTRY:start
中使用命令后生成一个 assembly.exe 文件。
但是如果我尝试打开它,Windows 会显示一个框,上面写着“程序已停止工作”这是什么??我很困惑,我知道 Internet 上的 IDE,但不想使用它们中的任何一个,我喜欢命令提示符 window,但从未用它来链接我的任何应用程序(c++),这是从 TutorialsPoint.com:
复制的代码注意*:TutorialsPoint 网站上的所有评论都是原创的,不是我的...
section .text
global _start ;must be declared for linker (ld)
_start: ;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
我尝试将 _start 更改为网站上的 _WinMain@16
(Windows 程序在 linux 上使用 _WinMain 而不是 _start)但它给链接器 error:Unresolved 外部,但是这个代码组装和链接正常,我面临的唯一问题是应用程序挂起或停止工作。
提前致谢!!
它崩溃是因为您试图在 Windows 上 运行 为 Linux 制作的组件。在这里,您的代码试图调用一些 Linux 内核的系统调用来编写 Hello World 并退出,但这在 Windows 上不起作用。汇编很少是多平台的。
根据经验,如果您看到 int 0x80
,此代码可能无法在 Windows 上运行。
在 Windows 上,您可以尝试调用 kernel32.dll 中的 MessageBox 函数,例如显示您的 HelloWorld,请参阅 this post if you need some help with this。