Microprocesseur , Assembleur et Interfaces Plan Introduction : 1) Architecture d’un système à microprocesseur 2) Fonctionnement des liaisons par bus 3) L’assembleur Chapitre 1 : Le microprocesseur 8086 1) Organisation externe 1.1) Modes de fonctionnement (minimal et maximal) 1.2) Signaux 1.3) Fonctionnement 2) Organisation interne 2.1)Unité d’interface bus et unité d’exécution 2.2) Registres internes 2.3) Organisation de la mémoire 3) Assembleur 8086 3.1) Modes d’adressages 3.2) Jeu d’instructions 4) Interruptions du 8086 4.1) Interruptions logicielles 4.2) Interruptions matérielles 5) Structure d’un programme assembleur 8086/8088 5.1) Syntaxe des instructions 5.2) Les procédures 5.3) Déclaration des constantes numériques, variables et chaînes de caractères 5.4) Déclaration des segments 5.5) Directive Assume 5.6) Macro-instructions Chapitre 2 : Interface parallèle programmable 8255 1) Structure interne et signaux 2) Programmation du 8255 Chapitre 3 : Contrôleur d’interruptions programmable 1) Généralités sur la gestion des interruptions 2) Architecture et programmation du circuit 8259 de Intel Chapitre 4 : Interface série programmable 1) Généralités sur la transmission série 2) Architecture et programmation du 8250 3) L’assembleur La programmation en assembleur est utilisée par des spécialistes, généralement dans trois buts : - - efficacité du programme résultant : code beaucoup plus compact et s’exécutant beaucoup plus vite que du code en langage de haut niveau. Or la rapidité est un facteur critique pour un grand nombre d’applications telles que, pilotes de périphériques, cartes à puces, téléphones portables, routines BIOS ou les boucles les plus internes d’une application optimisation : pour tirer parti de l’architecture de la machine (accès à toutes les ressources de la machine) diagnostic d’erreurs (software et hardware) : on est obligé, pour certaines erreurs subtiles, d’examiner le contenu de la mémoire et donc de reconstruire pas à pas l’évolution du programme et ses effets sur le contenu des différents registres. L’assembleur présente d’autres avantages, parmi lesquels nous citerons : - possibilité d’assigner des noms à des positions mémoire ou à des dispositifs d’E/S indiquer au programme chargeur où loger en mémoire le programme et les données réservation de zones en mémoire (pile) la plupart des applications des P impliquent des échanges d’informations, données et commandes avec des dispositifs périphériques, en entrée et en sortie. Souvent, les informations de commande et d’états se traduiront par quelques digits binaires dont la signification est étroitement liée au matériel. Toutefois, l’assembleur présente deux inconvénients qui sont : - la connaissance détaillée des particularités du P que l’on emploie langage non portable : chaque P possède son propre assembleur qui reflète son architecture Ainsi, généralement, les applications pour langage assembleur auront comme caractéristiques : - petits à moyens programmes commande en temps réel beaucoup d’E/S et peu de calcul traitement limité de données Chapitre 1 Le microprocesseur 8086 1) Organisation externe 1.1) Modes de fonctionnement (voir figure 1): a) Mode minimal (MN/MX = 1): Dans ce mode, c’est le 8086 qui génère lui-même ses bus et les restrictions sont apportées par une incapacité à utiliser les co-processeurs ou processeurs associés et à être employé en multitraitement. Aussi, le 8086 ne peut adresser que 64Ko. b) Mode maximal (MN/MX = 0): Dans ce mode, le 8086 permet 2 caractéristiques supplémentaires : . Bus local : employé pour placer des extensions au 8086 : processeur d’E/S(8089), processeur mathématique (8087), processeur de système d’exploitation. Le 8086 et les co-processeurs se partagent l’accès aux bus communs. . Bus système (Multibus): permettant le multiprocessing : ensemble d’unités de traitement pouvant effectuer en parallèle diverses tâches et toutes étant connectées sur un même bus système qui permet à chaque carte d’accéder soit à des ressources communes (mémoire), soit de véhiculer des demandes d’interruptions. Chaque unité de traitement doit alors posséder un contrôleur de bus (8288) pour élaborer les signaux de contrôle multibus et un circuit de gestion du bus système (8289) pour gérer les accés au multibus selon les priorités. 1.2) Signaux du 8086: a) Signaux communs aux 2 modes: GND : masse Vcc : +5 volts CLK :entrée horloge générée par le 8284 INTR :entrée de demande d’interruption(masquable) NMI : entrée de demande d’interruption non masquable Reset : entrée d’initialisation du 8086 Ready : entrée utilisée pour synchroniser le transfert entre le 8086 et un périphérique lent Test : entrée utilisée pour synchroniser le 8086 sur un événement extérieur à la rencontre de l’instruction WAIT RD : sortie 3 états indiquant que le 8086 effectue une lecture AD0 – AD15 : bus 3 états, multiplexé. Il véhicule la partie basse de l’adresse ou la donnée. BHE/S7 : sortie 3 états. BHE valide l’octet supérieur du bus donnée (D8 – D15). S7 : à l’état bas, c’est une reconnaissance d’interruption MN/MX : 1 :mode minimal ; 0 : mode maximal b) Signaux utilisés en mode minimal: M/IO : sortie 3 états ; 1 : accès mémoire 0 : E/S WR : sortie 3 états ; signal d’écriture DEN : sortie 3 états ; autorise le transfert de données ALE : sortie de validation du bus d’adresses Hold : entrée de demande de bus HLDA : sortie de cession du bus INTA : accusé de réception d’une interruption DT/R : sortie 3 états ; pour contrôler le sens de transfert des données c) Signaux utilisés en mode maximal S0 S1 S2 : sorties 3 états indiquant le cycle en cours : S0 S1 S2 Type de transfert 0 0 0 0 1 1 1 1 prise en compte d’une interruption sélection du mode d’entrée d’une donnée sélection du mode de sortie d’une donnée halt recherche d’une instruction sélection du mode de lecture de la mémoire sélection du mode d’écriture de la mémoire état de repos 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 LOCK : sortie 3 états interdisant aux autres processeurs l’usage du bus local. Son état actif est commandé par le préfixe LOCK en tête d’une instruction A16 (S3 ) - A19(S6 ) :bus bidirectionnel,3 états, multiplexé. A16 - A19 :partie haute de l’adresse S3 S4 Segment S6 : = 0 S5 : = état du flag I S3 et S4 : code représentant le registre de segment utilisé 0 0 1 1 ES CS SS DS 0 1 0 1 QS0 QS1 : sorties indiquant l’opération effectuée sur la file d’attente QS1QS0 RQ/GT0 RQ/GT1 : 0 0 0 1 1 1 0 1 opération pas d’opération recherche dans la file du premier octet d’une instruction effacement de la file recherche de l’octet suivant RQ : utilisé par un co-processeur pour une demande de bus local GT : réponse du 8086 qui donne le bus en déconnectant l’UIB RQ/GT0 est plus prioritaire que RQ/GT1 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK GND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 6 7 8 9 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 Vcc AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE/S7 MN/MX RD RQ/GT0 / Hold RQ/GT1 / Hlda LOCK / WR S2 / M/IO S1 /DT/R S0 / DEN QS0 /ALE QS1 /INTA TEST Ready Reset b)L’unité d’exécution (UE): Elle se compose de l’UAL, les registres généraux, les registres d’index, les registres pointeurs, un registre d’état et le décodeur d’instructions. L’UE lit les codes opération dans la pile FIFO (file d’attente) alimentée par l’UIB. 2.2) Registres internes a) Registres généraux : Il y a 4 registres généraux de 16 bits pouvant être séparés en 8 registres de 8 bits : AX AH AL BX BH CH BL CL DH DL CX DX Mis à part les opérations arithmétiques et logiques classiques, ils ont des fonctions précises : AX : multiplication, division, entrée-sortie, traitement des chaînes. BX : registre de base associé à DS CX : compteur pour les boucles et opérations répétitives CL : comptage des opération de décalage et rotation DX : registre d’adresse d’E/S et extention à AX ( X et / sur 32 bits) b) Registres d’index et pointeurs Registres d’index : 2 registres SI et DI de 16 bits qui contiennent les déplacements des données vis à vis des registres de segments ES et DS. SI : source index DI : destination index Registres pointeurs : 2 registres SP et BP de 16 bits qui servent à la génération des adresses de données en particulier en pile. Ils sont associés à SS. c) Registres de segments L’espace mémoire de 1 Mo est découpé en tranches de 64Ko, appelés segments référencés par rapport aux registres de segments suivants : CS : code segment SS: stack segment DS: data segment ES: extra segment CS : sert à l’adressage des octets de programme SS: gère la pile DS: sert à l’adressage des données ES: complète DS d) Compteur ordinal Registre IP de 16 bits qui contient le déplacement de l’instruction courante vis à vis de CS. IP est mis à jour par l’UIB. e) Registre d’état Registre de 16 bits contenant 9 indicateurs dont 3 sont des bits de contrôle et 6 des bits d’état : X X XX O D I T S Z X A X P X C bits de contrôle : T : trap, pour l’exécution pas à pas I = 1 autorisation des interruptions externes masquables = 0 interdiction D : définit le sens de traitement des chaînes de caractères bits d’état : C : carry P : parité (celle du nb de bits égaux à 1) S : signe A : retenue sur quartet LSB de AL Z : zéro O : overflow 2.3) Organisation de la mémoire a) Segmentation et calcul de l’adresse physique : L’espace adressable étant de 1MO, une adresse doit être sur 20 bits. Ne disposant que de registre de 16 bits, on utilise donc 2 registres de 16 bits pour adresser 1Mo. Le premier registre de 16 bits est complété par 4 zéro en LSB, ce qui donne une adresse sur 20 bits. Ce registre est appelé registre de segment : il contient l’adresse du début du segment associé. Le deuxième registre de 16 bits contient l’offset (adresse logique), que l’on ajoute à l’adresse précédente sur 20 bits pour obtenir l’adresse physique. adresse physique = 16 x (registre de segment ) + offset L’espace adressable de 1Mo est dit segmenté ( 16 segments de 64Ko). Les segments peuvent être disjoints ou se recouvrent plus ou moins. C’est l’UIB qui calcule l’adresse physique à chaque accès à la mémoire. b) Adresses logiques : Adresse logique Segment IP SP BP Dep BX SI DI BP+dep BX+dep SI+dep DI+dep BP+SI BP+DI BX+SI BX+DI BP+SI +dep BP+DI +dep BX+SI +dep BX+DI+dep CS SS SS DS DS DS DS SS DS DS DS SS SS DS DS SS SS DS DS 3) Assembleur 8086 3.1 Modes d’adressage : a) Adressage implicite : Expl : STC CM : FE b) Adressage immédiat : L’opérande est la donnée définie dans l’instruction Expl : CMP AL, 03 CMP AX, 1003 CM : 3C 03 CM :3D 0310 c) Adressage registre (R) : Le registre concerné contient l’opérande Expl : MOV AX, BX CMP CL,BL Rq : les 2 registres doivent avoir la même taille. d) Adressage direct (DA) : Le déplacement (8 ou 16 bits) de l’opérande vis à vis du début du segment concerné est spécifié dans l’instruction Expl : MOV AL, [0023] ou MOV AL, [23] MOV AX, [0023] ou MOV AX, [23] e) Adressage indirect par registre (IR, BA, X, BXD, BX) : type d’adressage AE Segment Exemples BP BX SI DI SS DS DS DS ou ES indirect (IR) MOV AL, [BP] MOV AL, [BX] MOV AL, [SI] MOV AL, [DI] BP+ dep BX+dep SS DS indirect (BA) avec déplacement MOV AL, [BP] [1000] MOV [BX] [2000], AL SI +dep DI +dep DS DS indexé(X) MOV AL, [SI] [1000] MOV [DI] [1000], AL BP+ SI BP+ DI BX+ SI BX+ DI SS SS DS DS indirect indexé(BX) MOV AL, [BP] [SI] MOV AL, [BP] [DI] MOV AL, [BX] [SI] MOV AL, [BX] [DI] BP+ SI+dep BP+ DI+dep BX+ SI+dep BX+ DI+dep SS SS DS DS indirect (BXD) indexé avec déplacement MOV AL, [BP] [SI] [1000] Remarque : On peut imposer aux pointeurs le segment désiré grâce au préfixe SEG : Expl : SEG ES MOV AL, [BX] ou ES : MOV AL, [BX] AL ou MOV AL, ES : [BX] ( ES : (BX) ) 3.2 Logiciel : (voir tableau logiciel) 4) Interruptions du 8086 Le 8086 peut recevoir 256 interruptions différentes. A chaque interruption est attribué un numéro 0 à 255 appelé type d’interruption. A chaque type correspond un pointeur de 32 bits ( CS et IP ) donnant l’adresse de la procédure à exécuter. type d’interruptions 0 1 2 3 adresses fonctions 00 à 03 04 à 07 08 à 0B 0C à 0F division par 0 pas à pas NMI INT3 La prise en compte d’une interruption provoque la sauvegarde dans la pile du registre d’état et de l’adresse de retour (CS et IP) en décrémentant le contenu de SP et le branchement à un SPI dont l’adresse de début est indiquée par la table d’interruptions. Si n est le type d’une interruption, l’adresse de début du SPI est rangée en mémoire à partir de l’adresse 4 x n ( dans l’ordre : IP bas, IP haut, CS bas puis CS haut ). Remarque : le SPI doit se terminer par l’instruction IRET. 4.1) Interruptions logicielles : Elles sont provoquées par l’instruction INTn. a) Interruptions automatiques: Type 0 : division par 0 Type 1 : pas à pas Type 4 : overflow b) Interruptions logicielles : Type 3 : arrêt du 8086 et affichage sur écran du contenu des registres Type n : INT n 4.2) Interruptions matérielles : Elles parviennent au CPU par les broches NMI et INTR a) Interruption non masquable NMI : Elle est sensible au front montant et provoque un déroutement de type 2. Elle est plus prioritaire que INTR et intervient lors de perte d’alimentation, de détection d’erreur mémoire ou d’erreur de parité sur le bus. b) Interruption masquable INTR : Elle est sensible à un niveau haut. Pour NMI et INTR, le type de l’interruption est généré par le contrôleur d’interruption.. 5) Structure d’un programme assembleur 8086 5.1) Syntaxe des instructions : Les instructions sont codées sur 4 champs : Etiquette : code opération opérandes ou adresses ; commentaire - champ 1 : l’étiquette est optionnelle et elle est constituée de 1 à 31 caractères au maximum. Elle doit être suivie de 2 points si elle précède une instruction sinon pas de 2 points si elle précède une pseudo-instruction (DB, DW, PROC, ENDP, ENDS, SEGMENT, ASSUME, END). L’étiquette commence par une lettre ou par l’un des 3 signes : ? @ - 5.2) Procédures : Les procédures sont le moyen d’implanter les sous-programmes. Un programme peut être écrit sous forme de procédure. A cause de la segmentation, il est nécessaire de distinguer entre les procédures locales se trouvant dans le même segment que le programme appelant et les procédures éloignées où l’on doit changer de segment. Si le sous-programme est dans le même segment que le programme appelant, il est dit NEAR, sinon il est FAR. Structure d’une procédure : Nom procédure PROC Nom procédure RET ENDP FAR/NEAR Appel d’une procédure : CALL Nom procédure Exemple : Code1 Segment Prince Proc Far Call Rech ; appel procédure proche Call Ident ; appel procédure éloignée Ret Prince Endp Rech ; fin de procédure Proc Near Ret Rech Endp Code1 Ends Code2 Segment Ident Proc Far Ret Ident EndP Code2 Ends End Prince ; fin du programme 5.3) Constantes numériques, chaîne de caractères, variables : - a) Constantes numériques : binaire : 0110101B décimal : 65 ou 65D hexadécimal : 72H, 10F2H, 0F4H octal : 34O ou 34Q b)Chaînes de caractères : Définies en apostrophes, chaque caractère sera traduit en code ascii(1 octet par caractère). ‘A’ est équivalent à 41H ‘AG’ 4167H ‘[‘ 5BH c) Variables Différents types : DB : byte, la variable est un octet DW : mot ( 2 octets) DD : 2 mots DQ : 4 mots DT : 10 octets Remarque : après DB, on peut écrire jusqu’à 255 caractères Exemples : Var DB 15D Var DB ? Var DB ‘A’ Var DB 15D, 20H, 11110001B Var DB 10H DUP ( 0 ) 5.4) Segmentation et variables : A l’intérieur d’un segment, les variables sont caractérisées par : - le segment dont elles dépendent - leur adresse à l’intérieur du segment Exemple1 : TABLE Segment T1 DB ‘0123’ T2 TABLE DB ‘ABC’ Ends Seg T1= valeur du segment TABLE Offset de T1=0 Offset de T2= 4 Exemple2 : TABLE Segment AT 80H ORG 8FH T1 DB ‘0123’ T2 TABLE DB ‘ABC’ Ends Seg T1= valeur du segment TABLE= 80H Offset de T1= 8FH Offset de T2 = 93H 5.5) Directive ASSUME Nous avons donné des noms aux segments afin de clarifier la lecture du programme. Il faut maintenant, pour la génération des codes, préciser quels sont les registres de segments. Cette opération est réservée à la directive assume. Exemple : PILE Segment STACK DB 255 DUP (0) PILE Ends TABLE Segment T1 DB ‘0123’ T2 DB ‘ABC’ TABLE Ends Code1 Segment Assume CS : Code1, DS : TABLE, SS :PILE Prince Proc Far Mov AX, TABLE Mov DS,AX Call Rech Ret Prince Endp Rech Proc Near Ret Rech Endp Code1 Ends End Prince 5.6) MACRO : Une macro instruction est un ensemble d’instructions regroupées sous un nom donné Syntaxe : nom macro MACRO ENDM Utilisation : - on l’appelle par son nom - elle doit se situer au début du programme principal - une macro peut en appeler une autre Chapitre 2 Interface parallèle programmable 8255 1) Structure interne et signaux: Données A0 A1 A0 A1 RD RW CS Reset 8086 Adresses A 8255 B Périphérique C commande 8086 3 registres de 8 bits appelé ports : A, B, C 1 registre de commande de 8 bits RD : lecture WR : écriture CS : sélection du 8255 Reset : initialisation A0 et A1 : sélection d’un registre A1 A0 0 0 0 1 1 0 1 1 Registre port A port B port C registre de commande 2) Fonctionnement en mode 0 : - Programmation séparée de chacun des 4 canaux (port A, port B, port C LSB, port C MSB) Le sens de transfert doit être le même à l’intérieur de chaque canal Remarque : pour positionner un bit du port C (bit en sortie) à la valeur 0 ou 1, on envoie dans le registre de commande le mot : 0000 Valeur du bit Code du bit à positionner : PC0 : 000 PC1 : 001 PC7 : 111 Mot de commande : 1 D4 : port A D3 : port Cmsb D1 : port B D0 : port Clsb 0 0 D4 D3 0 D1 0 : sortie 1 : entrée D0 Chapitre 3 : Le contrôleur d’interruption 8259 Le 8259 traite 8 interruptions provenant de périphériques différents. A chaque interruption est associée une entrée d’interruption permettant de classer les périphériques de niveau 0 à 7 par priorité décroissante. Lorsque 2 interruptions se produisent simultanément, celle de plus haute priorité est prise en compte et l’autre est mise en attente jusqu’à l’achèvement de la précédente. De même que le 8086 dispose d’indicateurs autorisant ou interdisant les interruptions à l’aide des instructions STI et CLI, il est possible d’activer ou de désactiver les interruptions de périphériques à l’aide du registre de masque IMR situé à l’adresse du port 21H. Le bit n du registre est positionné à 1 si on veut masquer l’interruption n. Le 8259 permet également qu’une interruption interrompt le processeur lorsque celui-ci traite une autre interruption. Deux registres sont alors utilisés : IRR (Interrupt Request Register) et ISR (Interrupt Service Register) ou le 8259 mémorise l’interruption en attente et celle traitée. L’achèvement de la prise en compte d’une interruption est signalée par le programmeur par une commande de fin d’interruption, ce qui permet le traitement éventuel d’une interruption de niveau inférieur en attente. La fin d’interruption non spécifique est la plus utilisée. Elle se fait en ajoutant à la fin de chaque routine d’interruption, les instructions : MOV AL, 20 OUT 20, AL Remarque : Les interruptions sont vectorisées au niveau du 8259 Entrée d’interruption Type IR0 IR1 IR2 08 09 0A IR7 0F Structure du programme principal et du SPI : PP : Gestion de l’interruption (autorisation de l’interruption au niveau Du 8259 et 8086) Suite du PP SPI : Traitement de l’interruption Fin d’interruption non spécifique STI IRET Exemple : IR2 (Type 0A) PP : IN AL, 21 AND AL, FB OUT 21, AL STI Gestion de l’interruption Suite du PP SPI : 1C02 : 0400 Traitement de l’interruption MOV AL, 20 OUT 20, AL STI IRET A x 4= 28h 00028 00029 0002A 0002B 00 04 02 1C Fin d’interruption non spécifique