Changes between Version 98 and Version 99 of Archi-1-TP9


Ignore:
Timestamp:
Dec 10, 2020, 10:42:20 PM (4 years ago)
Author:
heydeman
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v98 v99  
    140140'''''''''''''''
    141141}}}
    142 1. Un problème avec le code précédent 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. Il est préférable d'utiliser une étiquette pour désigner cette adresse : on suppose désormais que l'adresse du premier registre du `TTY`  se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, mais il ne connaît que le symbole.
    143 
    144 Pour écrire `'x'` sur le terminal 0, nous pouvons utiliser la macro `la $r, label`. Cette macro instruction est remplacée lors de l'assemblage du code par une suite composée de deux instructions `lui` et `ori`. Il existe aussi la macro instruction `li` qui demande de charger une valeur sur 32 bits dans un registre. Pour être plus précis, les macro-instructions
     1421. Un problème avec le code précédent 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. Il est préférable d'utiliser une étiquette pour désigner cette adresse : on suppose désormais que l'adresse du premier registre du `TTY`  se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, mais il ne connaît que le symbole. Ainsi, pour écrire `'x'` sur le terminal 0, nous devons utiliser la macro instruction `la $r, label`. Cette macro-instruction est remplacée lors de l'assemblage du code par une suite composée de deux instructions `lui` et `ori`. Il existe aussi la macro instruction `li` qui demande de charger une valeur sur 32 bits dans un registre. Pour être plus précis, les macro-instructions
    145143{{{#!asm
    146144la $r, label
     
    164162'''''''''''''''
    165163}}}
    166 1. En assembleur pour sauter à une adresse de manière inconditionnelle, on utilise les instructions `j label` ou `jr $r`, peuvent-elles faire les choses ?
    167 {{{#!protected ------------------------------------------------------------------------------------
    168 '''''''''''''''
    169 * Presque, mais pas tout à fait
    170   - `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.
    171   - `jr $r` effectue un vrai saut absolu puisqu’elle fait `PC ← $r`
    172  Autrement dit, si l’on veut aller n'importe où en mémoire, il faut utiliser `jr`.
     1641. En assembleur pour sauter à une adresse de manière inconditionnelle, on utilise les instructions `j label` et `jr $r`. Ces instructions permettent dd'effeectuer un saut à n'importe quelle adresse ?
     165{{{#!protected ------------------------------------------------------------------------------------
     166'''''''''''''''
     167*
     168  - `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 + (label<<2)&0x0FFFFFFF)`. Les 4 bits de poids forts du `PC` sont conservés, le saut est bien relatif au PC.
     169  - A l'inverse, `jr $r` effectue un saut absolu puisque cette instruction réalise `PC ← $r`
     170 Autrement dit, si l’on veut aller exécuter du code n'importe où en mémoire, il faut utiliser `jr`.
    173171'''''''''''''''
    174172}}}