syscall是x86_64上的指令吗?

syscall是x86_64上的指令吗?,c,linux,gcc,x86-64,machine-instruction,C,Linux,Gcc,X86 64,Machine Instruction,我想检查在glibc中执行系统调用的代码。我发现了这样的东西 ENTRY (syscall) movq %rdi, %rax /* Syscall number -> rax. */ movq %rsi, %rdi /* shift arg1 - arg5. */ movq %rdx, %rsi movq %rcx, %rdx movq %r8, %r10 movq %r9, %r8 movq 8(%rsp),%r

我想检查在glibc中执行系统调用的代码。我发现了这样的东西

ENTRY (syscall)
    movq %rdi, %rax     /* Syscall number -> rax.  */
    movq %rsi, %rdi     /* shift arg1 - arg5.  */
    movq %rdx, %rsi
    movq %rcx, %rdx
    movq %r8, %r10
    movq %r9, %r8
    movq 8(%rsp),%r9    /* arg6 is on the stack.  */
    syscall         /* Do the system call.  */
    cmpq $-4095, %rax   /* Check %rax for error.  */
    jae SYSCALL_ERROR_LABEL /* Jump to error handler if error.  */
L(pseudo_end):
    ret         /* Return to caller.  */

现在我的问题是,syscall(在
cmpq
指令之前)是否是一条指令?其次,如果它是一条指令,那么条目(syscall)的含义是什么?条目(我不知道条目是什么)和指令的名称相同?其次,什么是L(伪端)?

是的,
syscall
是x86-64上的一条指令。i686上有一条类似的指令
syscenter

ENTRY(syscall)
将是一个宏。可能扩展到符号定义,您必须对此进行grep处理。

是x86-64中的一条指令,用作。(32位ABI使用
int80h
sysenter
,并且在64位模式下也可用,但使用64位代码中的32位ABI是个坏主意,尤其是对于带有指针参数的调用。)

但是还有一个,系统调用ABI的通用包装器。代码显示该函数的转储,包括将返回值解码为
errno
-设置
ENTRY(syscall)
只是表示函数从那里开始

L()
ENTRY()
是CPP宏


L(pseudo_end)
只是一个可以作为跳转目标的标签。也许
SYSCALL\u ERROR\u LABEL
上的代码会跳回那里,尽管将该代码块重新调用会更有效,所以它可能是以前版本的遗物,或者用于其他用途。

的确如此。它的作用与x86中的
int 0x80
相同。请注意,每个系统调用都使用通常专用的代码,从常量(保存寄存器)设置
%rax
,并跳过设置未使用的参数。如果这是一条实际指令,它的操作码是什么?它是0x0F 0x05(请参阅英特尔的软件开发人员手册)。