Changes between Version 57 and Version 58 of Archi-1-TP9


Ignore:
Timestamp:
Dec 4, 2020, 3:43:47 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v57 v58  
    133133'''''''''''''''
    134134}}}
    135 1. Le problème est que l'adresse du `TTY` est un choix de l'architecte du prototype et s'il décide de placer le `TTY` ailleurs dans l'espace d'adressage, il faudra réécrire le code précédent. Nous allons utiliser une étiquette, supposons que l'adresse du premier registre du `TTY`  se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, il ne connait que le symbole. Si nous voulons toujours écrire `'x'` sur le terminal 0. Nous allons utiliser la macro `la $r, label` qui est remplacée par les deux instructions `lui` et `ori`. Pour être plus précis
     1351. Le problème est que l'adresse du `TTY` est un choix de l'architecte du prototype et s'il décide de placer le `TTY` ailleurs dans l'espace d'adressage, il faudra réécrire le code précédent. Nous allons utiliser une étiquette, supposons que l'adresse du premier registre du `TTY`  se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, il ne connaît que le symbole. Si nous voulons toujours écrire `'x'` sur le terminal 0. Nous allons utiliser la macro `la $r, label` qui est remplacée par les deux instructions `lui` et `ori`. Il existe aussi la macro `li` pour initialiser des valeurs 32bits dans un registre. Pour être plus précis, les instructions
    136136{{{#!asm
    137137la $r, label
     138li $r, 0x87654321
    138139}}}
    139  est remplacé par
     140 sont remplacés par
    140141{{{#!asm
    141142lui $r, label>>16
    142143ori $r, $r, label & 0xFFFF
    143 }}}
    144  Réécrivez le code précédent en utilisant `la`
     144lui $r, 0x8765
     145ori $r, $r, 0x4321
     146}}}
     147 Réécrivez le code de la question précédente en utilisant `la` et `li`
    145148{{{#!protected ------------------------------------------------------------------------------------
    146149'''''''''''''''
    147150{{{#!asm
    148151la    $4, __tty_regs_map
    149 ori   $5, 'x'
     152li    $5, 'x'
    150153sb    $5, ($4)
    151154}}}
    152155'''''''''''''''
    153156}}}
     1571. En assembleur pour sauter à une adresse de manière inconditionnelle, on utilise les instructions `j label` ou `jr $r`, peuvent-elles faire les choses ?
     158{{{#!protected ------------------------------------------------------------------------------------
     159'''''''''''''''
     160* Presque, mais pas tout à fait
     161  - `j label` effectue en fait un saut relatif au `PC` puisqu’elle fait `PC ← PC&0xF0000000 + (label<<2)&0x0FFFFFFF)`. Les 4 bits de poids forts du `PC` sont conservés.
     162  - `jr $r` effectue un vrai saut absolu puisqu’elle fait `PC ← $r`
     163 Autrement dit, si l’on veut aller n'importe où en mémoire, il faut utiliser `jr`.
     164'''''''''''''''
     165}}}
     1661. Vous avez utilisé les directives `.text` et `.data` pour définir la section où placer les instructions et les v ?
     167{{{#!protected ------------------------------------------------------------------------------------
     168'''''''''''''''
     169*
     170'''''''''''''''
     171}}}
     172
     173
     174
    154175== A3. Chaîne de compilation
    155176
     
    465486
    466487
    467 
    468488== 5. Premier petit pilote pour le terminal
    469489