Syscall de asm em linha em x86_64 Linux?
-
05-07-2019 - |
Pergunta
Por que esse lixo de impressão em vez de sair meu programa graciosamente? I usar o sistema chama deste modo em BSD, e eu me pergunto o que eu preciso para fazê-lo funcionar no Linux.
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
Graças.
Solução
Por que esse lixo de impressão em vez de sair meu programa graciosamente?
Por CESA-2009-001 , "syscall 1 é saída em i386, mas write on x86_64" .
o que eu preciso para fazê-lo funcionar em Linux
Use os ordinais syscall do atual unistd_64.h
Espero que isso ajude!
Outras dicas
SYSCALL 1 é saída em i386, mas escrita em x86-64 eu acredito.
EDIT: isto parece imprecisa: De acordo com a web, o que não parece ter muita informação sobre x86-64 Linux montagem esta parece ser a configuração do registo esperado antes da instrução 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??