Instructions arithmétiques et logiques en assembleur

Décembre 2016

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 :



0001
+0001
----
0010



Sur un exemple un peu plus compliqué :



0010
+0011
----
0101

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 :
0101
ET 0110
----
0100
  • 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 :
0101
OU 0110
----
0111
  • 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 :
0101
0110
----
0011




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.

A voir également :

Ce document intitulé «  Instructions arithmétiques et logiques en assembleur  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.