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