【问题标题】:cannot run executable made by nasm in windows 7无法在 Windows 7 中运行由 nasm 生成的可执行文件
【发布时间】:2012-05-07 06:45:33
【问题描述】:

我正在使用 windows 7 来学习汇编语言。我正在使用 NASM 来创建目标文件和 mingw 来创建可执行文件。

我正在使用以下命令来编译和运行可执行文件

del hello.o
del hello.exe
nasm -f elf hello.asm
ld hello.o -o hello.exe
hello

运行 hello.exe 文件时,显示“hello.exe 已停止工作”的错误消息

使用以下命令时

    nasm -f bin hello.asm -o program.exe

我收到如下所示的错误

我的程序代码

global _start            ; global entry point export for ld
section .text
_start:
; sys_write(stdout, message, length)
mov eax, 4        ; sys_write syscall
mov ebx, 1        ; stdout
mov ecx, message    ; message address
mov edx, length        ; message string length
int 80h
; sys_exit(return_code)
mov eax, 1        ; sys_exit syscall
mov ebx, 0        ; return 0 (success)
int 80h
section .data
message: db 'Hello, world!',0x0A    ; message and newline
length: equ $-message            ; NASM definition pseudo-instruction

【问题讨论】:

    标签: assembly nasm


    【解决方案1】:

    你所拥有的是 Linux 代码(int 0x80sys_writesys_exit 是内核系统调用相当低级的东西)。

    我不认为在 Windows 操作系统上运行时尝试调用 Linux 内核是个好主意。这不太可能结束:-)

    MinGW 是 Windows 的极简 GNU, 是使用 gcc 工具链编写 Windows 应用程序的一种方式。因此,您必须遵守 Windows 规则。

    【讨论】:

    • 如何使用nasm编译8086程序
    • 除了选项之外,您正在正确地编译(从技术上讲)它。我认为您不想使用 ELF 格式(因为这不是 Windows 做事的方式)或 BIN 格式(因为那是平面文件(如古代 COM 文件),而不是 EXE 格式)。您的问题不是编译 process 而是您正在编译的源代码。您需要编写可以与 Windows 操作系统而不是 Linux 操作系统对话的代码。例如,请参阅stackoverflow.com/questions/572818/…
    • @mcandre,您必须找到等效的 Windows 方法并调用 它们。
    • @paxdiablo,你能帮我识别这些吗?汇编器教程少之又少,尤其是对于特定平台,或者更糟糕的是,多平台。
    • @mcandre,第一个,sys_write,文件描述符为 1,只是将一些东西发送到标准输出。第二个,sys_exit 正在退出程序。对于 Windows(在控制台模式下),我会查看 GetStdHandle/WriteConsoleAExitProcess。但这确实应该作为一个单独的问题提出,以便您获得更广泛的答案。
    【解决方案2】:

    除了调用 linux 内核的代码之外,正如 paxdiablo 指出的那样,您已将其组装成平面形式的二进制文件,该二进制文件不会在 Windows 下运行。您需要使用nasm -f win32

    【讨论】:

    • 如何使用nasm编译8086程序
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多