III - PROGRAMMATION EN ASSEMBLEUR
Transcription
III - PROGRAMMATION EN ASSEMBLEUR
III - PROGRAMMATION EN ASSEMBLEUR 3.1 Introduction à la programmation en assembleur Pour programmer un ordinateur on utilise généralement des langages dits évolués ou de haut niveau : C, C++, Java, Basic, Fortran, Pascal, Ada, Assembleur, etc. Cependant l'unité centrale ne peut exploiter que les instructions machine: Les codes binaires qui sont chargés dans le registre instruction. Le terme de langage désigne un jeu d'instructions et de règles syntaxiques. A l'aide d'un langage évolué le programmeur écrit un code source. Celui-ci n'est pas directement exécutable par l'ordinateur. Il faut le traduire en code machine ou code objet. C'est le rôle des compilateurs ou assembleurs et des interpréteurs. Un interpréteur ne produit pas de code objet il traduit les instructions directement au fur et à mesure de l'exécution du programme. La figure suivante schématise les différents niveaux de programmation. Lorsque l'utilisateur peut accéder au niveau de la microprogrammation la machine est dite microprogrammable. Exemple : l’opération simple réalisée par un microprocesseur (bus données 8 bits et bus adresses 16 bits) 28+56=84 Charger la valeur 28 dans l’accumulateur Additionner la valeur 56 au contenu de l’accumulateur, le résultat reste dans l’accumulateur Ranger la somme, contenue dans l’accumulateur, dans la cellule mémoire d’adresse M TRADUCTION EN LANGAGE « TÉLÉGRAPHIQUE » 1. 2. 3. CHARGEMENT ACCUMULATEUR,2810 ADDITION ACCUMULATEUR, 5610 RANGEMENT MÉMOIRE M, ACCUMULATEUR Réduction 1. LOAD A, 2810 2. ADD A, 5610 3. STO M, A Mnémonique facile à retenir Si on donne l’adresse en mémoire M=2050 1. LOAD A, 2810 2. ADD A, 5610 3. STO 205010, A Incompréhensible par le microprocesseur. Donc traduire cela en binaire Le fabricant donne la liste des instructions mnémoniques et le code binaire correspondant. Mnémonique ANA M Opération Faire une opération logique AND entre le contenu de l’adresse mémoire M et le contenu de l’accumulateur A Code binaire 10100110 Nbre de microcycles 7 Si l’horloge = 2 Mhz cette instruction demande t=0.5x10-6x7=3.5 micro-secondes Supposons les codes des opérations 0011 1110 pour LOAD A 1100 0110 pour ADD A 0111 0111 pour STO M,A Transformons les données et adresses en binaire : 0001 1100 2810 0011 1000 5610 et l’adresse 0000 1000 0000 0010 205010 Le programme complet devient : Numéro d’ordre de l’instruction Instruction 1 Code opération 0011 1110 Opérande ou adresse 0001 1100 2 1100 0110 0011 1000 3 0111 0111 0000 1000 0000 0010 En hexadécimal Numéro d’ordre de l’instruction Instruction 1 Code opération 3E Opérande ou adresse 1C 2 C6 38 3 77 0802 Le traducteur du code mnémonique au code numérique s’appelle l’assembleur Le retour du numérique vers le mnémonique s’appelle le désassemblage 3.2 Structures des instructions au niveau machine Format des instructions Les ordinateurs sont capables d'effectuer un certain nombre d'opérations élémentaires. Une instruction au niveau machine doit fournir à l'unité centrale toutes les informations nécessaires pour déclencher une telle opération élémentaire : type d'action, où trouver le ou les opérandes, où ranger le résultat, etc. C'est pourquoi une instruction comporte en général plusieurs champs ou groupes de bits. Le premier champ contient le code opération. Les autres champs peuvent comporter des données ou l'identification des opérandes. La figure 10 donne quelques exemples d'instructions à n adresses, pour n = 0, 1 et 2. Sur certaines machines les instructions sont toutes de même longueur, sur d'autres cette longueur peut varier avec le code opération ou le mode d'adressage. On distingue six groupes d'instructions : • transferts de données : de mémoire à registre, de registre à registre, de registre à mémoire; • opérations arithmétiques : addition, soustraction, multiplication et division; • opérations logiques : ET, OU inclusif, NON, OU exclusif, etc.; • contrôle de séquence : branchements conditionnels ou non, appel de procédure, etc.; • entrées/sorties; • manipulations diverses : décalage, conversion de format, permutation circulaire des bits, échange d'octets, incrémentation, etc. Le choix de la longueur et du format des instructions est une étape très importante dans la conception d'une nouvelle architecture. C'est encore une affaire de compromis. La longueur des instructions se répercute sur la dimension de la mémoire centrale donc sur le coût : il faut deux fois plus de bits pour stocker un programme de n instructions de 32 bits qu'un programme de n instructions de 16 bits. Exemple: M68HC12 Une instruction Label (étiquette) Exemple: Opcode LDX 4 champs Champs du code source Opérande $F682 Commentaire ; Faire appel à getchar a- champ label ou étiquette ( n caractères ) b- champ opération (code d'instruction) c- champ opérande (soit l'opérande ou son adresse) d- champ commentaires (commence par ; ) 3.3 Exemple de machine microprogrammée Soit la machine suivante, qu'on appellera MP3531 Architecture de la machine MP3531 Description : – Tous les nombres/adresses sont en décimal (pas hexa), – Un “octet” (byte) est constitué de 2 chiffres décimaux, – Une adresse, ou mot, est constituée de 2 octets (4 chiffres décimaux), ainsi les adresses vont de 00 00 à 99 99. – Un bit est soit vrai soit faux. – La mémoire est adressable par octets (chaque unité de mémoire contient un octet). Description des composantes du MP3531 PC (mot) : Compteur de programme (Program Counter), registre d’un mot mémoire contenant l’adresse de la prochaine instruction à exécuter. opCode (octet) : registre d’instruction (parfois dénoté par IR), contient l’OPCODE de l’instruction en cours. opAddr (mot) : L’opérande de l’instruction en cours d’exécution. L’opérande test une toujours une adresse. Certaines instructions nécessitent la valeur contenue à l’adresse indiquée ; cette valeur n’est pas transférée par le cycle de transfert de base, mais doit être transférée par l’opération elle même lors de l’exécution (voir étape 3 du cycle de transfert ainsi que la description de chacune des instructions ci-bas). MDR (octet) : registre donnée mémoire (Memory Data Register). Une donnée transférée (read/loaded) de la mémoire vers le processeur est toujours placée dans le registre de donnée. De même, une donnée transférée du processeur vers la mémoire (stored) doit être placée dans le registre de donnée. MAR (mot) : registre adresse mémoire (Memory Address Register). Ce registre contient l’adresse mémoire à partir de laquelle une donnée doit être lue ou vers laquelle elle doit être écrite. A (octet) : Accumulateur. Toutes les opérations arithmétiques utilisent ce registre comme opérande et aussi pour sauver leur résultat. H (bit) : le bit de statut “Halt”. Ce bit est mis-à -jour par l’instruction “halt” (hlt). Si ce bit est vrai, le processeur s’arrête lorsque l’opération courante est terminée. N (bit) : le bit de statut “Négative”. Les opérations arithmétiques affectent la valeur vraie à ce bit lorsqu’elles produisent un résultat négatif. Certaines opérations n’affectent pas la valeur de ce bit, ainsi sa valeur ne reflète pas toujours l’état courant de l’accumulateur. Z (bit) : le bit de statut “Zéro”. Les opérations arithmétiques affectent la valeur vraie à ce bit lorsqu’elles produisent le résultat zéro. Certaines opérations n’affectent pas la valeur de ce bit, ainsi sa valeur ne reflète pas toujours l’état courant de l’accumulateur. RW (bit) : le bit de statut “READ/WRITE”. Si sa valeur est vraie, signifie qu’une donnée sera lue (fetched) de la mémoire et transférée dans le registre MDR de l’unité centrale. Si faux, signifie qu’une donnée sera transférée du registre MDR vers la mémoire. Jeu d'instruction du MP3531 Instructions sans opérande (08) CLA : “clear accumulator”, met à zéro le registre accumulateur, (10) INC : “increment”, ajoute 1 au contenu de l’accumulateur, (64) HLT : “halt”, met le bit de statut H à vrai. Instructions ayant un opérande (91) LDA x : “load”, copie dans l’accumulateur la valeur contenue à l’adresse x de la mémoire, (39) STA x : “store”, copie le contenu de l’accumulateur à l’adresse x de la mémoire, (99) ADD x : copie la valeur se trouvant à l’adresse x et l’additionne au contenu de l’accumulateur, (61) SUB x : copie la valeur se trouvant à l’adresse x et soustrait cette valeur du contenu de l’accumulateur, (01) DSP x : “display”, copie le contenu de l’adresse x et affiche à l’écran. Cette instruction n’est pas représentative de la réalité, les opérations d’entrée/sortie son très complexes. (15) JMP x : “jump to” (“goto”), branchement inconditionnel (absolue), la prochaine instruction exécutée est celle à l’adresse x. (17) JZ x : branchement vers x seulement si le bit de statut Z est vrai. (19) JN x : branchement vers x seulement si le bit de statut N est vrai. Exemple Afin d’ajouter 1 à la valeur x et de sauver le résultat dans y (y = x +1). – Charger la valeur de x dans l’accumulateur, registre A. – Incrémenter la valeur de l’accumulateur, – Sauver la valeur qui se trouve dans l’accumulateur à l’adresse y. Ceci implique 3 instructions machines : 91 : load 10 : incrémente 39 : store Si x désigne l’adresse 27 96 et y désigne l’adresse 91 27, alors y = x + 1 peut s’écrire en langage machine comme suit : [91 27 96] [10] [39 91 27] (en réalité 91 27 96 10 39 91 27) Exercice Que fait la partie du programme suivante ? en sachant que le jeu d'instruction du microprocesseur est celui du MP3531, donner le programme source en assembleur. Code objet: 08 39 00 44 91 00 42 61 00 43 19 00 29 39 00 46 91 00 44 10 Code source:?