使用NASM生成.OBJ并与LINK.EXE链接成功生成.exe但程序挂起,为什么?

时间:2015-01-10 17:30:14

标签: assembly

我使用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提前!!

1 个答案:

答案 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