L'appel de printf en x86_64 utilisant l'assembleur GNU

J'ai écrit un programme en utilisant AT&T syntaxe pour une utilisation avec de l'assembleur GNU:

            .data
format:   .ascii "%d\n"  

            .text
            .global main  
main:
            mov    $format, %rbx
            mov    (%rbx), %rdi
            mov    $1, %rsi
            call     printf
            ret

- Je utiliser GCC de les assembler et de les lien avec:

gcc-o main.s

Je le lance avec cette commande:

./principal

Quand je lance le programme, j'obtiens un seg fault. Par l'utilisation de gdb, il dit printf pas trouvé. J'ai essayé ".extern printf", qui ne fonctionne pas. Quelqu'un m'a suggéré de stocker le pointeur de pile avant l'appel de printf et restaurer avant de RET, Comment dois-je faire?

  • Vous devriez vraiment lire sur le SysV x86-64 ABI. D'un coup d'oeil, vous avez un mauvais alignement de la pile avant l'appel, vous n'avez pas de zéro %rax, vous n'utilisez pas le droit de registres pour les bons arguments et je soupçonne que vous êtes un déréférencement format lorsque vous ne devriez pas.
InformationsquelleAutor L's World | 2016-07-12