繁体   English   中英

为什么“ 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

但是,这不能按原样工作,仅当我用int 0x80替换syscall时才可以。 这些不是做同样的事情吗? 我知道syscall被设计为低延迟的,但是除此之外,我认为没有区别。 为什么不起作用?

syscall仅在x86-64操作系统上有效,您应该将系统调用号放在rax寄存器中,而不是eax 有关更多信息,请参见此网站。

syscall指令不在任何地方存储“ return RIP”或“ return RSP”,因此通常在使用syscall指令之前将它们存储在先前指令的寄存器中。

我怀疑在Linux上将RCXRDX用于此目的。 因此,所有其他参数最终都存放在不同的寄存器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM