msg1 PROC
xor eax, eax
push MB_ICONHAND or MB_OKCANCEL
push offset szDlgTitle
push offset szMsg
push 0
call MessageBox
;return value: in EAX resides a value
;indicating which button was clicked on
ret 8 ; cest ici que ca doit pser probleme
msg1 ENDP
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 16 juil. 2006 à 20:14
Si l'appelant empile 8 octets (les 2 params) donc ret 8.
'ret' ne veut pas dire 'ce que tu vas retourner' mais retour chez l'appelant dont l'adresse est dans EIP en [ESP] au moment de l'entrée dans le bloc fonction, la valeur derrière 'ret' est le nbr d'octets à dépiler, c'est-à-dire de combien remonter ESP après que EIP aura été POPé (implicite).
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 17 juil. 2006 à 16:47
Bonjour Ulala2,
En dépilant les paramètres dans la routine appelée, tu réalise le stdcall comme fonctionnent les API windows. C'est la routine appelée qui fait le ménage.
Dans le cas ou c'est l'appelant qui effectue ce travail après le call (avec un add esp,xxxx) c'est la convention C.
Le plus important est de se rappeler qu'en entrée de la routine appelée, esp pointe sur l'adresse de retour (eip). Quand tu atteindra le ret dans la routine, il faudra que esp pointe bien vers l'adresse de retour (sinon plantage quasi assuré - sauf si...). Après tu peux dépiler le nombre d'octets correspondant au nombre de paramètres empilés (4 octets par dword empilé). Ce peut être différent si tu veux garder des choses sur la pile mais attention si tu réutilises la routine