Chapitre VI Programmation de l’Ordinateur de Base Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 1 / 37 Le langage machine Le langage machine Les programmes pour un ordinateur peuvent être écrits dans multiples langages. Les langages de programmation peuvent se diviser en quatre catégories: 1 2 3 4 Le code binaire. Il s’agit d’une séquence d’instructions et d’opérandes représentés sous forme binaire, reflétant le contenu exact de la mémoire de l’ordinateur. Le code octal ou hexadécimal. Ceci est une transcription équivalente du code binaire en une représentation hexadécimale ou octale. Code symbolique. Ici, chaque instruction est représentée par un ou plusieurs symboles codes. Un compilateur est alors nécessaire pour transcrire chaque instruction en une instruction codée en binaire à être exécutée par l’ordinateur. Langages de programmation à un niveau plus élevé. Dans ces langages, chaque instruction peut être transcrite par le compilateur en une séquence de plusieurs instructions codées en binaire. Le C, le Java, le Fortran en sont des exemples. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 3 / 37 Le langage machine Example 1 (Addition de deux nombres). Voici un programme qui additionne deux nombres écrits dans les quatre types de langages de programmation. Programme binaire Programme hexadécimal Programme symbolique Programme Fortran Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 4 / 37 Le langage machine Dans ce chapitre, nous allons utiliser les mêmes 25 instructions que celles de l’ordinateur de base du Chapitre 5. Ces instructions sont récapitulées dans la Table 5-2 de votre manuel (page 133) et sont aussi redéfinies dans la Table 6-1 du manuel (page 175), où: le symbole m est utilisé pour dénoter l’adresse effective, le symbole M est utilisé pour se référer au mot de la mémoire qui se trouve à l’adresse effective m. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 5 / 37 Le langage machine Table 1: Instructions de l’ordinateur Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 6 / 37 Le langage machine Langage machine. Un programme en langage machine est représenté en forme binaire, octale, ou hexadécimale (de la première ou de la deuxième catégorie). Aucune transcription (compilateur) n’est nécessaire pour exécuter un programme en langage machine. Langage assembleur. Un programme écrit en langage assembleur est un programme symbolique (de la catégorie 3). Le compilateur qui transcrit du langage assembleur en code binaire est appelé un assembleur. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 7 / 37 Le langage machine Example 2 (Addition de deux nombres). Programme symbolique Programme en assembleur Les programmes en assembleur sont plus pratiques à utiliser que les programmes symboliques ordinaires, car ils permettent à l’utilisateur de: représenter une adresse hexadécimale avec une adresse symbolique, et représenter un opérande hexadécimal avec un opérande décimal. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 8 / 37 Langage assembleur Langage assembleur Pratiquement chaque microprocesseur/ordinateur possède son propre langage assembleur. Les règles de l’écriture en langage assembleur sont documentées et publiées dans les manuels de chaque microprocesseur. Ici, nous utiliserons un langage assembleur qui est particulier à l’ordinateur de base décrit dans le chapitre 5. Dans ce qui suit, nous allons formuler les règles de ce langage assembleur. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 9 / 37 Langage assembleur Règles du langage assembleur Règles du langage assembleur Chaque ligne d’un programme en assembleur est arrangée en 3 colonnes, appelées champs: [étiquette,] instruction [/commentaire] 1 2 3 Le champ étiquette peut être vide, ou peut spécifier une adresse symbolique. Le champ instruction spécifie une instruction machine, ou une pseudo-instruction. Le champ commentaire peut être vide, ou peut contenir un commentaire. Une adresse symbolique, dans le champ étiquette, consiste en une lettre suivie d’un, deux ou aucuns caractères alphanumériques. Le champ instruction peut spécifier: 1 2 3 Une instruction référencée à la mémoire (MRI) Une instruction référencée à un registre, ou une instruction d’entrée/sortie (non-MRI) Une pseudo-instruction avec ou sans opérande Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 10 / 37 Langage assembleur Règles du langage assembleur Une instruction référencée à la mémoire consiste en deux ou trois symboles séparés par des espaces: opcode-symbole adresse-symbolique [I] L’opcode-symbole est un symbole de trois lettres qui définit une opération MRI de la Table 1. Le second code est une adresse symbolique. Le troisième symbole est optionnel. Si présent, c’est la lettre “I”. La présence de “I” dans une MRI dénote une instruction à adressage indirect, tandis que son absence dénote une instruction à adressage direct. Une instruction non-MRI est désignée par l’un des symboles de 3 lettres de la Table 1 et représente une instruction référencée à un registre, ou bien une instruction d’entrée/sortie. Example 3. Voici des exemples de symboles qui peuvent être placés dans le champ instruction. CLA non-MRI ADD OPR adressage direct MRI ADD PTR I adressage indirecte MRI Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 11 / 37 Langage assembleur Règles du langage assembleur Une pseudo-instruction n’est pas une instruction machine, et donc elle n’est pas transcrite en une instruction codée par l’assembleur. Une pseudo-instruction est plutôt une instruction qui donne à l’assembleur de l’information sur une instruction particulière dans le programme. Nous supposerons que l’assembleur défini dans ce chapitre supporte les quatre pseudo-instructions qui se trouvent dans la Table 2. Table 2: Définitions de pseudo-instructions Symbole ORG N END DEC N HEX N Information pour l’assembleur Le nombre hexadécimal N est la location mémoire de l’opérande ou de l’instruction qui se trouve à la prochaine ligne Dénote la fin du programme symbolique N est un nombre décimal signé à être converti en binaire N est un nombre hexadécimal signé à être converti en binaire Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 12 / 37 Langage assembleur Règles du langage assembleur ORG (origin): informe l’assembleur que l’instruction ou l’opérande dans la ligne qui suit est placé à la location mémoire spécifiée par le nombre hexadécimal écrit à droite de ORG. Il est possible d’utiliser ORG plus d’une fois dans un programme pour spécifier plus d’un segment en mémoire. Le symbole END informe l’assembleur que le programme est terminé. DEC N et HEX N spécifient la base de N. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 13 / 37 Langage assembleur Règles du langage assembleur Example 4 (Soustraction de deux nombres). Table 3: Programme en langage assembleur pour faire la soustraction de deux nombres Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 14 / 37 Langage assembleur Transcription en binaire Transcription en binaire Pour qu’un programme soit exécuté par n’importe quel ordinateur, il doit être converti en code machine qui soit propre à cet ordinateur par un compilateur approprié. Un assembleur est un compilateur qui transcrit chaque instruction écrite en assembleur en son équivalent binaire. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 15 / 37 Langage assembleur Transcription en binaire Example 5. La transcription du programme écrit en assembleur de la soustraction de deux nombres (présenté dans l’exemple précédent) en son équivalent en code machine est montrée dans la table suivante. Table 4: Transcription en code machine du programme de soustraction de deux nombres Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 16 / 37 Langage assembleur Passes de compilation Passes de compilation La compilation d’un programme écrit en assembleur vers un code machine par l’assembleur s’accomplit en deux passages (parcours du programme). Pendant le premier passage: une location mémoire (adresse) est assignée à chaque instruction et opérande (ORG et END n’ont pas d’assignations mémoire, car ce sont des pseudo-instructions). une table de symboles d’adresses définissant les adresses en hexadécimal de chaque adresse symbolique est construite. Par exemple, la table des symboles d’adresses du programme de l’exemple précédent est montrée ci-dessous: Symbole d’Adresses MIN SUB DIF Adresse Hexadécimale 106 107 108 Aucun code d’instruction n’est créé lors du premier passage. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 17 / 37 Langage assembleur Passes de compilation Lors du second passage du programme en assembleur: la table des symboles d’adresses formée au premier passage est utilisée pour déterminer la valeur de l’adresse de chaque instruction. un code complet est créé pour chaque instruction. Example 6. L’instruction LDA SUB est transcrite lors du second passage en code binaire en: examinant l’opcode hexadécimal de l’opération LDA de la table Table 1 ⇒ 2, déterminant la valeur hexadécimale de l’étiquette SUB à partir de la table des symboles d’adresses formée lors du premier passag ⇒ 107, et remettant le bit 15 du code de l’instruction à 0, puisque l’instruction est une adresse directe MRI (la lettre “I” n’est pas présente) Le code complet de l’instruction en hexadécimal est alors formé en “assemblant” les segments ci-dessus ⇒ 2107 Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 18 / 37 Boucles de programme Boucles de programme Considérez le programme Fortran suivant, qui fait l’addition de 100 entiers, et range le résultat dans un mot de la mémoire. 3 DIMENSION A(100) INTEGER SUM, A SUM = 0 DO 3 J=1, 100 SUM = SUM + A(J) Il est possible d’écrire un programme assembleur qui fait la même chose. Le programme est montré dans la Table 5. Les entiers qu’il faut ajouter sont ranges dans des locations mémoire consécutives, à partir de l’adresse (150)16 (ligne (19)10 du code). Les initialisations de variables sont faites aux lignes (13)10 jusqu’à (17)10 du code. La partie “boucle” du programme se trouve entre aux lignes (7)10 jusqu’à (10)10 du code. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 19 / 37 Boucles de programme Table 5: Programme en assembleur pour ajouter 100 nombres Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 20 / 37 Programmation des opérations logiques et arithmétiques Programmation des opérations logiques et arithmétiques Les opérations qui ne sont pas incluses dans l’ensemble des instructions machine doivent être implémentées par un programme. Les opérations qui peuvent être effectuées par une unique instruction machine sont dites implémentées en matériel. Les opérations qui sont faites par un programme (un ensemble d’instructions) sont dites implémentées en logiciel. L’implémentation en matériel est plus coûteuse que l’implémentation en logiciel, mais l’exécution des opérations est plus rapide. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 21 / 37 Programmation des opérations logiques et arithmétiques Programme de multiplication Programme de multiplication L’ordinateur qui a été conçu au chapitre 5 ne contient pas d’instructions pour effectuer une multiplication. Par conséquent, une implémentation logicielle est nécessaire pour donner à l’ordinateur la capacité de multiplier deux nombres. Pour simplifier l’implémentation logicielle de l’opération de multiplication de l’ordinateur de base, on suppose que les deux opérandes sont non signés, et qu’ils n’ont pas plus de 8 bits significatifs, de façon à ce que le produit ne dépasse pas la capacité de 16 bits significatifs. Le schéma de la Figure 1 montre la procédure suivie pour l’implémentation logicielle de l’opération de multiplication. Le programme en assembleur de la multiplication est montré dans la Table 6. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 22 / 37 Programmation des opérations logiques et arithmétiques Programme de multiplication Figure 1: Schéma du programme de multiplication Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 23 / 37 Programmation des opérations logiques et arithmétiques Programme de multiplication Table 6: Programme de multiplication de deux nombres positifs Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 24 / 37 Programmation des opérations logiques et arithmétiques Addition en précision double Addition en précision double Pour augmenter la précision de l’addition, les opérandes peuvent être rangés dans deux mots de mémoire ou plus, au lieu de seulement un. Un nombre rangé dans deux mots de la mémoire est dit avoir une précision double. Lorsque des opérandes en précision double sont utilisés pour effectuer certaines opérations, ils doivent être traités d’une manière spéciale. Un programme en assembleur qui additionne deux nombres en précision double est montré dans la Table 7. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 25 / 37 Programmation des opérations logiques et arithmétiques Addition en précision double Table 7: Programme pour additionner deux nombres en précision double Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 26 / 37 Programmation des opérations logiques et arithmétiques Opérations logiques Opérations logiques Une opération logique peut aussi être implémentée en logiciel si elle n’est pas supportée directement par l’ALU. Par exemple, l’ALU de l’ordinateur de base ne possède pas d’implémentation matérielle de l’opération OU, mais supporte matériellement les opérations ET et NON. Puisque (x ∨ y ) peut s’exprimer aussi comme (x 0 ∧ y 0 )0 , l’opération OU peut être implémentée en logiciel. Un programme symbolique qui fait cela est montré ci-dessous. LDA A CMA STA TMP LDA B CMA AND TMP CMA Charger le premier opérande A Complémenter pour obtenir A’ Ranger A’ dans une location temporaire Charger le deuxième opérande B Complémenter pour obtenir B’ Ajouter à A’ pour obtenir (x 0 ∧ y 0 )0 Complémenter pour obtenir (x ∨ y ) Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 27 / 37 Programmation des opérations logiques et arithmétiques Opérations de décalage Opérations de décalage L’ordinateur de base possède une implémentation matérielle de décalage circulaire. Une opération de décalage à droite peut être réalisée en logiciel par les instructions suivantes: CLE CIR Une opération de décalage à gauche peut être réalisée en logiciel par les instructions suivantes: CLE CIL Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 28 / 37 Programmation des opérations logiques et arithmétiques Opérations de décalage Une opération de décalage à droite arithmétique peut être réalisée en logiciel par les instructions suivantes: CLE SPA CME CIR /Mettre E à 0 /Sauter l’instruction suivante si AC > 0; E reste 0 /AC < 0; mettre E à 1 /Décalage circulaire de E et AC Example 7 (Décalage arithmétique à gauche). Ecrivez un programme en assembleur qui implémente une opération de décalage arithmétique à gauche. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 29 / 37 Sous-routines Sous-routines Appeler une sous-routine dans un programme se fait en utilisant l’instruction BSA. Pour illustrer comment utiliser l’instruction BSA dans ce contexte, une sous-routine qui multiplie le contenu de AC par 16 (en décalant AC de 4 bits vers la gauche) est montré dans la Table 8. La sous-routine est appelée deux fois dans le programme. Une fois à la ligne (101)16 et une autre fois a la ligne (104)16 . Lorsque la première instruction BSA est exécutée pour appeler la sous-routine SH4, l’unité de contrôle range l’adresse de retour 102 à l’adresse définie symboliquement par SH4 (c’est à dire = (109)16 ). L’unité de contrôle place aussi la valeur SH4+1 (= (10A)16 ) dans le compteur de programme PC pour commencer l’exécution de la sous-routine. La dernière instruction de la sous-routine, à la location (10F )16 (appelée l’instruction de retour de la sous-routine) exécute un embranchement inconditionnel indirect vers la location (102)16 . BSA est appelée l’instruction d’appel de la sous-routine. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 30 / 37 Sous-routines Table 8: Programme pour montrer l’utilisation de sous-routines Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 31 / 37 Programmation pour les entrées/sorties Programmation pour les entrées/sorties La Table 9(a) montre les instructions nécessaires pour entrer un caractère, l’afficher, et ensuite le ranger en mémoire. La Table 9(b) montre les instructions nécessaires pour afficher un caractère qui est initialement rangé en mémoire. Table 9: Programmes pour l’entrée/sortie d’un caractère Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 32 / 37 Programmation pour les entrées/sorties Manipulation de caractères Manipulation de caractères Le programme de la Table 10 montre une sous-routine appelée IN2 qui entre deux caractères de 8 bits chacun, et les assemble en un mot de 16 bits. Table 10: Sous-routine pour entrer et assembler deux caractères Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 33 / 37 Programmation pour les entrées/sorties Manipulation de caractères Le programme de la Table 11 utilise la sous-routine IN2 pour entrer une chaı̂ne de caractères du clavier, assembler deux caractères en un mot, et ranger le tout dans un tampon qui débute à l’adresse (500)16 de la mémoire. Table 11: Programme pour ranger des caractères d’entrée dans un tampon Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 34 / 37 Programmation pour les entrées/sorties Interruptions de programme Interruptions de programme Le système d’interruptions permet au programme de se dérouler jusqu’à ce qu’un appareil d’entrée/sortie lève son drapeau. Lorsqu’un appareil est mis à 1, l’ordinateur termine l’exécution de l’instruction en cours puis se focalise sur l’interruption, en: 1 2 Rangeant l’adresse de retour à la location 0 de la mémoire Exécuter l’instruction à la location 1, qui est un embranchement inconditionnel vers l’adresse de base de la routine de service. La routine de service doit contenir des instructions pour effectuer les taches suivantes: 1 2 3 4 5 6 Sauvegarder le contenu des registres du processeur (AC et E de cet ordinateur de base) Vérifier quel drapeau d’entrée/sortie est levé S’occuper de l’appareil dont le drapeau est levé Restaurer le contenu des registres du processeur Réactiver le système d’interruption Retourner au programme interrompu Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 35 / 37 Programmation pour les entrées/sorties Interruptions de programme Un exemple de programme qui s’occupe d’une interruption est montré dans la Table 12. La location 0 est réservée pour l’adresse de retour. La location 1 contient un embranchement inconditionnel direct vers la routine de service SRV. Le programme principal débute à la location (100)16 de la mémoire. La routine de service débute à la location (200)16 de la mémoire. Le programme principal contient une instruction “ION” au tout début, pour activer le système d’interruptions. Le circuit d’interruption est éteint dans le matériel par la micro-operation RT2 : IEN ← 0 juste avant l’exécution de la routine de service des interruptions. Il est donc important de réactiver le système d’interruptions juste avant la fin de la routine de service. Ceci se fait dans le logiciel en incluant l’instruction “ION”. Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 36 / 37 Programmation pour les entrées/sorties Interruptions de programme Table 12: Programme pour s’occuper d’une interruption Wail Gueaieb (Université d’Ottawa) CEG2536: Architecture des Ordinateurs I Automne 2007 37 / 37