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