L'assembleur - Instructions arithmétiques et logiques
Les instructions arithmétiques et logiques sont effectuées par l'unité arithmétique et logique.
Il s'agit d'opérations directement effectuées sur les bits de la donnée
que l'on traite.
Sont comprises dans cette appellation :
- les instructions d'addition
- les instructions de soustraction
- les instructions de décalage
- les instructions de rotation
- les instructions logiques (ET, OU, ...)
Les opérations arithmétiques et logiques modifient l'état des
indicateurs.
Instructions d'addition
Les opérations arithmétiques se font de la même façon en binaire
qu'en base décimale. C'est-à-dire que lorsque l'on dépasse la valeur maxi
au niveau du bit n (lorsque l'on dépasse la valeur 1) on a une retenue ou un report
au bit n+1.
Voyons cela sur un exemple :
|
0 |
0 |
0 |
1 |
+ |
0 |
0 |
0 |
1 |
|
- |
- |
- |
- |
|
0 |
0 |
1 |
0 |
Sur un exemple un peu plus compliqué :
|
0 |
0 |
1 |
0 |
+ |
0 |
0 |
1 |
1 |
|
- |
- |
- |
- |
|
0 |
1 |
0 |
1 |
Décalage et rotation
Ces instructions permettent de décaler d'un côté ou de l'autre les
bits des registres accumulateurs (AX et BX, et donc AH, AL, BH, BL). Cette opération
qui semble inutile a en fait plusieurs applications très intéressantes, dont :
- permettre de lire un à un les bits du registre (car les bits sortant à gauche
positionnent l'indicateur de retenue CR)
- permettre une multiplication par 2n (en effet le fait de décaler
un nombre binaire d'un chiffre à gauche le multiplie par 2, ainsi en effectuant cette opération n
fois on obtient une multiplication par 2n)
exemple :
00010 (2 en décimale)
00100 (on décale à gauche on obtient 4)
01000 (on décale à gauche à nouveau, on obtient 8)
- permettre une division par 2n (comme précédemment mais en effectuant une rotation sur la droite)
Une opération de décalage déplace chacun des bits d'un nombre binaire sur la gauche (ou la droite), mais ceux-ci
sortent, c'est-à-dire qu'ils sont définitivement perdus, lorsqu'ils arrivent au bit de poids fort (ou de poids faible).
exemple :
0001110000
0011100000 (on décale d'un bit à gauche)
0111000000 (on décale d'un bit à gauche)
1110000000 (on décale d'un bit à gauche)
1100000000 (on décale d'un bit à gauche)
1000000000 (on décale d'un bit à gauche)
Une opération de rotation agit comme une opération de décalage à la différence près que les
bits qui sortent d'un côté rentrent de l'autre...
exemple :
0001110000
0011100000 (on effectue une rotation d'un bit à gauche)
0111000000 (on effectue une rotation d'un bit à gauche)
1110000000 (on effectue une rotation d'un bit à gauche)
1100000001 (on effectue une rotation d'un bit à gauche)
1000000011 (on effectue une rotation d'un bit à gauche)
Les opérations courantes de rotation et de décalage sont les suivantes :
- RCL registre, 1 (Rotate Carry Left) :
Effectue une rotation des bits sur la gauche en passant par l'indicateur de retenue CF. Le contenu de CF est introduit à droite, puis le bit de poids fort est copié dans CF.
- RCR registre, 1 (Rotate Carry Right) :
Effectue une rotation des bits sur la droite en passant par l'indicateur de retenue CF. Le contenu de CF est introduit à gauche, puis le bit de poids faible est copié dans CF.
- ROL registre, 1 (Rotate Left) :
Effectue une rotation des bits sur la gauche. Le bit de poids fort est copié dans CF et réintroduit à droite.
- ROR registre, 1 (Rotate Right) :
Effectue une rotation des bits sur la droite. Le bit de poids faible est copié dans CF et réintroduit à gauche.
- SHL registre, 1 (Shift Left) :
Décale les bits du registre indiqué de 1 bit vers la gauche. (Les bits sortants
sont transférés dans l'indicateur de retenue CF mais ne sont pas réintroduits à droite).
- SHR registre, 1 (Shift Right) :
Décale les bits du registre indiqué de 1 bit vers la droite. (Les bits sortants
sont transférés dans l'indicateur de retenue CF mais ne sont pas réintroduits à gauche).
Les instructions RCL et RCR permettent de faire une lecture bit-à-bit du contenu du registre.
Les instructions SHL et SHR permettent de faire une multiplication par 2n sur des entiers naturels (pas sur des entiers relatifs car
le bit de poids fort disparaît dès la première rotation).
Instructions logiques
Les instructions logiques sont au nombre de trois (ET, OU et OU Exclusif). Elles permettent de
faire des opérations bit-à-bit sur des nombres binaires (c'est-à-dire en
considérant chacun des bits indépendamment des autres, sans se soucier de la retenue).
Ce type d'instruction se note de la manière suivante :
INSTRUCTION destination, source
destination désigne le registre ou l'adresse de la case mémoire qui contiendra le résultat de l'opération.
source peut être aussi bien un registre, une constante ou une adresse.
- L'instruction AND (ET) additionne les bits de même poids deux à deux et stocke le résultat dans
le registre de destination. Cette instruction met donc le bit du résultat à 1 si les bits de même
poids de la source et de la destination sont tous deux à 1, sinon il le met à zéro.
exemple :
|
0 |
1 |
0 |
1 |
ET |
0 |
1 |
1 |
0 |
|
- |
- |
- |
- |
|
0 |
1 |
0 |
0 |
- L'instruction OR (OU) met donc le bit du résultat à 0 si les deux bits de même
poids de la source et de la destination sont tous deux à 0, sinon il le met à un.
exemple :
|
0 |
1 |
0 |
1 |
OU |
0 |
1 |
1 |
0 |
|
- |
- |
- |
- |
|
0 |
1 |
1 |
1 |
- L'instruction XOR (OU Exclusif) met le bit du résultat à 1 si un des deux bits de même
poids de la source et de la destination est égal à 1 (mais pas les deux), dans les autres cas il le met à zéro.
exemple :
|
0 |
1 |
0 |
1 |
|
0 |
1 |
1 |
0 |
|
- |
- |
- |
- |
|
0 |
0 |
1 |
1 |
Chacune de ces instructions a de très nombreuses applications, il serait impossible
de toutes les énumérer. En voici quelques-unes :
- Masquage : Il est possible de masquer, c'est-à-dire mettre à zéro tous les bits qui ne nous intéressent pas dans un nombre.
Pour cela il faut créer une valeur masque : un nombre dont les bits de poids qui nous intéressent sont à 1, les autres à 0.
Il suffit alors de faire un AND entre le nombre à masquer et le masque pour ne conserver que les bits auxquels on s'intéresse.
Par exemple, imaginons que l'on veuille masquer les 4 bits de poids faible (les 4 derniers bits) d'un nombre codé sur 8 bits (par exemple 10110101). Il suffit
d'appliquer le masque 11110000, et l'on obtiendra 10110000. On ne conserve bien que les 4 premiers bits, les autres sont mis à zéro...
- Inversion : Il est possible d'inverser tous les bits d'un nombre en faisant un XOR avec un nombre ne contenant que des 1.
Discussions pertinentes trouvées dans le forum