Voici un programme en Processing , copiez le exécutez le et expliquez ce que vous avez observé
void setup(){
int i = 51;
println("Pour i = "+i+" println(i = i + 1) affiche "+(i = i + 1));
i = 51;
println("Pour i = "+i+" println(i++) affiche "+(i++));
println(" i = "+i);
}
Le but de ce TP est de découvrir un peu comme pour les images numériques, le codage du programme, à l'intérieur de l'ordinateur
Pour cela nous allons passer par un autre langage de programmation,le C qui dispose d'utilitaires nous permettant de "voir" le codage du programme en machine
Voici le même programme mais en C
#include <stdio.h >
main(){
int i = 51;
printf("printf(i = i + 1) affiche %d\n",i=i+1);
i = 51;
printf("i = %d\n",i);
printf("printf(i++) affiche %d\n",i++);
printf("i = %d\n",i);
}
Nous voulons regarder à l'intérieur de la machine la différence entre ces deux instructions
utilisateur@poste1B30:~$
ce qui signifie que vous êtes dans le répertoire personnel (le ~) de l'utilisateur utilisateur sur le poste 1 de la salle B30. Le prompt $ signifie que le terminal attend une commande de votre part.
Vous aller faire compiler ce fichier (transformer un fichier texte (utf-8) en un fichier binaire exécutable) par un compilateur en entrant la commande suivante:
utilisateur@poste1B30:~$gcc -o pgm pgm.c
Le compilateur va vérifier que le fichier est correctement écrit en C, et s'il y a des erreurs, il va vous aider à les corriger, puis le compilateur va transformer ce fichier texte .c en un fichier binaire
Aller voir dans le répertoire personnel, vous devez avoir deux fichiers l'un pgm.c l'autre pgm et regarder leurs propriétés
Essayer d'ouvrir pgm avec gedit Qu'observez vous ?.
Essayer d'ouvrir pgm avec Jeex Qu'observez vous ?.
objdump est un utilitaire qui nous permettra d'avoir le code du programme pgm
Pour commencer simplement on commente tout à l'intérieur du main ()
Compilez le programme
Entrez la commande suivante qui nous permettra de désassembler le code binaire pgm
-M intel pour machine intel par défaut c'est l'affichage motorola ,-D pour disassemble
utilisateur@poste1B30:$objdump -M intel -D pgm
Beaucoup de lignes apparaissent et pourtant nous avons l'impression que notre programme ne fait rien!
Si vous pouvez remonter tout en haut de la fenêtre (sinon aller dans Edition sélectionner Profils...faire Nouveau nommer un nouveau profil objdump et sélectionner l'onglet défilement et cocher illimité puis sélectionner objdump dans profil utilisé au lancement du terminal
pgm: file format elf32-i386
Ce qui signifie que pgm est un fichier au format extended linked file pour les processeurs de la famille intel 386 avec des registres de 32 bits
Dans la section .text: on trouve le <main>
Nous allons nous intéresser plus précisément au désassemblage du <main>
Pour cela entrer la commande suivante,qui filtre le résultat précédent en ne conservant que les 30 lignes qui suivent main>:
utilisateur@poste1B30:$objdump -M intel -D pgm |grep -A30 main.:
Si on veut conserver le résultat précédent dans un fichier texte pour l'afficher dans une page html par exemple on redirige (>) le résultat vers un fichier que l'on nomme par exemple objdump.txt
utilisateur@poste1B30:$objdump -M intel -D pgm |grep -A30 main.:> objdump.txt
Voici ce que l'on obtient si on ajoute l'instruction int i = 51; dans le main()
Testez
#include <stdio.h >
main(){
int i = 129;
//seuil
if(i >= 128){
i = 128;
}
}
Toutes les machines(ordinateurs fixes, portables, téléphones, tablettes, micro contrôleurs...), au delà de quelques différences sont dites à architecture de Von Neumann
Voir un peu d'histoire ici