为什么 '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
寄存器而不是 eax
。
See this website for more information.
syscall
指令不会在任何地方存储 "return RIP" 或 "return RSP",因此这些通常存储在使用 syscall
指令之前的先前指令的寄存器中。
我怀疑on Linux RCX
和 RDX
是用于此目的;并且因此所有其他参数最终都在不同的寄存器中。
我有一个在 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
寄存器而不是 eax
。
See this website for more information.
syscall
指令不会在任何地方存储 "return RIP" 或 "return RSP",因此这些通常存储在使用 syscall
指令之前的先前指令的寄存器中。
我怀疑on Linux RCX
和 RDX
是用于此目的;并且因此所有其他参数最终都在不同的寄存器中。