¿Es syscall una instrucción en x86_64?

1 minuto de lectura

avatar de usuario
pitónico

Quería verificar el código para realizar llamadas al sistema en glibc. Encontré algo como esto:

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.  */

Ahora mis preguntas son:

  1. Es syscall (antes de cmpq instrucción) una instrucción?
  2. Si es una instrucción, ¿cuál es el significado de ENTRY (syscall)? ¿El mismo nombre para una ENTRADA (no sé qué es una ENTRADA) y una instrucción?
  3. Que es L(pseudo_end)?

  • Está. Hace lo mismo que int 0x80 en x86.

    – Dave

    14 mayo 2012 a las 13:10

  • Tenga en cuenta que normalmente se utiliza un código especializado para cada llamada al sistema, para establecer %rax de una constante (guardando un registro), y para saltarse la configuración de argumentos no utilizados.

    – o11c

    31 de agosto de 2017 a las 1:52

  • Si esta es una instrucción real, ¿cuál es su código de operación?

    – SasQ

    7 de junio de 2015 a las 2:26

  • Es 0x0F 0x05 (solo mire el manual del desarrollador de software de Intel).

    – flolo

    30 de julio de 2015 a las 16:55

¿Ha sido útil esta solución?