【问题标题】:My message in assembly when compiled does not display编译时我在汇编中的消息不显示
【发布时间】:2022-02-09 22:02:23
【问题描述】:

我在 64 位的 Windows 11 上,我在程序集 a64 中编写了这段代码,但在编译和链接后(使用 nasm 和 ld)它只需等待 3 秒平均然后停止:

bits 64

section .data
    message db 'Hello World !', 10

section .text
    global _start
    _start:
        mov rax, 1
        mov rdi, 1
        mov rsi, message
        mov rdx, 13+1
        syscall

        mov rax, 60
        mov rdi, 0
        syscall

在 powershell 中键入 nasm 命令:nasm -f win64 file.asm -o file.o

然后 ld 命令:ld file.o -o file.exe

当我在 powershell 中启动这个文件时,它只需等待 3 秒并停止。 cmd也一样。

这是我的编译器的测试程序,用于查看它是否工作,我不知道我是否没有正确编写代码,或者这些编译器或链接器是否无法在 Win 11 上工作。

注意:我的处理器也是英特尔

【问题讨论】:

  • 你从哪里得到这些系统调用号码的?看起来像linux。 linux 系统调用无法在 Windows 上运行。
  • 你可以看看stackoverflow.com/q/24423642/2189500(虽然那是32位)。

标签: assembly 64-bit x86-64 nasm ld


【解决方案1】:
  1. Windoze 程序 [通常] 执行 not use syscall/sysenter; 你通常use the WinAPI
  2. 除了适配David Wohlferd’s comment中提到的“Hello World”外,还可以同时使用WSL,Windoh’s Subsystem for Linux,仍然可以使用熟悉的syscall界面进行编程。 显然,这需要一个 ‑felf64 可执行文件开始,但是(没有尝试过)像 wsl ‑‑exec myProgram 这样的东西应该可以解决问题。
  3. 一些风格评论: 用13+1 填充rdx 容易出错。 请改用equ constant

【讨论】:

    【解决方案2】:

    两种可能: 1. “Linux 系统调用无法在 Windows 上运行”。

    在 Linux 上试用。

    2.syscall 指令使用 MSR 寄存器作为目标。传统的 eax syscall-number 将不起作用。

    尝试将“syscall”替换为“int 0x80”

    请提供更多信息

    【讨论】:

    • 1.是的,这段代码使用的是 Linux x86-64 系统调用。 2. 嗯?不,Windows 甚至不使用int 0x80 进行来自用户空间的系统调用,这只会在int 0x80 上崩溃,而不是返回“错误的系统调用”错误返回。 Windows x64确实使用syscall 进行系统调用,RAX 作为调用号AFAIK (j00ru.vexillium.org/syscalls/nt/64 / ),因此设置了适当的MSR,这与0x80 的IDT 条目不同。电话号码are undocumented and not stable between versions,与Linux不同;甚至可用的调用也不同。
    猜你喜欢
    • 2013-06-12
    • 2022-01-06
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多