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

Autres architectures Assembleur Discussion :

[68k] Problème exercice suite de Fibonacci


Sujet :

Autres architectures Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut [68k] Problème exercice suite de Fibonacci
    Bonjour,
    Je suis étudiant en première année de STI (génie électronique)
    J'ai un programme en assembleur à débuger et avec mes recherches et les explications de mon prof, je ne vois pas la solution aux 14 erreurs que compte ce programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Fibonacci proc n:DWORD
    	MOVE	       eax,n
    If:	CMP	       eax,1
            JMP  	       else		;si n<=1
    	MOVE	       eax,1		;retourner 1
    	RESET
    else:	DEC	       eax		;n-1
    	PUSH	       eax		;n-1 sur la pile
    	CALLM       Fibonacci	;resultat dans eax
    	ROL	       ebx		;rectifier la pile et ebx=n-1
    	DEC	       ebx		;ebx=n-2
    	PUSH	       eax		;sauvegarder eax = Fibonacci(n-1) sur la pile
    	CALLM       Fibonacci	;résultat dans eax=Fibonacci(n-2)
    	ADD	       esp,1		;rectifier la pile
    	ROR	       ebx		;ebx = Fibonacci(n-1)
    	ADD	       eax,ebx		;eax = Fibonacci(n-2) + Fibonacci(n-1)
    	RESET
    Fibonacci  end
    J'ai essayé de faire de mon mieux car j'ai enlevé 5 erreurs (bien pour un débutant)
    Pour le programme, merci de ne pas utiliser la fonction invoke (consigne).
    Je suis disponible pour répondre a vos questions.

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Les erreurs que tu as trouvés sont déja corrigées ou non?
    Je ne m'y connais pas beaucoup en assembleur x86 mais il me semble que la 3ème instruction est fausse.Si tu fais une comparaison, il te faut un saut conditionnel (c'est ce qui est marqué dans tes commentaires).
    C'est une instruction de type "branch if less ou equal". Certainement qu'il faut remplacer le JMP par un JLE.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Apparement, tu mélanges plusieurs assembleurs.

    • EAX, EBX, ESP, ... sont des registres du i386 et supérieurs ;
    • RESET et CALLM sont des instructions du 68000 et supérieurs (68020 et supérieurs pour la seconde) ;
    • Comme indiqué par Gandf, ton JMP en troisième position doit être remplacé par un saut conditionnel.


    Bon courage.

  4. #4
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MOVE           eax,n
    If:    CMP           eax,1
            JMP             else        ;si n<=1
    Ne te fais pas bondir (par exemple) ?

    cmp suivit d'un branch inconditionnel ....

    move /mov

    ROL ebx ;rectifier la pile et ebx=n-1

    Ha bon... et ebx sort d'où ? Quel rapport avec la pile ? rol quel indice ? etc.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Bonjour,
    Merci pour vos réponses
    Les différentes erreurs qui sont dans le code viennent UNIQUEMENT de l'énoncé de l'exercice, je suis aussi nul qu'un débutant et je ne connais aucune spécificité de ce langage.

    Je vous tiens au courant si j'arrive à supprimer quelques erreurs
    (Si je met JLE à la place de JMP, il y a une erreur de plus donc le JMP est correct)

  6. #6
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Pas tout à fait une autre erreur suit: dec eax (donc eax est forcément décrémenté, quoi qu'il arrive...)

    retifier la pile se fait par un add esp 1 et non pas rol ebx qui modifie n-1 par une rotation gauche ré-entrante. ou, pour plus de surétée pop ebx (car rien n'indique que c'est la routine qui fait l'attribution à ebx....)

    les move sont mov

    de plus pour ton addition finale n n-1 il faut vérifier qui contient quoi, car ce n'est pas très clair au niveau des spécifs... eax mis à jour par la routine ou ebx ? (ebx par convention ne drait pas contenir quoi que ce soit et eax, là aussi par convention, devrait contenir le retour de résultat...)

    Le fait qu'il soit précisé de ne pas utiliser de macro de cadre de pile devrait te mettre sur la piste de l'erreur de principe... non ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse
    J'ai essayé de remplacer tous les bouts de code erronés mais rien n'y fait, j'ai toujours 15 erreurs
    Car quand il n'y a pas d'erreurs, le code est bleu et quand il y en a une, il est noire et la la majorité des lignes sont noirs (je code avec Ide68k)
    Nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Fibonacci proc n:DWORD
    	MOVE	       eax,n
    If:	CMP	       eax,1
                 JLE 	       else		;si n<=1
    	MOV	       eax,1           ;retourner 1
    	RESET
    else:	DEC	       eax		;n-1
    	PUSH	       eax		;n-1 sur la pile
    	CALLM           Fibonacci	;resultat dans eax
    	ADD	       ebx		;rectifier la pile et ebx=n-1
    	DEC	       ebx		;ebx=n-2
    	PUSH	       eax		;sauvegarder eax = Fibonacci(n-1) sur la pile
    	CALLM            Fibonacci	;résultat dans eax=Fibonacci(n-2)
    	ADD	       esp,1	;rectifier la pile
    	ROR	       ebx		;ebx = Fibonacci(n-1)
    	ADD	       eax,ebx	;eax = Fibonacci(n-2) + Fibonacci(n-1)
    	RESET
    Fibonacci  end

  8. #8
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    bien fait pour moi !
    C'est du 68xxx désolé: La migration doit donc se faire dans l'autre sens.
    Toutes les indications que je t'ai personellement données sont erronées dans la forme.
    Valides sur le fond, il ne te reste plus car reprendre tout-ça avec le bon set de mnémoniques.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Merci pour ton aide, j'attends l'aide d'un autre membre pour comparer les deux solutions

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Voila le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Fibonacci proc n:DWORD
    	MOVE	D0,n
    If:	CMP	D0,1
               JMP  	else		;si n<=1
    	MOVE	D0,1		;retourner 1
    	RESET
    else:	DEC	D0		;n-1
    	PUSH	D0		;n-1 sur la pile
    	BSR	Fibonacci	;resultat dans eax
    	ROL	D1 		;rectifier la pile et ebx=n-1
    	DEC	D1		;ebx=n-2
    	PUSH	D1		;sauvegarder eax = Fibonacci(n-1) sur la pile
    	BSR	Fibonacci	;résultat dans eax=Fibonacci(n-2)
    	ADD	esp,1		;rectifier la pile
    	ROR	D1		;ebx = Fibonacci(n-1)
    	ADD	D0,D1		;eax = Fibonacci(n-2) + Fibonacci(n-1)
    	RESET
    Fibonacci  end
    Il ne contient que 10 erreurs

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par tim91700 Voir le message
    (Si je met JLE à la place de JMP, il y a une erreur de plus donc le JMP est correct)
    Absolument pas. Ce n'est pas parce qu'une instruction compile qu'elle est la bonne. En l'occurence, JMP est un saut inconditionnel : il sautera vers l'étiquette quel que soit le résultat de CMP. Ce qu'il te faut, c'est le saut conditionnel approprié. Essaye « BLE ».

    http://fr.wikipedia.org/wiki/Motorol...27instructions

    Citation Envoyé par tim91700 Voir le message
    Voila le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	ADD	esp,1		;rectifier la pile
    Encore une fois, ESP n'est pas un registre du 68000 (et suivants), c'est un registre des processeurs Intel.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Merci pour vos conseils, le code a moins d'erreurs et il en a que 7 pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Fibonacci proc n:DWORD
    	MOVE	(D0),n
    If:	CMP	(D0),1
               BLE  	else		;si n<=1
    	MOVE	(D0),1		;retourner 1
    	RESET
    else:	DEC	(D0)		;n-1
    	PEA	(D0)		;n-1 sur la pile
    	BSR	Fibonacci	;resultat dans eax
    	ROL	(D1) 		;rectifier la pile et ebx=n-1
    	DEC	(D1)		;ebx=n-2
    	PEA	(D1)		;sauvegarder eax = Fibonacci(n-1) sur la pile
    	BSR	Fibonacci	;résultat dans eax=Fibonacci(n-2)
    	ADD	esp,1		;rectifier la pile
    	ROR	(D1)		;ebx = Fibonacci(n-1)
    	ADD	(D0),(D1)		;eax = Fibonacci(n-2) + Fibonacci(n-1)
    	RESET
    Fibonacci  end

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par tim91700 Voir le message
    Merci pour vos conseils, le code a moins d'erreurs et il en a que 7 pour le moment :
    Tant mieux, mais il n'y a pas que les erreurs : il y a aussi les avertissements (warnings) et ils doivent impérativement être résolus au même titre que les erreurs, si tu en as. Ensuite, comme dit plus haut, une fois arrivé à zéro erreur, il y a des chances pour que ton programme ne soit toujours pas correct même s'il compile. Il faudra alors entrer en phase de débogage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    	ADD	esp,1		;rectifier la pile
    Est-ce que tu tiens compte de mes remarques ? Pour la troisième fois, la pile ne s'appelle pas « ESP » sur 68000. Je te laisse faire une (brève) recherche pour savoir quel registre est utilisé comme pointeur de pile sur ce micro-processeur.

    Bon courage.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Même en effectuant la (brève) recherche, je n'arrive pas à trouver le stack (le pointeur de registre). Je sais que c'est peut-être USP ou SSP
    J'ai encore le même nombre d'erreurs :7

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par tim91700 Voir le message
    Même en effectuant la (brève) recherche, je n'arrive pas à trouver le stack (le pointeur de registre).
    Attention à utiliser la bonne terminologie : si tu ne le fais pas, c'est signe que quelque chose t'échappe. Donc :

    • Stack ⇔ la pile ;
    • « Pointeur de registre » ne veut rien dire (ou, en tout cas, ne correspond à rien) ;
    • Stack Pointer ⇔ Pointeur de pile. C'est généralement un registre qui contient l'adresse en mémoire du sommet de la pile. Accessoirement, c'est pour cela qu'il s'appelle SP sur Intel, et ESP depuis que l'on est passé de 16 à 32 bits.


    Je sais que c'est peut-être USP ou SSP. J'ai encore le même nombre d'erreurs :7
    C'est le registre « A7 ». Il fonctionne comme les autres registres d'adresse Ax, mais il est utilisé en plus par les mécanismes de manipulation de la pile. Tu peux également le nommer « SP », ou « USP » pour désigner spécifiquement la pile utilisateur. Mais jamais « ESP ».

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Bonsoir,
    Pour une meilleur compréhension des erreurs et une résolution plus rapide, je vous mets à disposition les différentes erreurs de codage :

    Erreur 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fibonacci : pgrm
    n : DWORD
    Syntax error

    Erreur 2:
    Il faut changer le n en un autre caractère

    Erreur 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If:	CMP	(D0),1
               BLE  	else		;si n<=1
    	MOVE	(D0),1		;retourner 1
    	RESET
    else:	DEC	(D0)		;n-1
    Mode d'adressage incorrect, changer le DEC car apparait en noir

    Erreur 4:
    Invalid optcode

    Erreur 5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PEA	(D1)		;sauvegarder eax = Fibonacci(n-1) sur la pile
    	BSR	Fibonacci	;résultat dans eax=Fibonacci(n-2)
    	ADD	esp,1		;rectifier la pile
    Mode d'adressage incorrect

    Erreur 6:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADD	(D0),(D1)		;eax = Fibonacci(n-2) + Fibonacci(n-1)
    Changer le ADD

    Voila le résumer des erreurs avec le nouveau code en entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Fibonacci : pgrm
    n : DWORD
    	MOVE	(D0),n
    If:	CMP	(D0),1
               BLE  	else		;si n<=1
    	MOVE	(D0),1		;retourner 1
    	RESET
    else:	DEC	(D0)		;n-1
    	PEA	(D0)		;n-1 sur la pile
    	BSR	Fibonacci	;resultat dans eax
    	ROL	(D1) 		;rectifier la pile et ebx=n-1
    	DEC	(D1)		;ebx=n-2
    	PEA	(D1)		;sauvegarder eax = Fibonacci(n-1) sur la pile
    	BSR	Fibonacci	;résultat dans eax=Fibonacci(n-2)
    	ADD	esp,1		;rectifier la pile
    	ROR	(D1)		;ebx = Fibonacci(n-1)
    	ADD	(D0),(D1)		;eax = Fibonacci(n-2) + Fibonacci(n-1)
    	RESET
    Fibonacci  end

Discussions similaires

  1. problème suite de fibonacci
    Par joelulrich dans le forum Débuter
    Réponses: 7
    Dernier message: 02/11/2010, 12h37
  2. [NASM] Problème suite de Fibonacci
    Par empochez dans le forum Assembleur
    Réponses: 1
    Dernier message: 05/04/2006, 11h17
  3. problème de suite pair et impair
    Par florane dans le forum C
    Réponses: 13
    Dernier message: 18/10/2005, 13h51
  4. Suite de Fibonacci
    Par Évariste Galois dans le forum C++
    Réponses: 13
    Dernier message: 22/07/2005, 21h21
  5. Problème affichage suite jointure
    Par xavier1977 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/07/2005, 15h00

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