[ASM GNU x86] Problème de segmentation fault [Résolu]

Problème de segmentation fault [Résolu] [ASM GNU x86] - ASM - Programmation

Marsh Posté le 09-03-2004 à 19:54:41    

Posté sur Clubic, mais pour maximiser mes chances, je redemande ici :)
 
J'ai un petit problème sur ce programme qui calcule le terme de rang n de la suite de fibonacci, n étant acquis par un scanf et le résultat étant affiché par un printf.
 
Ca me fait un segmentation fault dès que le paramètre entré par l'utilisateur est supérieur à 1, et je ne vois pas pourquoi :/


     .data
     .lcomm i,4  # Entier pour stocker la valeur acquise par le scanf
format: .string "%d\n"  # Format d'acquisition et d'affichage
 
     .text
     .global main
 
main: push %ebp  # Sauvegarde du base pointer de l'appelant
     movl %esp,%ebp  # Le base pointer prend la valeur du stack pointer
 
     pushl $i  # On place dans la pile l'adresse du paramètre pour que scanf le modifie
     pushl $format  # On transmet également le format de la chaine (un int)
     call scanf
     add $8,%esp  # On dépile les parametres, i a la valeur entrée par l'utilisateur
 
     pushl i   # On transmet la valeur du paramètre
     subl $4,%esp  # Allocation des 4 octets dans la pile pour le retour (entier)
     call fibo
 
     movl (%esp),%eax # esp contient l'adresse du résultat de fibo, on met ce dernier dans i
 
     add $8,%esp  # On dépile le paramètre et le retour de fibo
     pushl %eax  # On place la valeur de retour de fibo dans la pile
     pushl $format  # On transmet également le format de la chaine
     call printf
     add $8,%esp  # On dépile les paramètres
 
     leave   # et c'est fini
     ret
 
fibo: pushl %ebp  # Sauvegarde du base pointer de l'appelant
     movl %esp,%ebp  # Le base pointer prend la valeur du stack pointer
     pushal   # Sauvegarde de tous les registres
 
     movl 12(%ebp),%eax # On récupère le paramètre entier passé à fibo, dans eax
 
     cmpl $0,%eax  # Si param = 0, on renvoie 0 (jump à 'zero')
     je zero
     cmpl $1,%eax  # Si param = 1, on renvoie 1 (jump à 'un')
     je un
 
     subl $1,%eax  # Dans les autres cas, on soustrait 1 au pramètre pour calculer fibo(n-1)
     pushl %eax  # On place param-1 dans la pile
     subl $4,%esp  # On rèserve de la place pour le retour
     call fibo  # Appel récursif de fibo
     movl (%esp),%ebx # Le résultat est à l'adresse de la pile indiquée par esp, on le met dans ebx
 
     subl $1,%eax  # On fait pareil pour calculer fibo(n-2)
     pushl %eax
     subl $4,%esp
     call fibo
     movl (%esp),%eax # Le résultat est dans eax
 
     addl %ebx,%eax  # On ajoute les deux résultats
     movl %eax,8(%ebp) # On range eax dans l'espace alloué dans la pile avant l'appel de fibo
     jmp fin   # On saute à la fin de fibo
 
zero: movl $0,8(%ebp)  # Si param = 0, on range 0 dans l'espace alloué dans la pile pour le retour de fibo
     jmp fin   # On saute à la fin de fibo
 
un: movl $1,8(%ebp)  # Si param = 1, on renvoie 1
 
fin: popal   # On restaure les registres à leur état précédant l'appel de fibo
     leave   # Fin de fibo
     ret


 
Et j'ai un peu de mal à interpréter ce que gdb peut me sortir comme info
 
Merci d'avance :)


Message édité par v10ware le 11-03-2004 à 18:37:07
Reply

Marsh Posté le 09-03-2004 à 19:54:41   

Reply

Marsh Posté le 09-03-2004 à 20:22:31    


 
Désolé pour le hors sujet, je ne peux pas te répondre. (up déguised)


Message édité par Evadream -jbd- le 09-03-2004 à 20:22:48
Reply

Marsh Posté le 10-03-2004 à 13:10:20    

Allez please, une ame charitable pour m'aider :)

Reply

Marsh Posté le 10-03-2004 à 13:15:46    

Evadream -jbd- a vu juste :


 
Vive la syntaxe ATT


:D
Désolé, mais je peux pas te répondre non plus (pas d'asm GNU sous le coude, et pas envie de me casser la tête à déchiffrer cette syntaxe de merde) :/
 
Par contre, je peux te conseiller d'utiliser OllyDbg, un débuggeur pas à pas freeware, qui t'aidera certainement à cerner ton erreur ;)

Reply

Marsh Posté le 10-03-2004 à 19:35:37    

Oki c'est gentil, je vais zieuter ça. Quant à la "syntaxe de merde", je veux bien être d'accord avec toi, mais ça sous entend qu'il y en a d'autres (débutant inside) ?

Reply

Marsh Posté le 10-03-2004 à 21:10:29    

v10ware a écrit :

Oki c'est gentil, je vais zieuter ça. Quant à la "syntaxe de merde", je veux bien être d'accord avec toi, mais ça sous entend qu'il y en a d'autres (débutant inside) ?


Oui, tu as la syntaxe Intel, qui est la seule vraie syntaxe.
Exemple, je convertis les 1eres lignes de ton source en Intel :
 

Code :
  1. push   ebp
  2. mov    ebp,esp
  3. push   i
  4. push   format
  5. call   scanf
  6. add    esp,8
  7. push   i
  8. sub    esp,4
  9. call   fibo
  10. mov   eax,[esp]


 
Comme tu peux le voir, c'est beaucoup plus lisible. En plus, l'ordre des opérandes est inversé (on place d'abord la destination, puis la sources, alors que c'est l'inverse en AT&T)
 
Bref, AT&T suxx des ours :kaola:

Reply

Marsh Posté le 10-03-2004 à 23:26:13    

La source avant la destination c'est plut logique, je trouve, mais effectivement, le code est plus clair comme ça...
 
Maintenant, va expliquer ça à mon prof de TP ;)
 
Personne ne se sent de me résoudre le problème, sinon ?
 
[edit] Résolu, j'avais oublie de dépiler les paramètres passés à fibo


Message édité par v10ware le 11-03-2004 à 18:37:36
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed