Semaine 02 Retour sur la semaine 01 Les outils de développement logiciel Les outils que nous utiliserons durant la première partie
Retour sur la semaine 01 Plan de cours Raisons de l apprentissage de l assembleur Architecture des processeurs modernes Architecture CISC vs RISC Architecture du Pentium 4
Entrées L assembleur Fichiers sources en langage assembleur Fichiers de définition Sortie Fichier objets Responsable de transformer le langage assembleur en langage machine (binaire)
Entrés Fichiers objets L éditeur de liens Librairies (assemblage de fichiers objets) Sortie Exécutable Responsable de trouver les dépendances entre modules objets et de créer les liens.
Les outils de développement logiciel
Pentium 4 Première partie Windows 2000 Visual C++ MASM Seconde partie Notre monde Linux Outils GNU (GCC et GAS)
Visual C++ Éditeur Environnement de développement intégré Compilateur C (CL.EXE) Éditeur de liens (LINK.EXE) Dévermineur
Les Listing Files Configuration du compilateur pour la génération Utilités de ces fichiers Apprentissage de l assembleur Déverminage de l assembleur «inline» Base d optimisation Génération des squelette de fonctions Utilités historiques
L assembleur Inline Avantages Simplicité Partage simple des variables du programme C Aucune préoccupation à propos de l organisation de la mémoire Aucune préoccupation à propos du passage des arguments Aucune préoccupation de l initialisation des librairies systèmes
Les désavantages Aucun contrôle sur l organisation de la mémoire Aucun contrôle sur les méthodes utilisées pour accéder aux variables
Pédagogiques Utilités Test rapide d une ou de quelques instructions Autres Réaliser un traitement court faisant appel à des instructions spécialisés du processeurs
MASM32 Version décomercialisé de l assembleur natif de MicroSoft Un éditeur conviviale à été ajouté : QEditor Site officiel : www.masm32.com Très puissant offre plus qu un assembleur conventionnel
Installation de MASM32 Téléchargez le fichier compresser directement du site du cours (\Outils\masmET.zip) Décompressez le de manière à ce que le répertoire masm32 soit à la racine du disque qui contiendra aussi vos programmes assembleur C est terminé!
Exemple 01 start:.686.model flat, stdcall option casemap:none include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib.code push 0 call ExitProcess end start
Utilisation MASM32 Assemblage Édition des liens Exécution Déverminage en utilisant Visual C++
.686 Directive d assemblage Obligatoire Définit le type de processeur Autres possibilités :.386.486.586 En ajoutant un P à la fin nous gagnons le droit d utiliser les instructions privilégiés.
.model flat, stdcall Directive d assemblage Obligatoire Indique que nous utiliserons un seul segment de 4 GB Indique aussi que la convention d appel des fonction sera celle du langage C standard
option casemap:none Directive d assemblage Indique que la différence entre majuscule et minuscule est importante Autres choix: all, notpublic Nécessaire pour l interaction avec les langages tel que le C
include \masm32\include\kernel32.inc include est la directive d assemblage permettant d inclure un autre fichier source. \masm32\include\kernel32.inc et le nom du fichier déclarant les fonctions de la librairie Kernel32 Cette directive ressemble en tous points à la directive #include des langages C et C++
includelib \masm32\lib\kernel32.lib includelib est la directive d assemblage qui indique qu une librairie devra être lié avec le fichier assembleur \masm32\lib\kernel32.lib est le nom de la librairie Cette information n est pas directement utilisé par l assembleur. Elle est simplement transmise à l éditeur de liens.
.code Directive de compilation Les instructions qui suivent doivent être placés dans la section réservée aux instructions exécutables Cette section peut toujours être lu et exécuté Plusieurs systèmes d exploitation ne permette pas l écriture dans cette section.
Symbole Start: Ce symbole est reconnu par l éditeur de liens comme étant le point d entrée du programme Il remplace le main des langages C / C++
Instruction push 0 Placer la valeur 0 au sommet de la pile
Instruction call ExitProcess Transférer le contrôle à la fonction ExitProcess Habituellement l exécution se continue à l instruction suivante quand la fonction appelée rend le contrôle La fonction ExitProcess à cependant la particularité de ne pas rendre le contrôle
end start Directive d assemblage Indique la fin d un fichier source Le symbole, si présent indique ou l exécution du programme doit débuter
Ce qui nous manque encore Commentaires Définition de variables globales Définition de constantes
Les commentaires Tout ce qui suit un ; sur un ligne est considéré comme un commentaire ; Exemple02.asm ; //////////////////////////////////////////////////////////////////////////// ; : Programmation systeme ; - ; Option de compilation ; ////////////////////////////////////////////////////////////////////////////.686 ; Type de processeur = P4.model flat, stdcall ; Un seul segment de 4 GB option casemap:none ; Tenir compte des majuscule-minuscule
Les commentaires (la suite) ; Includes ; //////////////////////////////////////////////////////////////////////////// include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib ; Debut du segment de code ; ////////////////////////////////////////////////////////////////////////////.code ; ===== Start ================================================================ ; Le point d'entree du programme start: push 0 ; Nous desirons que le code retourne par le programme soit 0 call ExitProcess end start
Les variables globales.data ; Variable initialises db 0 ; un octets initialise à 0 db Toto, 0 ; une chaine de caractere termine dw 100 ; un mot initialise à 0 dw 1, 2, 3 dd 456789abh dd 10 dup(0).data? ; Variables non initialisees db? dw 10 dup(?) ; un tableau de 3 mots initialises ; un double mot initialise à 0x456789ab ; un tableau de 10 double mots tous ; initialise à 0 ; un octets non initialise ; un tableau de 10 mots non initialise
Les constantes.const DIX equ 10 Ressemble aux #define du langage C ZERO db 0 CENT dw 100 Ressemble aux variables déclarés en utilisant le mot const
align n D autres directives Force un symbole à être aligné sur une adresse multiple d une puissance de 2 donnée extern symbol Indique qu un symbole est définit dans un autre module et utilisé dans celui-ci public symbol Indique qu un symbole définit dans ce module est aussi utilisé par un ou plusieurs autre modules
Et encore high expression highword expression low expression lowword expression
Un programme tout en assembleur Avantages Parfait contrôle sur tout Espace utilisé et vitesse d exécution optimale Désavantages Responsable de tout (initialisation, terminaison, gestion de la mémoire) Utilisation des librairies standards plus complexe
Le meilleur des deux mondes Ce qui serait bien c est écrire l ensemble du programme en langage de haut niveau écrire les routines ou modules critiques en assembleur Bonne nouvelle, c est possible!
Exemple 04 Programme principal généré par l assistant de Visual C++ Module Fonction.asm
Fonction.asm Remarquez plus de directive includelib plus de symbole dans la directive end la nouvelle directive public Fonction le remplacement de l appel de ExitProcess par l instruction ret Kernel32.inc n est plus inclue
Exemple04Dlg.cpp Déclaration de la fonction assembleur Laissons croire au compilateur C++ que la fonction à été écrite en langage C extern C { } void Function( void ) Appel de la fonction assembleur Difficile de faire plus simple Function()
Et le partage des données alors? Il est facile de partager des variables globales C est ce qui est fait dans l exemple 05 Nous apprendrons, plus tard dans ce cours, comment passer des arguments lors d un appel assembleur C ou C assembleur.
Variable C utilisé en assembleur Déclaration extern C { } char gdlg_message[ 64 ]; Utilisation extern gdlg_message:
Variable assembleur utilisé en C Déclaration.data? public gfct_titre gfct_titre db 32 dub(?) Utilisation extern C { extern char gfct_titre[ 32 ]; }
Petits trucs Simplifiez vous la tâche, n utilisez qu une seule des deux méthodes dans un même programme Personnellement je préfère déclarer mes variables du cote «C / C++»