Complément à 1 et à 2
Le complément à 1 inverse tous les bits, c’est ce que fait l’instruction Not. vue précédemment.
Il ne faut pas confondre avec le complément à 2, ou
complément vrai, résultat de l’opération zéro moins le nombre.
Le figure ci-contre justifie ce terme : 20 est le complément de
80 (en format 2 digits décimal), et ceux qui ont étudié les
logarithmes vont comprendre la suite sans peine : au lieu de
soustraire, on peut additionner le complément.
La figure ci-contre montre qu’au lieu de calculer 40-20,
on peut calculer 40 + (100-20) = 40 + 80.
Cette addition du complément génère un Carry, alors
que la soustraction ne génère pas d’emprunt (borrow).
Contrairement à la majorité des micro-contrôleurs, les
PICs ne soustraient pas, ils ajoutent le complément, et
le carry a la valeur inverse du borrow. C’est tout ce
dont il faut se souvenir si on veut savoir si la
soustraction est possible (a donné un résultat positif).
Le programme Ex877-213.asm effectue les
soustractions 16’10 – (valeur du potentiomètre=0..3F).
Observez C et Z.
Donc, au lieu de soustraire, on peut ajouter le complément. Pour les constantes, l’assembleur sait
calculer les compléments, on a déjà utilisé des
Move #-1,W
au lieu de
Move #16’FF,W
.
On écrit donc souvent pour soustraire une valeur immédiate
Move #-Valeur,W
Add W,Var
calcule Var - #Valeur Var
Move #Valeur,W
Sub W,Var
L’instruction Sub des PICs est inhabituelle. Heureusement CALM (inspiré de Motorola et pas
d’Intel) dit exactement ce que font les instructions arithmétiques. Le 1
e
opérande est soustrait du
2
e
, et le résultat est mis dans le 3
e
opérande, s’il y en a un, autrement dans le 2e.
Les instructions arithmétiques sont les suivantes :
Add #Val,W ; #Val + W W ; pas sur 10F 12F
Add Var,W ; Var + W W
Add W,Var ; W + Var Var
Sub W,#Val,W ; #Val - W W ; pas sur 10F 12F
Sub W,Var,W ; Var - W W
Sub W,Var ; Var - W Var
Nombres négatifs
Encore une complexité à mentionner, mais que nous
n’allons pas analyser. On a placé des nonbres négatifs
sur notre cercle des nombres. Où s’arrêter, comment
savoir si un point sur le cercle est –10 ou F0?
Le processeur ne connaît que des groupes de 8 bits, et
son électronique transforme ces mots sans savoir ce
qu’ils représentent. C’est le programmeur qui décide s’il
travaille avec des nombres positifs de 0 à 16’FF = 255,
ou avec des nombres positifs et négatifs, usuellement
les positifs vont de 0 à 16’7F et les négatifs de
- 1 (= 16’FF) à -16’80 (= 16’80).
La soustraction de deux nombres positifs peut donner un résultat négatif, représenté en
complément à 2. Pour avoir sa valeur absolue, positive, on doit soustraire le résultat de zéro
(prendre son complément à 2)
Clr Temp ; variable temporaire
Sub W,Temp,W ; W 0-W = -W ou –W W
Quand on parlera de vitesse positive et négative d’un moteur, il faudra choisir une représentation
adaptée.