On considère qu'un ordinateur (ou machine de Von Neumann) est formé de quatre éléments
Par ailleurs :
Regardons de plus près comment fonctionnent ces éléments en regardant l'exécution pas à pas d'un programme
gdb est un débogueur qui nous permettra de suivre l'exécution du programme suivant pas à pas
Pour commencer copier le programme suivant dans gedit, le sauvegarder dans le répertoire personnel sous le nom pgm.c
#include <stdio.h>
main(){
int i = 33;
int j = 51;
int k = i + j;
}
Le compiler avec la commande suivante:
utilisateur@poste1B30:$gcc -g -o pgm pgm.c
Entrez la commande suivante qui nous permettra d'utiliser gdb
utilisateur@poste1B30:$gdb -q ./pgm
Vous voyez à l'écran ceci
Reading symbols from.../pgm...done.
(gdb)
On va mettre un point d'arrêt au début du main, pour cela entrez la commande
(gdb)break main
Vous voyez ceci
(gdb)break main
Breakpoint 1 at 0x80483c7:file pgm.c,line 18.
Entrez la commande suivante pour lancer le programme. Il va se lancer et attendre au point d'arrêt, pour qu'on puisse ensuite l'exécuter pas à pas
(gdb)run
Starting program: /home/Utilisateur/pgm
Breakpoint 1, main () at pgm.c:18
On va désassembler le code (mode intel) en entrant les commandes suivantes. On va alors voir une petite flèche montrant où se trouve le programme dans son exécution
(gdb)set disassembly-flavor intel
(gdb)disass main
Les registres sont des mémoires à l'intérieur du processeur qui servent à stocker le résultat intermédiaire de calculs ou des adresses mémoire
Nous allons suivre l'évolution des registres :
Pour observer l'évolution des registres pas à pas,voici comment procéder:
Entrer la commande i r (pour info register) dans gdb et l'on voit le contenu des registres avant l'exécution de l'instruction désignée par eip
(gdb)i r
(gdb)disass main
Pour voir le contenu d'une mémoire à l'adresse 0xadresse en hexadécimal entrez la commande
(gdb)x/x $0xadresse
Pour voir le contenu d'une mémoire désignée par ebp -0xc en hexadécimal entrez la commande
(gdb)x/x $ebp -0xc
Pour voir le contenu d'une mémoire désignée par ebp -0xc en hexadécimal par groupe d'octets (bytes) ( 4fois) entrez la commande
(gdb)x/4xb $ebp -0xc
Pour voir le contenu d'une mémoire désignée par esp en hexadécimal par groupe de mots (words) (1 mot = 4 octets) ( 4fois) entrez la commande
Faire ceci presqu'à la fin du programme pour voir la pile du main
(gdb)x/4xw $esp
Pour exécuter l'instruction et pointer sur la suivante entrez la commande
(gdb)nexti
Pour désassembler l'instruction suivante
(gdb)x/i $eip
Au lieu de faire la somme dans le main faire une fonction appelée somme(int x,int y)
Sauvegarder et compiler puis appeler gdb et faire deux points d'arrêt un dans le main l'autre sur la fonction somme
Une fois la fonction somme appelée entrez la commande suivante bt = backtrace pour voir l'évolution de la pile
(gdb)bt
Vous constatez que la fonction somme a été "empilée" sur le main, puis "dépilée" à la fin de son exécution
Maintenant iet j sont des variables globales
En utilisant objdump où se trouvent i et j en mémoire? qu'est ce qui a changé ?