2016-04-02 4 views
1

Je comprends l'assemblage et le code C. J'ai le programme C suivant, compilé pour générer le fichier objet seulement.Quelles valeurs numériques définit dans le code C dissimulé?

#include <stdio.h> 
int main() 
{ 
    int i = 10; 
    int j = 22 + i; 
    return 0; 
} 

J'ai exécuté la commande suivante

objdump -S myprogram.o 

Sortie de commande ci-dessus est:

objdump -S testelf.o 

testelf.o:  file format elf32-i386 


Disassembly of section .text: 

00000000 <main>: 
#include <stdio.h> 

int main() 
{ 
    0: 55      push %ebp 
    1: 89 e5     mov %esp,%ebp 
    3: 83 ec 10    sub $0x10,%esp 
    int i = 10; 
    6: c7 45 f8 0a 00 00 00 movl $0xa,-0x8(%ebp) 
    int j = 22 + i; 
    d: 8b 45 f8    mov -0x8(%ebp),%eax 
    10: 83 c0 16    add $0x16,%eax 
    13: 89 45 fc    mov %eax,-0x4(%ebp) 

    return 0; 
    16: b8 00 00 00 00   mov $0x0,%eax 
} 
    1b: c9      leave 
    1c: c3      ret 

Qu'est-ce que l'on entend par numérique numéro avant que les commandes mnémoniques -à-dire "83 CE10" avant " commande "sub" ou "c7 45 f8 0a 00 00 00" avant la commande "movl"

J'utilise la plate-forme suivante pour compiler ce code:

$ lscpu 
Architecture:   i686 
CPU op-mode(s):  32-bit 
Byte Order:   Little Endian 
CPU(s):    1 
On-line CPU(s) list: 0 
Thread(s) per core: 1 
Core(s) per socket: 1 
Socket(s):    1 
Vendor ID:    GenuineIntel 
+3

Ce sont les séquences de codes machine dans lesquelles les instructions d'assemblage ont été assemblées. Voir [Manuels Intel] (http://www.intel.com/content/www/fr/processors/architectures-software-developer-manuals.html) pour une référence complète du jeu d'instructions et des informations sur la façon de mapper les instructions à code machine (et vice versa). – Michael

+0

Notez que, si vous voulez étudier la sortie de l'assemblage d'un petit programme de test comme celui-ci, le compilateur peut optimiser le code inutile. Dans ce cas probablement tout parce que j n'est jamais utilisé. – Unimportant

+1

Notez que ceci est [syntaxe AT & T] (http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm), donc il ne correspond pas directement à la syntaxe représentée dans les manuels Intel. –

Répondre

1

Ce sont x86 opcodes. Une référence détaillée, autre que celles énumérées dans les commentaires ci-dessus est disponible here.

Par exemple, c7 45 f8 0a 00 00 00 avant le movl $0xa,-0x8(%ebp) sont des valeurs hexadécimales pour les octets de l'opcode. Ils indiquent à la CPU de déplacer la valeur immédiate de 10 décimales (en tant que valeur de 4 octets) dans l'adresse située sur la pile actuelle de 8 octets au-dessus du pointeur de la base de la pile. C'est là que se trouve la variable i de votre code source C lorsque votre code est en cours d'exécution. Le haut de la pile se trouve à une adresse de mémoire inférieure à celle du bas de la pile, donc déplacer une direction négative de la base déplace la pile vers le haut.

Les opcodes c7 45 f8 signifient déplacer des données et effacer l'indicateur de report arithmétique dans le registre EFLAGS. Voir le reference pour plus de détails.

Le reste des codes est immediate value. Puisque vous utilisez un petit système endian, l'octet le moins significatif d'un nombre est listé en premier, de sorte que 10 décimal qui est 0x0a en hexadécimal et qui a une valeur de 4 octets de 0x0000000a est stocké comme 0a 00 00 00.