Aider à la traduction de l'assemblée de C
J'ai un code à partir d'une fonction
subl $24, %esp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
Avant que le code est juste à l'ENTRÉE de commande et par la suite il y a une instruction if pour retourner 1 si ebp > eax ou 0 si c'est de moins en moins. Je suis en supposant que cmpl moyen de comparer, mais je ne peux pas dire ce que le béton valeurs. Quelqu'un peut me dire ce qui se passe?
OriginalL'auteur GetOffMyLawn | 2010-05-06
Vous devez vous connecter pour publier un commentaire.
Oui
cmpl
signifie comparer (avec 4 octets arguments). Supposons que le morceau de code est suivi par unjg <addr>
:Puis le code est similaire à
Pour ceux qui veulent faire un rapide tricher. Seulement dans cet ordre: 1) Lire l'opérande de droite de la cmpl, 2) lecture de la deuxième lettre de l'instruction de saut, et 3) lire l'opérande gauche de la comparer à l'instruction. Donc dans ce cas: si (
%eax
est[l]ess than
ebp[12]
). Devrait vous aider à déchiffrer le code rapidementOriginalL'auteur kennytm
Votre fragment de code semblable au le code d'entrée utilisé par certains transformateurs et les compilateurs. Le le code d'entrée est l'assemblée de code que le compilateur des problèmes lors de la saisie d'une fonction.
Le code d'entrée est responsable de la sauvegarde des paramètres de la fonction et de l'allocation d'espace pour les variables locales et éventuellement de l'initialisation. Le code utilise des pointeurs vers la zone de stockage des variables. Certains processeurs utilisent une combinaison de l'EBP et ESP registres pour pointer vers l'emplacement des variables locales (et les paramètres de la fonction).
Puisque le compilateur ne sait pas où les variables (et les paramètres de la fonction) sont stockés, il descend les noms de variables et des usages numériques de l'indexation. Par exemple, la ligne:
soit de déplacer le contenu de la 8e variable locale dans le registre
EAX
, ou de déplacer la valeur de 8 octets à partir du début de la zone (en supposant que leEBP
registre des pointeurs vers le début de la variable locale de la zone).L'instruction:
implique que le compilateur est de réserver 24 octets sur la pile. Ce qui pourrait être de protéger certaines informations en fonction de convention d'appel. La fonction serait de pouvoir utiliser la zone après cela pour sa propre utilisation. Cette zone réservée peut contenir des paramètres de la fonction.
Le fragment de code que vous avez fourni ressemble, c'est la comparaison de deux variables locales à l'intérieur d'une fonction:
Essayer de démonter la fonction ci-dessus et vérifier si elle correspond à votre fragment de code.
OriginalL'auteur Thomas Matthews
C'est une comparaison entre (EBP + 8) et (EBP + 12). Basé sur le résultat de la comparaison, de la cmpl instruction définit les indicateurs qui sont utilisés en suivant les instructions de saut.
Dans Mac OS X 32 bits ABI EBP + 8 est le premier paramètre de la fonction, et EBP + 12 est le deuxième paramètre.
OriginalL'auteur diciu