samedi 20 avril 2019

Les registres suite : autres registres


2 registres :

L’Ingénieur vit que le registre r0 s’ennuyait et il créa donc un deuxième registre qu’il appelât r1.
Ce nouveau registre peut faire tout ce que nous vu pour le registre r0 mais il peut aussi transférer sa valeur dans r0 ou recevoir la valeur de r0.
Exemple : On peut lui donner la valeur de r0 :
Mov r0,#10
Mov r1,r0
Et on peut donner sa valeur à r0
Mov r1,#20
Mov r0,r1
Et il faut bien faire attention au sens des instructions. Vous remarquerez que les registres de départ contiennent toujours la valeur d’origine. Ce n’est donc pas vraiment un déplacement mais une copie de données.
Nous pouvons additionner les 2 registres :
Mov r0,#5
Mov r1,#10
Add r0,r1
Et r0 contiendra maintenant 15.
Et effectuer des soustractions d’un registre sur l’autre.
Et hourra, nous pouvons effectuer des multiplications :
Mov r0,#5
Mov r1,#10
mul r0,r1
Attention, cette instruction (avec un s) ne positionne pas le flag overflow en cas de dépassement.
Et avec le raspberry pi 3 qui possède un processeur Cortex, des divisions :
Mov r0,#500
Mov r1,#10
udiv r0,r1           @ division non signée
sdiv r0,r1            @ division signée

Attention, il faudra toujours se poser la question du dépassement pour ces opérations.

Puis l’Ingénieur inventa la possibilité d’intervenir sur le registre source avant d’effectuer l’instruction grâce à l »ajout d’un circuit particulier ( barrel shifter). Celui-ci permet d’effectuer des opérations logiques cad  LSL LSR ASR ROT sur le registre de manière interne.
Par exemple :
Mov r1,#5         @ on met 5 dans r1
Mov r0,r1,lsl #1  @ multiplication de r1 par 2 et transfert dans r0
Résultat 10
Remarque : la valeur du registre r1 après l’instruction n’est pas changée
Il est donc possible d’effectuer des multiplications de multiple de 2 + 1 par exemple par 5 :
Mov r0,#6
Add r0,r0,lsl #2    @ multiplication de r0 par 4 puis ajout à lui même

Et aussi des multiplications de multiples de 2 – 1 :
Exemple multiplication par 7
Mov r0,#6
Rsb r0,r0,lsl #3   @ multiplication de r0 par 8 puis soustraction de r0 de ce résultat

3 registres :
Ce 3ième registre s’appelle  r2 et il effectue les mêmes fonctions que les 2 premiers registres. Mais cela permet quelques instructions supplémentaires :
Mov r1,#10
Mov r2,#5
add r0,r1,r2   @ addition de r1 et r2 et transfert dans r0
Attention : ne pas confondre cette instruction avec add r0,r1  où on ajoute r1 à r0 !!
Idem pour la soustraction et la multiplication
Mov r1,#10
Mov r2,#5
mul r0,r1,r2   @ multiplication de r1 et r2 et transfert dans r0
et nous pouvons aussi utiliser le barrel shifter :
Mov r1,#10
Mov r2,#5
Add r0,r1,r2 ,lsl #2  @ multiplication de r2 par 4,addition de r1 et r2 et transfert dans r0
Remarque1 :  r1 et r2 ne changent pas de valeur après l’instruction.
Remarque 2 : pour la multiplication, nous pouvons utiliser l’instruction umull qui stocke le résultat dans 2 registres : un pour la partie basse, un pour la partie haute (> à 32 bits). Ceci est intéressant car on peut détecter un dépassement de capacité en testant le registre qui contient la partie haute. S’il est différent de zéro, c’est qu’il y a dépassement.

Autres registres :
Avec 4 registres, nous pouvons effectuer une multiplication avec addition ou une soustraction en une seule instruction :
            mov r1,#200   
            mov r2,#2
            mov r3,#4
          mlas r0,r1,r2,r3  @r0 = (r1*r2) + r3

            mov r1,#200   
            mov r2,#2
            mov r3,#404
            mls r0,r1,r2,r3  @r0 = r3- (r1*r2)
Pour cette dernière instruction, il n’est pas possible de positionner le registre d’état

En tout nous avons 16 registres de 32 bits, les 11 premiers (r0 à r10) peuvent être utilisés comme les 3 premiers que nous venons de voir. Les registres r11 et r12  peuvent également être utilisés mais ils ont par ailleurs un rôle particulier. Les 3 derniers ne peuvent pas être utilisés de la même façon et nous verrons leur rôle dans les chapitres suivants.

Aucun commentaire:

Enregistrer un commentaire