2017-06-12 5 views
0

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?

+0

'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. –

+0

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_ –

+0

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_ –

Répondre

0

l'adresse de retour de la fonction. Le code déplace la valeur pointée par esp (décalé de 0) vers ebx. C'est l'adresse de retour. Il permet au code image de fonctionner en x86 et est utilisé pour produire des adresses de fonction, par ex.

call ebx+2000 ;; call printf 

La valeur de esp ne soit pas modifiée par la lecture de ce

+0

Ok je pense que je l'ai eu mais, 0 (% esp) est la valeur sur le dessus de la pile? (renvoie la valeur de la fonction?) et si l'instruction était movw% esp,% bx? – bernas