为什么 'syscall' 指令在 Linux 下不起作用?

Why doesn't the 'syscall' instruction work under Linux?

我有一个在 Linux 用户区运行的非常基本的汇编程序:

section .text
global _start

_start:
    mov edx, 14
    mov ecx, msg
    mov ebx, 1
    mov eax, 4
    syscall

    mov eax, 1
    syscall

section .data
msg db "Hello, World!", 0xA

然而,这并不能正常工作,但前提是我将 syscall 替换为 int 0x80。这些不是做同样的事情吗?我知道 syscall 旨在降低延迟,但除此之外,我认为没有区别。为什么不起作用?

syscall 仅适用于 x86-64 操作系统,您应该将系统调用号放入 rax 寄存器而不是 eaxSee this website for more information.

syscall 指令不会在任何地方存储 "return RIP" 或 "return RSP",因此这些通常存储在使用 syscall 指令之前的先前指令的寄存器中。

我怀疑on Linux RCXRDX 是用于此目的;并且因此所有其他参数最终都在不同的寄存器中。