Problème de segmentation fault [Résolu] [ASM GNU x86] - ASM - Programmation
Marsh Posté le 09-03-2004 à 20:22:31
Harkonnen va certainement écrire : |
Désolé pour le hors sujet, je ne peux pas te répondre. (up déguised)
Marsh Posté le 10-03-2004 à 13:15:46
Evadream -jbd- a vu juste : |
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
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) ?
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 :
|
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
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
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