Probleme avec la pile et call

cs_Mick7 Messages postés 54 Date d'inscription samedi 11 septembre 2004 Statut Membre Dernière intervention 18 avril 2007 - 21 juil. 2006 à 17:07
cs_Vermifuge Messages postés 75 Date d'inscription samedi 23 mars 2002 Statut Membre Dernière intervention 18 septembre 2006 - 18 sept. 2006 à 10:07
Salut,
Voila j'ai un probleme d'adresse de pile quand je fais appele a call affichage:

  Main:
     mov ax, 324
     mov bx, 10
  Boucle:
     xor dx, dx
     div bx
     push dx
     cmp ax, 0h
     jnz Boucle
    

  Affichage:
     pop ax
     add al, 30h
     mov ah, 0eh
     mov bl, 00h
     int 10h

     mov ah, 0h
     int 16h
     call Affichage    

     mov   ax, 4c00h
     int   21h

Ce programe a pour but d'afficher le nombre qui est stocker dans ax normalement ca devrait marcher mais quand j'arrive a l'instruction call Affichage l'adresse de ma pile est changer et je ne comprends pas d'ou ca viends
Si vous pouvier m'aider ca m'eviterai de sauter par la fenetre....

3 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
22 juil. 2006 à 17:43
salut,




un call empile toujours l'adresse de retour dans la pile, qui est ensuite depilée et réutilisée par une instruction ret qui permet de retourner à l'appelant.

si ce n'est pas une fonction mais un simple saut, il faut utiliser l'instruction jmp.

@++
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
24 juil. 2006 à 08:26
Bonjour Mick7,

Petite question : tu ne sort que le premier terme de tes divisions successives, en l'occurence "3" - est ce ce qui est souhaité ?

Autre chose, la fonction division est gourmande en temps de calcul. Il existe des algorithmes qui effectuent la multiplication par 1/10. Ils sont peut-être moins évidents mais peuvent te permettre d'optimiser les performance de ton programme.

A+
0
cs_Vermifuge Messages postés 75 Date d'inscription samedi 23 mars 2002 Statut Membre Dernière intervention 18 septembre 2006
18 sept. 2006 à 10:07
Je vais étoffer un peut l'explication de patatalo, en fait, call xxx peut se remplacer par :
push adresse_juste_après_le_call
jmp adresse_passée_dans_le_call

donc dans ta pile tu as :
ax
offset retour

la solution la plus utiliser consiste à déplacer la pile pour la fonction uniquement avec :
push ebp
mov ebp, esp

le dernier argument est situé à [ebp+08].

pour quitter ta fonction tu fais :
leave
ret

leave remet la pile en place
et voilà, normalement t'as plus de soucis de pile.

J'espère que jsuis pas trop confus ^^

Vermi
0
Rejoignez-nous