我使用NASM作为汇编程序,我正在尝试在C ++之后学习汇编语言,并且我遇到了太多问题,例如在使用Command 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会显示一个框,上面写着“该程序已停止工作”是什么?我很困惑,我知道互联网上的IDE,但不想使用它们中的任何一个,我喜欢命令提示符窗口,但从未用它来链接任何我的应用程序(c ++),这是从TutorialsPoint.com复制的代码:
注意*:所有评论都是TignsPoint网站上的Orignal,它不是我的......
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)但是它给出了链接器错误:未解析的外部,但这段代码组装好并且链接正常,我遇到的唯一问题是应用程序被挂起或停止工作。
Thanx提前!!
答案 0 :(得分:1)
崩溃是因为你试图在Windows上运行Linux上的程序集。在这里,您的代码试图调用一些Linux内核的系统调用来编写Hello World并退出,但这在Windows上无效。装配很少是多平台的。
根据经验,如果您看到int 0x80
,则此代码无法在Windows上运行。
在Windows上你可以尝试调用kernel32.dll中的MessageBox函数来显示你的HelloWorld,参见this post if you need some help with this。