Pregunta

¿Por qué esto imprime basura en lugar de salir de mi programa con gracia? Utilizo las llamadas al sistema de esta manera en BSD, y me pregunto qué necesitaría para que funcione en Linux.

int
main(int argc, char **argv)
{
    __asm ("movq $1,%rax; movq <*>,%rdi; syscall"); /* exit(0) ? */
    return 0;
}

Gracias.

¿Fue útil?

Solución

  

¿Por qué esto imprime basura en lugar de salir de mi programa con gracia?

Por CESA-2009-001 , " Syscall 1 es salga en i386 pero escriba en x86_64 " ;.

  

¿Qué necesitaría para que funcione en Linux?

Use los ordinales syscall de los actuales unistd_64.h

Espero que esto ayude!

Otros consejos

Syscall 1 es exit en i386 pero escriba en x86-64, creo.

EDITAR: esto parece inexacto: Según la web, que no parece tener demasiada información sobre el ensamblaje de Linux x86-64, esta parece ser la configuración de registro esperada antes de la instrucción syscall.

 rax  system call number
 rbx  arg0
 rcx  return address from syscall
 rdx  arg2
 rsi  arg3
 rdi  arg4
 r8   arg5
 r9   arg1    (expected by gcc in %rcx)
 r10-r15  should be saved/restored by C code
 rbp  dito What is dito??
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top