syscall是x86_64上的指令吗?

pyt*_*nic 11 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),%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.  */
Run Code Online (Sandbox Code Playgroud)

现在我的问题是系统调用(在cmpq指令之前)是否是指令?其次,如果它是一个指令,ENTRY(系统调用)的含义是什么?ENTRY的同名(我不知道ENTRY是什么)和指令?其次,L(pseudo_end)是什么?

flo*_*olo 12

syscall是x86-64中的指令,用作进行系统调用ABI的一部分.(32位ABI使用int 80h或者sysenter,也可以在64位模式下使用,但使用64位代码的32位ABI是一个坏主意,特别是对于带有指针参数的调用.)

但是还有一个名为C库的函数syscall(2),它是系统调用ABI的通用包装器.您的代码显示该函数的转储,包括将返回值解码为errno-setting.ENTRY(syscall)只是意味着函数从那里开始.

L()并且ENTRY()是CPP宏.

L(pseudo_end)只是一个可以成为跳跃目标的标签.也许SYSCALL_ERROR_LABEL跳转到那里的代码,虽然它对那块代码更有效ret,所以也许它是以前版本的遗物,或用于其他东西.

  • 它是0x0F 0x05(仅查看Intel的软件开发人员手册)。 (2认同)

jpa*_*cek 5

是的,syscall是关于x86-64的说明。sysenteri686上也有类似的说明。

ENTRY(syscall)将是一个宏。可能会扩展到符号定义,为此您必须grep。