IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Segmentation fault en assembleur x86


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Normalien
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Normalien

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Segmentation fault en assembleur x86
    Bonjour,

    voici un programme très simple en assembleur. Il se contente de dire "Bonjour".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    .globl main
    .CDC_0:
      .string "Bonjour"
    .main:
      pushq %rbp
      pushq $0
      movq %rsp, %rbp
      movq .CDC_0, %rax
      movq %rax, %rsi
      call fprintf
      popq %rbp
      popq %rbp
      ret
    Il compile bien, mais j'ai un segmentation fault lors de l'exécution et je ne parviens pas à la localiser.
    Merci d'avance pour votre aide.

    Noël.

    P.S. : j'ai un doute sur le nom après le "call", mais l'erreur ne vient sûrement pas de là. En fait, je n'ai plus le code exact sous les yeux mais il n'y a sûrement pas d'autre erreur.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    lignes 11 et 12 t'as 2 fois popq %rbp t'es sûr de ton coup ?
    moi je remplacerai le premier par un movq %rbp, %rsp

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Normalien
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Normalien

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Si j'ai mis deux popq c'est parce qu'il y a deux pushq au début. On m'a dit qu'il fallait un alignement 16 bits sur la pile pour que l'appel à fprintf (ou un nom de ce genre) se fasse correctement.
    Tu préconises donc que je rajoute un "movq %rbp, %rsp" avant le premier popq ?

    (désolé, je ne peux pas tester dans l'immédiat, mais je vous dirai si ça marche)

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    bon j'ai regardé un peu plus en détail, l'alignement est le dernier de tes soucis

    • c'est main et non pas .main
    • c'est movq $.CDC_0, %reg et non movq .CDC_0, %reg
    • tu sembles ne pas être très sûr de la fonction à utiliser, dans ce cas préférer printf ce sera plus simple, pour tout le reste apprendre le C (?) et se référer à la manpage correspondante
    • apprendre/comprendre ce que sont un prologue et un epilogue
    • respecter la convention d'appel, ici x86_64 à priori sous Linux donc rdi, rsi, rdx, rcx, r8, r9 (dans l'ordre ! )


    à l'arrivée le code suivant est suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    .globl main
    .CDC_0:
       .string "Bonjour\n"
    main:
       // -------------------- prologue
       pushq %rbp
       movq %rsp, %rbp
       // -------------------- body
       movq $.CDC_0, %rdi
       call printf
       // -------------------- epilogue
       leave
       ret
    note personnelle: foutue syntaxe AT&T

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Normalien
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Normalien

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Il manquait le $ devant .CDC_0. Du coup ça marche parfaitement maintenant, merci.

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 18/11/2004, 00h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 20/10/2004, 00h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 07h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 16h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 14h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo