Je faisais quelques exercices d'assemblage, et j'ai eu un problème que je n'ai pas réussi à résoudre. Ils me disent que% esp = 0x08c28f6a. Ils disent alors que j'ai une fonction:Qu'arrive-t-il à% esp après une fonction d'appel?
funct: movw 0 (% esp),% bx;
....
ret
0x80482ae: appel fonct;
0x80484a4: XXXXXXX;
Je ne comprends pas quelle est la valeur de% esp et% bx après l'appel de la fonction, et la signification de 0 (% esp) n'est pas claire pour moi. Je sais que lorsque la fonction est appelée, l'adresse de l'instruction suivante est poussée dans la pile. Mais quel contenu est déplacé vers% bx?
'MOVW 0 (% esp),% bx' prend la valeur de 2 octets à pointé par _ESP_ (pointeur de pile) et se déplace dans 16 -bit registre _BX_. Lorsque vous appelez une fonction en code 32 bits _ESP_ est décrémentée de 4 et le pointeur Instruct de l'instruction après l'appel (l'adresse de retour) est écrit dans cette mémoire. 'call funct' est une instruction de 5 octets. L'instruction après l'appel sera 0x80482ae + 5 = 0x80482b3 be Dans ce cas, _ESP_ a apparemment démarré à 0x08c28f6a alors quand 'funct' est appelé _ESP_, il est 4 plus bas (0x08c28f6a-4 = 0x8C28F66) qu'avant l'appel. –
Donc, après le transfert est contrôlé pour fonctionner 'funct' les 2 octets à l'adresse mémoire 0 (% esp) seront les 2 octets inférieurs de l'adresse de retour (0x82b3) qui est ensuite déplacé à enregistrer _BX_ –
En réponse à un commentaire ci-dessous' movw% esp,% bx' n'est pas valide. ESP est un registre de 32 bits et _BX_ est de 16 bits. Ceci n'est pas autorisé. S'il s'agissait de 'movl% esp,% ebx', le pointeur de pile courant (ESP) serait copié dans _EBX_. Dans ce cas cela placerait la valeur 0x8C28F66 dans _EBX_ –