7
votes

Pourquoi le compilateur générant une paire d'instructions PUSH / POP?

J'ai compilé le code ci-dessous avec le compilateur VC ++ 2010: xxx

et le code généré était: xxx

pourquoi y a-t-il un Poussez ECX / POP EXCX PAISE D'INSTRUCTIONS?


0 commentaires

3 Réponses :


12
votes

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


4 commentaires

D'Oh ... totalement manqué ça. :) Merci beaucoup.


Et comment cela explique-t-il la pop?


@Codeinchaos - Le pop restaure le pointeur de pile, tout comme Ajouter ESP, 4 .


mais ne serait pas pop eax au lieu de mov EAX, [ESP]; Pop ECX être encore meilleur?



3
votes

La poussée ici est utilisée pour allouer 4 octets d'espace temporaire. [ESP] serait normalement indiqué à l'adresse de retour poussée, que nous ne pouvons pas écraser.

ECX sera écrasé ici, toutefois, ECX est probablement un registre volatil dans l'abi que vous ciblez, de sorte que les fonctions ne doivent pas avoir à conserver Ecx .

La raison pour laquelle un poussoir / pop est utilisé ici est une optimisation de l'espace (et éventuellement de vitesse).


0 commentaires

0
votes

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.


0 commentaires