1

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

global fiboasm
section .text

fiboasm:

push ebp
mov ebp, esp
mov ecx, [ebp+8]

deb:

cmp ecx, 2
jg fibo ;si ecx >=2 on va a fibo
mov eax, 1 ; sinon on retourne 1
ret

fibo:

dec ecx
call deb
mov ecx, [eax] ; on met eax dans ecx
dec ecx
call deb
add eax, ecx

fin:

pop ebp
ret


princ.cpp

#include <iostream>
using namespace std;

extern "C" int fiboasm(int);

int main() {
int n;
cout<<"n=";
cin>>n;
cout<<"En ASM fibo("<<n<<")="<<fiboasm(n)<<endl;
return 0;
}


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

2

essaie ebp+4 au lieu de +8 ca devrait mieux fonctionner je pense.
Autre chose, si je te dis pas de betises :
mov ecx, [eax] ; on met eax dans ecx
devrait etre plutot
mov ecx, eax ; on met eax dans ecx
car la premiere version tu dis que tu souhaites avoir ce qui se trouve a l'adresse contenu ds eax, or, toi tu veux juste la valeur de eax.

3

non c'est sur que s'est EBP+8 (j'ai verifier)

par contre le probleme vien de ce "mov ecx, [eax] " car je croi qu'il n'ya rien dans eax au debut sad

je sais pas du tout comment faire sad

4

Fibo:     push edx     push esi     mov ebx,[esp+12]       mov esi,ebx          xor eax,eax     cmp ebx,2     setb al     jb finproc     dec ebx     push ebx     call Fibo     mov edx,eax     mov ebx,esi     dec ebx     dec ebx     push ebx     call Fibo     add eax,edx finproc:     pop esi     pop edx retn 4

Voila j'ai vite fait la fonction pour que tu puisses t'y referer. Ca devraitt'aider a resoudre ton problemes en comparant les dex codes.

J'ai pas pu le compiler sous nasm et je ne sais s'il gere lui meme l'epilogue (mov esp,ebp pop ebp et retn (lenombredeparam*4)) d'une fonction en fonction de ton prologue (push ebp et mov ebp,ebp)

J'ai testé avec masm32, je dispose que de ce compilateur actuellement.

Si tu le souhaites, je te passe le code ds son integralité et commenté.

a+

5

xpack :
non c'est sur que s'est EBP+8 (j'ai verifier)

tu as raison tongue

6

skweek : Bizarre, j'ai l'impression que tu oublies des pop dans tes appels récursifs (alors que fibo semble être __cdecl et non __stdcall, sauf le retn (que je ne connais pas) signifie "dépiler 4 octets après le retour")

xpack : Tu as deux ret, et un seul est précédé de pop ebp.


Edit: Mince, j'avais pas vu la date.
Je ne devrais pas aller sur les topics info yN après developpez.com...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.