web-dev-qa-db-fra.com

Pourquoi laisser faire "mov esp, ebp" dans un assemblage x86?

On dit que l'instruction leave est la même que:

mov esp,ebp
pop ebp

Mais comment ça mov esp,ebp ici pour? Cela ne me semble pas valable ...

62
compile-fan

mov esp,ebp définit le pointeur de pile sur l'adresse de trame de base, libérant efficacement la trame entière. (N'oubliez pas qu'il s'agit de la syntaxe Intel, la destination vient en premier.) Si vous ne le faites pas, une fois que vous appelez ret, vous utiliserez toujours le cadre de pile de la fonction appelée avec votre fonction appelante, avec des conséquences spectaculaires.

90
zneak

Je pense que votre problème est le fait qu'il existe deux façons différentes d'écrire un assemblage x86. L'un est la notation AT&T et l'autre est la notation Intel. L'ordre des arguments d'une instruction est inversé en notation Intel par opposition à AT&T. Votre version de l'assembly semble être en notation Intel, ce qui signifie que mov esp, ebp déplace effectivement la valeur de ebp vers esp. Dans la notation AT&T la plus logique (à mon avis), ce serait mov %ebp, %esp.

4
Abhay Buch

Le compilateur utilise cette instruction pour libérer l'espace utilisé par la fonction dans la pile, l'instruction leave a le même comportement que mov esp, ebp avec pop ebp.

1
kabab