[NASM] suite de Fibonacci

suite de Fibonacci [NASM] - ASM - Programmation

Marsh Posté le 04-04-2006 à 14:25:44    

salut !
je doit faire la suite de fibonacci en asm en recursif (avec nasl pour compiler), mais je n'y arrive pas.
voila ce que j'ai fait :
 
fiboasm.asm

Code :
  1. global fiboasm
  2. section .text
  3. fiboasm:
  4. push ebp
  5. mov ebp, esp
  6. mov ecx, [ebp+8]
  7. deb:
  8. cmp ecx, 2
  9. jg fibo              ;si ecx >=2 on va a fibo
  10. mov eax, 1           ; sinon on retourne 1
  11.         ret
  12. fibo:
  13. dec ecx
  14. call deb           
  15. mov ecx, [eax]         ; on met eax dans ecx
  16. dec ecx
  17. call deb
  18. add eax, ecx
  19. fin:
  20. pop ebp
  21. ret


 
princ.cpp
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. extern "C" int fiboasm(int);
  4. int main() {
  5.   int n;
  6.   cout<<"n=";
  7.   cin>>n;
  8.   cout<<"En ASM fibo("<<n<<" )="<<fiboasm(n)<<endl;
  9.   return 0;
  10. }


 
Je compile avec un makefile ! j'ai tout le temps une ereur de segmentation. j'ai deja rechercher des sources sur le net mais je n'ai pas trouver de programme simple (pour moi)
 
Merci d'avance de votre aide

Reply

Marsh Posté le 04-04-2006 à 14:25:44   

Reply

Marsh Posté le 04-04-2006 à 14:52:33    

ligne 16 : tu veux mettre eax dans ecx, mais en fait tu met le contenu de la mémoire pointée par eax dans ecx. et vu qu'eax n'est initialisé nulle part, tu dois lire une zone mémoire qui ne t'appartient pas.

Reply

Marsh Posté le 04-04-2006 à 18:04:45    

et j'ai oublié :
ligne 10, c'est pas jg qu'il faut mettre, mais jge


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-04-2006 à 19:11:59    

merci je vais essayer de corriger
 
je vois pas comment faire pour corriger le "mov ecx, [eax] "


Message édité par divxaide le 04-04-2006 à 19:17:19
Reply

Marsh Posté le 04-04-2006 à 19:45:31    

euh... les modes d'adressage, ça te dit quelque chose ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-04-2006 à 19:47:39    

non :(
c'est pas le fait que avec les [] sa donne l'adresse .?
un pote ma dit de mettre "mov ecx, eax"
 
mais sa regle pas le pb que eax ne contient rien :(

Reply

Marsh Posté le 04-04-2006 à 19:53:09    

ton pote a raison.  
mais si eax ne contient rien, ton programme ne va pas l'inventer ! c'est à toi de l'initialiser en fonction de ton algo
 
edit: on ne vous apprend pas les modes d'adressage à l'école ? :heink:


Message édité par Harkonnen le 04-04-2006 à 19:54:38

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-04-2006 à 20:01:58    

ba si mais c trop rapide et vu que sa me passionne pas trop j'ecoute pas tjs :(
 
j'arrive pas a trouver un algo qui puisse additionner les deux valeurs de n-1 et n-2
je v essayer de continuer a chercher.
Si tu a une idée... ;)

Reply

Marsh Posté le 05-04-2006 à 12:27:12    

Bonjour
En général, lorsqu'on programme en assembleur, c'est pour faire du plus compacte ou plus rapide voir les deux. Une programmation récursive est une véritable catastrophe en temps de calcul et en place utilisée donc à éviter si c'est possible.
Je n'ai pas appris ce qu'est une suite de fibonacci, et l'algo utilisé ne m'a pas permis de voir ce que cela pouvait être.
quel est l'intéret d'enrober le tout dans du C++ ?
La totale en assembleur n'est guère plus compliqué.
Un commentaire par ligne d'assembleur n'est pas du luxe et facilite une relecture rapide. En début de fonction un résumé de l'utilisation des registres peut aider au débogage.
La préservation de l'environnement pour l'appelant peut être un plus
ebp y a droit pourquoi pas ecx ?
à noter que dans ce code l'utilisation de ebp ne s'imposait pas.

Reply

Marsh Posté le 05-04-2006 à 13:00:22    

je plussoie :jap:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-04-2006 à 13:00:22   

Reply

Marsh Posté le 05-04-2006 à 13:44:20    

db__ a écrit :

Je n'ai pas appris ce qu'est une suite de fibonacci, et l'algo utilisé ne m'a pas permis de voir ce que cela pouvait être.


suite de fibonacci
 
f0=0
f1=1
f2=f1+f0=1
f3=f2+f1=2
 
regle générale:
fn=f(n-1) + f(n-2) avec n > 2
 
d'ou:
f0=0
f1=1
f2=1
f3=2
f4=3
f5=5
f6=8
etc

db__ a écrit :

Une programmation récursive est une véritable catastrophe en temps de calcul et en place utilisée donc à éviter si c'est possible.

+1
La recusivité est facilement evitable dans ce cas ....


Message édité par maxpower44 le 05-04-2006 à 13:46:46
Reply

Marsh Posté le 06-04-2006 à 13:00:04    

Bonjour
Je vois maintenant ce qu'est cette suite. Merci à Mr maxpower44
La récursivité est évitable.
Il serait peut-être bon que les professeurs demandent des exercices cohérant à leurs élèves. Celà les motiverait peut-être davantage.
Faire la chose en récursif en perl, l'améliorer en C, puis en assembleur et comparer les temps de calcul. Un facteur 1000 entre le perl et l'assembleur ne me parait pas déraisonnable. Avec java on devrait atteindre des records.

Reply

Sujets relatifs:

Leave a Replay

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