Assembleur ● L'algorigramme ● Présentation langage/environnement ● Principales Instructions/Compilateur/Lieur C ● Adressages ● – Registres – Mémoire – direct/indirect Les Sous-Programmes – ● Instruction d'appel La pile – type/fonctionnement L'algorigramme ● ● ● Aucune structure (while, for, do...while ) Comment représenter graphiquement le fonctionnement d'un programme ? Éléments de l'organigramme L'algorigramme ● Algorigramme linéaire L'algorigramme ● Algorigramme : Structure alternative L'algorigramme ● Algorigramme : Les autres structures n'existe pas en assembleur L'algorigramme ● Algorigramme : Les autres structures n'existe pas en assembleur Assembleur ● Historique : – 1954 inventé par IBM pour son 1er ordinateur IBM701 Assemblage d'éléments simples – Langage B en 1969 pour PDP-7 et PDP-11 B vient de l'épouse de Ken Thompson – Langage C en 1972 pour réécrire UNIX Évolution du langage B avec l'ajout des types de données Langage Micro-Programmer Il faut donc adapter notre langage au binaire : – en réécrivant les nombres, les caractères ; – en créant des mnémoniques d'actions à effectuer (MOV, ADD, ...) ; – en câblant des bus d'interfaces de la taille de mots (8 bits – Binary digiT-, 16 bits, 32bits, ...) – en utilisant un langage simple pour l'utilisateur pour créer des séries d'ordres compréhensibles par la machine : l'assembleur. En écrivant avec ce langage, on utilise les mêmes actions qu'un processeur. Ces actions sont traduites en « langage machine » par un compilateur. ● Plutôt un traducteur peu ou pas du tout de correction de syntaxe traduction source - asm - binaire ● ● Le compilateur transforme un programme d'abreviations en anglais en codes machines hexadécimales Une instruction est composée de deux éléments : – Le code opération : action à effectuer par le processeur – Le champ opérande : donnée ou bien adresse de la case mémoire contenant une donnée Instruction en ● assembleur Instruction Taille de en code l'instruction machine (en octets) Descriptif de l'instruction ADD EAX, Val 05 3 ADD AX, Adr 03 06 4 INC AX 40 1 Ajoute à AX la valeur indiquée et stocke le résultat dans AX Ajoute à AX la valeur stockée à l'adresse indiquée et stocke le résultat dans AX Incrémente AX (ajoute 1) Partie du programme ● Segment de text « de programme » .text ● Segment de données (constante) .data ● Segment de données variables .bss Partie du programme ● Segment de text « de programme » .text Partie du programme ● Segment de données (constante) .data ● Segment de données variables .bss Les types de données ● ● Constantes – db data byte -octet (8bits) / char – dw data word -mot (16bits) / int – dd data double - double mot (32bits) / long Variable – Tableau – resb reserver un tableau d'octets – resw reserver un tableau de mots – resd reserver un tableau de doubles mots Les types de données ● ATTENTION AU SIGNE ● La valeur ● 1001 1101 – Donne 157 en non signé – Donne -99 en signé IMPOSSIBILITE de connaître le signe – Contrairement au C : unsigned int fonctionnement du debuggeur ● (trace, breakpoint) rendus possibles par le processeur (interruptions,commandes, ring 0 et 3). L'assembleur ● ● Sa composition: – Éditeur de texte (Bloc-note, ...) – Compilateur (nasm) – Éditeur de lien (gcc) Langage minimaliste et « lisible » – On le surnomme : langage machine – Programme que vous saisissez, aura une structure identique en mémoire : on pourra connaître exactement sa durée d'exécution – Pas de fonction complexe : pas itération, pas de gestion automatique de la mémoire ... Commentaires start: call maxxy Exemple ; Permet d’otenir le nombre de ligne et le nombre de ; colones. shr eax,1 ; En decalant, on divise par 2 le nombre de lignes... shr ebx,1 ; et le nombre de colones. sub eax,7 ; Le message fait 15 lettres, donc on soustrait 7 a eax ; pour arriver au milieu de l’ecran. call movexy ; On deplace le curseur a cette position. mov eax,hw ; On met l’adresse de la premiere lettre du message ; dans eax. call write_string ; On appelle la routine d’affichage pour obtenir : ; Hello world !!! call maxxy ; On reprend le nombre de lignes et de colones. mov eax,0 ; On met eax a 0. dec ebx ; On soustrait un L'assembleur ● ● Librairie LibIUT – Entier – Caractère – Chaîne à zéro terminal ENTETE - Inclure la bibliothèque Principales Instructions ● mov eax,0 ; On met eax a 0. ● mov eax,msg1 call write_string ; Met l'adresse de msg1 dans eax ; Ecrit à l'ecran ● sub eax,7 ; eax = eax - 7 ● dec ebx ; ebx = ebx – 1 ● jmp Etiquette1 ● ... ; saute à l'adresse de l'étiquette1 Modes Adressages ● Par Registres – A, B, C, D Instruction de déplacement « MOV » Modes Adressages ● Immédiat mov eax,120", l'opérande source "120" est immédiat ● Registres mov eax,ebx : valeur contenue dans le registre ebx ● Indirect mov eax,[adresse] : Valeur contenue dans la case adresse Principales opérations ● add xx,yy Additionner ● sub xx,yy Soustraire ● inc xx Incrémenter (ajouter +1) ● dec xx Décrémenter (soustraire -1) ● mul xx Multiplier ● div xx Diviser Sauts ● jmp : saut toujours ● Sauts conditionnels en fonction de l'état du µP – Test du registre d'état (Satus Register) Cmp al,0 – (ou autre instruction) Action conditionnée à l'etat du SR ● Jne : jump if not equal jne xxxxxxx Exécuter ou non Sauts Conditionnels ● je/jne si egal ● jo/jno si overflow ● jc/jnc si carry ● jz/jnz si egal à zero ● jge/jnge ● js/jns si <0 ● jp/jnp si pair si >ou = ● Étiquettes – Saut vers plus loin Relatives (16bits signés / ou se trouve l'étiquette) valable/utilisable entre deux étiquettes absolues (plusieurs étiquettes ".sinon" correspondant à plusieurs "si ... alors ... sinon ... finsi") jmp .jour .... .jour: – Absolues (32bits / position exacte) endroit précis et unique de la mémoire (désigne un et un seul endroit) jmp jour ... jour : Bibliothèque LibIUT ● Entrée/Sortie régis par le OS ● Clavier et écran Les 2 fichiers nécessaires dans le dossier de travail – ● – Fichier : iut.inc – Fichier : libIUT.a Aller voir la documentation en pdf Extrait Bibliothèque LibIUT ● ● ● re a d_c h a r : lit un et un seul caractère de la liste des caractères tapés par l’utilisateur, et donne dans le registre 8 bits AL, la valeur du code ASCII correspondant. re a d_in t : lit une série de chiffres formant un entier décimal signé (ou non) et place sa valeur dans le registre EAX. re a d_u in t : lit une série de chiffres formant un entier décimal non signé, et place sa valeur dans le registre EAX. En pratique cependant, cette fonction a le même comportement que read_int. Extrait Bibliothèque LibIUT ● ● ● ● ● w rite _c h a r : écrit à l’écran le caractère dont le code ASCII a été donné dans le registre 8 bits AL. w rite _in t : écrit à l’écran le nombre entier relatif contenu dans le registre EAX. w rite _u in t : écrit à l’écran le nombre entier positif contenu dans le registre EAX. w rite _h e x a : écrit à l’écran le contenu du registre 32 bits EAX, sous forme hexadécimale. w rite _s trin g : écrit à l’écran une suite de caractères terminée par un octet nul, et dont l’adresse est donnée dans le registre EAX. Sous-Programme ● Évite de dupliquer un bout de programme ● Modularité accrue ● Travail en équipe ● Instructions – call monSousProgramme – pop monregistre – push monregistre – Ret Exemple de sous-programme FILES ● FIFO : First-In, First-Out : Premier entré, Premier sorti sortie entrée Piles ● LIFO : Last-In, First-Out : Dernier entré , premier sorti PILE ● Pointeur de pile SS et SP – SS (Stack Segment, dont la traduction est segment de pile) est un registre 16 bits contenant l'adresse du segment de pile courant. Il doit être initialisé au début du programme. – SP (Stack Pointer, littéralement pointeur de pile) est le déplacement pour atteindre le sommet de la pile (16 bits de poids faible). ● PUSH : SP <- SP + 2 ● POP : SP <- SP - 2 ● Appel Sous Programme ● Procédure –Empilement (pop 5) (Prog Principal) (SousProg) des données à destination du sous programme –Appel –Dépilement des données à destination du sous programme (push eax ; eax = 5) –Empilement de l'état du processeur (des registres qui vont être modifiés par le sous programme) –Exécution du sous programme –Dépilement de l'état du processeur (des registres pop eax) –Empilement des résultats à destination du programme principal –Retour –Dépilement des résultats à destination du programme principal Code assembleur : Appel SousProg Détails de principales structures ● Structures alternatives (si alors sinon) ● Faire .... Jusqu'à ● Tant que .... Faire Méthode : Algorigramme ● Structure ALTERNATIVE SI SINON Si eax = ebx ALORS Ceci finsi Cela Exercice : Jour & Nuit Si: Si al = 'j' Sinon: Alors: Afficher « vive le jour » Afficher « vive la nuit » Code assembleur : Jour & Nuit Exercice : Jour & Nuit & ERREURS Si1: VERS Sinon1: Si al = 'j' Sinon1: Alors1: Si2: VERS Sinon2: Si al = 'n' Afficher « vive le jour » Saut vers : finsi1 Afficher « vive la nuit » Saut vers : finsi2 finsi2: finsi1: Sinon2: Afficher « ERREUR » Saut vers : finsi2 Tant qu'il y a des erreurs faire Si1: VERS Sinon1: Si al = 'j' Sinon1: Alors1: Si2: VERS Sinon2: Si al = 'n' Afficher « vive le jour » VERS : finsi1 Afficher « vive la nuit » Sinon2: Afficher « ERREUR » VERS : finsi2 VERS: start finsi2: finsi1: Saut vers : finsi2 Code assembleur : Jour & Nuit & ERREUR Code assembleur : Début/Fin Écrire un programme en algorigramme qui lit une suite de caractères, un par un, en les comptant, jusqu’à un caractère «.» qui marque la fin de la saisie. Le programme affiche ensuite le nombre de caractères qui ont été tapés par l’utilisateur. Exemple : l’utilisateur tape « azerty. », l’ordinateur doit afficher Début ensuite « 6 lettres ». Lire un caractère 'a' Compter Lire un caractère 'z' Compter Lire un caractère 'e' Compter Lire un caractère 'r' Compter Lire un caractère 't' Compter Lire un caractère 'y' Compter Lire un caractère '.' Afficher le compteur Initialiser le compteur Lire un caractère Si le Caractère est un '.' Afficher le compteur Fin Incrémenter le compteur Écrire un programme en algorigramme qui lit une suite de caractères, un par un, en les comptant, jusqu’à un caractère «.» qui marque la fin de la saisie. Le programme affiche ensuite le nombre de caractères qui ont été tapés par l’utilisateur. Exemple : l’utilisateur tape « azerty. », l’ordinateur doit afficher Début ensuite « 6 lettres ». Lire un caractère 'a' Compter somme Lire un caractère 'z' Compter somme Lire un caractère 'e' Compter somme Lire un caractère 'r' Compter Lire un caractère 't' Compter Lire un caractère 'y' Compter Lire un caractère '.' Initialiser le compteur et la somme Lire un caractère Si le Caractère est un '.' Afficher le compteur Incrémenter le compteur Afficher la somme Somme Fin Faire .... Jusqu'à Séquence Si: Sinon: Si al = 'j' ou 'n' Alors: Test jour ou nuit Faire .... Jusqu'à Séquence Si: Sinon: Si al = 'j' ou 'n' Alors: Test jour ou nuit Mettre le code assembleur Tant que … Faire Si: Si al ≠ 'j' ou 'n' Sinon: Alors: Séquence Test Jour ou nuit Tant que .... Faire Si: Si al ≠ 'j' ou 'n' Sinon: Alors: Mettre le code assembleur Séquence Test jour ou nuit Lancement de TP ● Installation Compilateur : MinGW ● Vérification de l'installation – ● ● PATH - Variable d'environnement pour utiliser « gcc » Dans le dossier du programme à compiler – Fichier : nasm.exe (aucune installation) – Fichier : iut.inc – Fichier : libIUT.a Ligne de commande nasm –f win32 exemple.asm gcc –o exemple.exe exemple.obj –L. –lIUT – Créer un script avec ces 2 lignes (les rois du bash)