TP 19:Machine de Von Neumann

Machine de Von Neumann

On considère qu'un ordinateur (ou machine de Von Neumann) est formé de quatre éléments

Utilisation de gdb

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

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

Appel de fonction

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

Variables globales

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é ?