【问题标题】:Why is this assembly language program unable to run under Windows 7 or DOSBox?为什么这个汇编语言程序无法在 Windows 7 或 DOSBox 下运行?
【发布时间】:2019-02-22 00:15:31
【问题描述】:
section .data
    text db "Hello, World!",10

section .text
    global _start

_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, text
    mov rdx, 14
    syscall

    mov rax, 60
    mov rdi, 0
    syscall

我正在尝试使用 NASM 运行上述汇编代码。为此,我关注this tutorial。

但是,Win7下的cmd.exe报如下错误:

而且,它从 DOSBox 给出以下错误:

到底发生了什么?

【问题讨论】:

  • 因为它是一个 Linux 程序并且使用 Linux 调用约定。
  • 它甚至是 64 位 :) 此外 nasm 不会创建 .exe 格式文件。是的,您可以将文件命名为.exe,但这并不能使其成为正确的格式。请注意,dosbox 错误是因为您尝试运行 nasm 再次不起作用。
  • 首先RSI, RDI等是64位指令,不是16位指令。如果您希望构建 16 位 .EXE,请使用 MASM 6.14 或更早版本。见blog.fpmurphy.com/2017/11/…
  • 你做了什么与教程建议的完全不同的事情吗?
  • @lurker,源代码不同。

标签: assembly nasm


【解决方案1】:

“syscall”适用于 Linux。您也使用 64 位寄存器。 64 位寄存器不适用于 16/32 位程序。 系统调用在 Windows 上不起作用。

【讨论】:

  • 这并不完全正确。 MS 没有记录他们的syscall ABI,但syscall 是 Windows DLL 调用内核的方式。您可以手动执行相同的操作; ABI 不是稳定的或可移植的,但它已经过逆向工程:github.com/j00ru/windows-syscalls / j00ru.vexillium.org/syscalls/nt/64。 (但是,是的,此代码适用于 x86-64 Linux,即使您使用 nasm -fwin64 构建它并将其链接到 64 位本机 Windows 可执行文件,OP 甚至都没有这样做。)
猜你喜欢
  • 2016-04-02
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多