Changes between Version 144 and Version 145 of Archi-1-TP9


Ignore:
Timestamp:
Nov 21, 2021, 8:43:24 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v144 v145  
    143143{{{#!protected ------------------------------------------------------------------------------------
    144144''
     145Cours 9 / slide 10\\\\
    145146Ce qu'il faut bien comprendre, c'est que l'adresse du registre TTY_WRITE est l'adresse d'une __sortie du SoC__, ce n'est pas une mémoire à proprement parler. Il est d'ailleurs interdit de lire à cette adresse. Pour écrire un message à l'écran, il faut écrire tous les caractères du message à cette adresse (0xD0200000). En principe, entre chaque écriture, il faut attendre un peu que le caractère précédent soit parti, parce que le débit du port de sortie matériel (USB par exemple) est beaucoup plus lent que ce que peut faire le processeur. Dans notre cas, c'est un simulateur de SoC et les caractères sont envoyés vers un terminal sans délai. Dans ce cas, il n'est pas nécessaire d'attendre.
    146147{{{#!asm
     
    166167 Réécrivez le code de la question précédente en utilisant `la` et `li`
    167168{{{#!protected ------------------------------------------------------------------------------------
    168 '''''''''''''''
     169''
     170Cours 9 / slide 19
    169171{{{#!asm
    170172la    $4, __tty_regs_map
     
    172174sb    $5, 0($4)
    173175}}}
    174 '''''''''''''''
     176''
    175177}}}
    1761781. En assembleur pour sauter à une adresse de manière inconditionnelle, on utilise les instructions `j label` et `jr $r`. Ces instructions permettent-elles d'effectuer un saut à n'importe quelle adresse ?
    177179{{{#!protected ------------------------------------------------------------------------------------
    178 '''''''''''''''
    179 *
    180   - `j label` malgré sa forme assembleur effectue un saut relativement au `PC` puisque le `label` n'est pas entièrement encodé dans l'instruction binaire (cf. cours sur les sauts). Cette instruction réalise : `PC ← (PC & 0xF0000000) | (ZeroExtend(label, 32) << 2)`. Les 4 bits de poids forts du `PC` sont conservés, le saut est bien relatif au PC (ZeroExtend désigne ici le fait d'étendre le label sur 32 bits en ajoutant des zéros en tête, à changer s'il y a une meilleure syntaxe).
    181   - A l'inverse, `jr $r` effectue un saut absolu puisque cette instruction réalise `PC ← $r`
    182  Autrement dit, si l’on veut aller exécuter du code n'importe où en mémoire, il faut utiliser `jr`.
    183 '''''''''''''''
     180''
     181La réponse n'est pas dans le cours, mais dans la connaissance du codage des instructions de saut (**`j`**ump et **`b`**ranch). Il faut avoir compris que l'instruction **`j`** et toutes les branchements (**`bne`**, **`beq`**, etc.) sont relatives au PC. Il n'est pas possible d'aller n'importe où dans l'espace d'adressage.
     182* `j label` malgré sa forme assembleur effectue un saut relativement au **`PC`** puisque le **`label`** n'est pas entièrement encodé dans l'instruction binaire (cf. cours sur les sauts). Cette instruction réalise :\\**`PC ← (PC & 0xF0000000) | (ZeroExtended(label, 32) << 2)`**\\Les 4 bits de poids forts du **`PC`** sont conservés, le saut est bien relatif au PC\\(`ZeroExtended` désigne ici le fait d'étendre le label sur 32 bits en ajoutant des zéros en tête).\\ Autrement dit, si **`j label`** est à l'adresse **`PC`**, l'adresse **`label`** doit avoir le même chiffre de poids fort (en hexa décimal), c'est-à-dire les mêmes 4 bits de poids fort en binaire). Sinon l'assembleur provoque une erreur lors du codage.
     183* A l'inverse, **`jr $r`** effectue un saut absolu puisque cette instruction réalise **`PC ← $r`**
     184
     185Autrement dit, si l’on veut aller exécuter du code n'importe où en mémoire, il faut utiliser **`jr`**.
     186''
    184187}}}
    1851881. Vous avez utilisé les directives `.text` et `.data` pour définir les sections où placer les instructions et les variables globales, mais il existe la possibilité de demander la création d'une nouvelle section dans le code objet produit par le compilateur avec la directive `.section name,"flags"`