Quelles valeurs numériques définissent le code C dissemblé?

Je comprends l’assemblage et le code C. J’ai le programme C suivant, compilé pour générer le fichier Object uniquement.

#include  int main() { int i = 10; int j = 22 + i; return 0; } 

J’ai exécuté la commande suivante

 objdump -S myprogram.o 

La sortie de la commande ci-dessus est:

 objdump -S testelf.o testelf.o: file format elf32-i386 Disassembly of section .text: 00000000 : #include  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 

Que signifie numérique avant les commandes mnémoniques, c’est-à-dire “83 ec 10” avant la commande “sub” ou “c7 45 f8 0a 00 00 00” avant la commande “movl”

J’utilise la plate-forme suivante pour comstackr 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 

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

Par exemple, c7 45 f8 0a 00 00 00 avant le movl $0xa,-0x8(%ebp) sont des valeurs hexadécimales pour les octets de code opération. Ils indiquent à la CPU de déplacer la valeur immédiate de 10 décimales (valeur de 4 octets) dans l’adresse située sur la stack actuelle de 8 octets au-dessus du pointeur de base du cadre de la stack. 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 stack se trouve à une adresse de mémoire inférieure à celle du bas de la stack. Un sens négatif à partir de la base se déplace donc vers le haut de la stack.

Les opcodes c7 45 f8 permettent de déplacer des données et d’effacer l’indicateur de portage arithmétique dans le registre EFLAGS . Voir la référence pour plus de détails.

Le rest des codes est une valeur immédiate . Comme vous utilisez un système little endian, l’octet le moins significatif d’un nombre est répertorié en premier. Par exemple, 10 décimales (0x0a en hexadécimal et 4 octets) sont stockées sous la forme 0a 00 00 00 .