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....
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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.
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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.
cs_Vermifuge
Messages postés75Date d'inscriptionsamedi 23 mars 2002StatutMembreDernière intervention18 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.