我有一个非常基本的汇编程序,可以在Linux userland中运行:
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
被设计为低延迟,但除此之外,我并不认为存在差异。为什么它不起作用?
答案 0 :(得分:2)
syscall
仅适用于x86-64操作系统,您应将系统调用号码放在rax
寄存器中,而不是eax
。
See this website for more information.
答案 1 :(得分:1)
syscall
指令不会在任何地方存储“返回RIP”或“返回RSP”,因此在使用syscall
指令之前,这些指令通常存储在先前指令的寄存器中。
我怀疑Linux RCX
和RDX
用于此目的;并且由于这个原因,所有其他参数最终都在不同的寄存器中。