J'ai compilé le code ci-dessous avec le compilateur VC ++ 2010: et le code généré était: p> pourquoi y a-t-il un Poussez ECX CODE> /
POP EXCX CODE> PAISE D'INSTRUCTIONS? P> P>
3 Réponses :
Le compilateur fait de la place sur la pile pour stocker le MXCSR. Cela aurait pu faire aussi bien cela:
sub esp,4 stmxcsr [ESP] mov EAX, [ESP] add esp,4 retn
D'Oh ... totalement manqué ça. :) Merci beaucoup.
Et comment cela explique-t-il la pop?
@Codeinchaos - Le pop code> restaure le pointeur de pile, tout comme
Ajouter ESP, 4 Code>.
mais ne serait pas mov EAX, [ESP]; Pop ECX code> être encore meilleur?
La poussée ici est utilisée pour allouer 4 octets d'espace temporaire. La raison pour laquelle un poussoir / pop est utilisé ici est une optimisation de l'espace (et éventuellement de vitesse). P> [ESP] code> serait normalement indiqué à l'adresse de retour poussée, que nous ne pouvons pas écraser. p>
ECX code> sera écrasé ici, toutefois,
ECX code> est probablement un registre volatil dans l'abi que vous ciblez, de sorte que les fonctions ne doivent pas avoir à conserver
Ecx code>. P>
Il crée une entrée haut de pile que ESP se réfère désormais à la cible de l'instruction STMXCSR. Ensuite, le résultat est stocké dans EAX pour le retour. P>