Utiliser les PIC 16F et 18F/Exercices/Arithmétique et assembleur
Exercice 1
modifierRelisez l’article sur le système binaire pour commencer.
- Convertissez les nombres décimaux suivants en binaire (en représentation en complément à deux sur 8 bits) :
- +11
- -11
- -23.
- Ensuite convertissez ces nombres en hexadécimal.
- Convertissez les nombres binaires suivants en décimal :
- 111011
- 11010101.
- Réaliser ensuite les soustractions suivantes en utilisant (i) la technique de soustraction normale ; (ii) une addition du complément à deux
- 11011 - 10101
- 11100 - 1001
Solution
-
- 11 donne 00001011
- -11 : je complémente bit à bit la valeur binaire de 11 soit 11110100 et j'ajoute 1 soit 11110101
- -23 : je cherche 23, soit 00010111, je complémente bit à bit, soit 11101000 et j'ajoute un, soit 11101001
-
- 11 est donc 0x0B
- -11 est 0xF5
- -23 est 0xE8
-
- 111011 vaut soit 32+16+8+2+1 = 59
- 11010101 = 128 + 64 +16 + 4 + 1 = 213
Exercice 2
modifier(données en hexadécimal)
La directive utilisée pour réserver la mémoire RAM dans cet exercice est
CBLOCK 0x0C ; début de la zone variables en ACCESS RAM data1 :1 ; zone de 1 byte data2 :1 ; le resultat sera ici ENDC ; Fin de la zone
On donne l'état (connaissance partielle : on ne connaît pas tout, mais c’est suffisant) suivant :
- D'après le schéma donné ci-dessus, désassembler la partie utile du code à l'aide des tableaux d'instructions du TD1 et TD2.
- Exécuter ensuite les instructions que vous pouvez et donner les états successifs.
Solution
1°) Voici le désassemblage à droite :
00002 CBLOCK 0x0C ; début d 0000000C 00003 data1 :1 ; zone de 1 byte 0000000D 00004 data2 :1 ; le resultat sera ici 00005 ENDC ; Fin de la zone 00006 ; Fin de la zone 0000 00007 ORG 0x000 ; Adresse de départ après reset 0000 080C 00008 movf data1,w 0001 0A0D 00009 incf data2,w ; ⟺ W+data2 -> W 0002 3E01 00010 addlw 0x01 00011 END
2°) W <- FF (car data1 vaut FF)
W <- data2 +1 : soit W <-1 puisque data2 vaut 0
W <- 1+1 = 2
Exercice 3
modifierÉcrire un programme qui additionne deux valeurs en RAM ("donnee1" et "donnee2") et met le résultat dans une variable 8 bits "somme".
Solution
; {{Unité|64|octets}} en access RAM CBLOCK 0x0C ; début de la zone variables sur 16F84 donnee1 :1 ; Zone de 1 byte donnee2 : 1 ; zone de {{Unité|1|octets}} somme : 1 ; zone de {{Unité|1|octets}} ENDC ; Fin de la zone org 0x000 ; Adresse de départ après reset clrf somme movf donnee1,w ;donnee1 dans W addwf donnee2,w ;W <- W + donnee2 movwf somme ;W -> somme boucle goto boucle END
Voici pour information comment ceci est assemblé :
0000 00007 org 0x000 ; Adresse de départ après reset 0000 018E 00008 clrf somme 0001 080C 00009 movf donnee1,w ;donnee1 dans W 0002 070D 00010 addwf donnee2,w ;W <- W + donnee2 0003 008E 00011 movwf somme ;W -> somme 0004 00012 boucle 0004 2804 00013 goto boucle 00014 END