2010-05-06 14 views
3

J'ai un code d'une fonctionAide traduction de l'assemblage à C

subl $24, %esp 
movl 8(%ebp), %eax 
cmpl 12(%ebp), %eax 

Avant que le code est juste la commande « ENTRER » et ensuite il y a une instruction if pour revenir 1 si ebp> EAX ou 0 si elle est Moins. Je suppose que cmpl signifie comparer, mais je ne peux pas dire quelles sont les valeurs concrètes. Quelqu'un peut-il me dire ce qui se passe?

Répondre

18

Oui cmpl moyens comparer (avec des arguments de 4 octets). Supposons que le morceau de code est suivie d'une jg <addr>:

movl 8(%ebp), %eax 
cmpl 12(%ebp), %eax 
jg <addr> 

Ensuite, le code est similaire à

eax = ebp[8]; 
if (eax > ebp[12]) 
    goto <addr>; 
+0

merci qui a aidé à effacer certaines choses:) – GetOffMyLawn

+0

Pour ceux qui veulent faire une triche rapide. Juste dans cet ordre: 1) Lire l'opérande droit de cmpl, 2) lire la deuxième lettre de l'instruction de saut, et 3) lire l'opérande gauche de l'instruction de comparaison. Donc dans ce cas: if ('% eax' est' [l] ess than' 'ebp [12]'). Devrait vous aider à lire le code rapidement – bluejamesbond

0

Ceci est une comparaison entre (EBP + 8) et (EBP + 12). En fonction du résultat de la comparaison, l'instruction cmpl définit les indicateurs qui sont utilisés en suivant les instructions de saut.

Dans Mac OS X 32 bit ABI EBP + 8 est le premier paramètre de fonction, et EBP + 12 est le second paramètre.

2

Votre fragment de code ressemble au code d'entrée utilisé par certains processeurs et compilateurs. Le code d'entrée est le code d'assemblage qu'un programme de compilation émet lors de l'entrée d'une fonction.

Le code d'entrée est responsable de l'enregistrement des paramètres de la fonction et de l'allocation de l'espace pour les variables locales et, éventuellement, de leur initialisation. Le code d'entrée utilise des pointeurs vers la zone de stockage des variables. Certains processeurs utilisent une combinaison des registres EBP et ESP pour pointer vers l'emplacement des variables locales (et des paramètres de fonction).

Depuis le compilateur sait où les variables (et les paramètres de fonction) sont stockés, il laisse tomber les noms de variables et utilise l'indexation numérique. Par exemple, la ligne:

movl 8(%ebp), %eax 

serait soit déplacer le contenu de la 8ème variable locale dans le registre EAX, ou déplacer la valeur à 8 octets à partir du début de la zone locale (en supposant que les EBP pointeurs de registre à le début de la zone variable locale).

L'instruction:

subl $24, %esp 

implique que le compilateur se réserve 24 octets sur la pile. Cela peut être pour protéger certaines informations dans la convention d'appel de fonction. La fonction serait en mesure d'utiliser la zone après cela pour son propre usage. Cette zone réservée peut contenir des paramètres de fonction.

Le fragment de code que vous avez fourni ressemble il compare deux variables locales dans une fonction:

void Unknown_Function(long param1, long param2, long param3) 
{ 
    unsigned int local_variable_1; 
    unsigned int local_variable_2; 
    unsigned int local_variable_3; 

    if (local_variable_2 < local_variable_3) 
    { 
    //... 
    } 
} 

Essayez désassembler la fonction ci-dessus et voir à quel point elle correspond à votre fragment de code.