Question

Pourquoi cela imprime-t-il des déchets au lieu de quitter mon programme normalement? J'utilise les appels système de cette manière sur BSD et je me demande de quoi aurais-je besoin pour que cela fonctionne sous Linux.

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

Merci.

Était-ce utile?

La solution

  

Pourquoi est-ce que cela fait des ordures au lieu de quitter mon programme gracieusement?

Per CESA-2009-001 , " Syscall 1 est quitter sur i386 mais écrire sur x86_64 ".

  

De quoi aurais-je besoin pour que cela fonctionne sous Linux

Utilisez les ordinaux d'appels système à partir du unistd_64.h

J'espère que ça aide!

Autres conseils

L’appel système 1 est une sortie sur i386 mais une écriture sur x86-64, je crois.

EDIT: cela semble inexact: Selon le Web, qui ne semble pas avoir trop d’informations sur l’assemblage Linux x86-64, cela semble être la configuration de registre attendue avant l’instruction 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??
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top