Académique Documents
Professionnel Documents
Culture Documents
Remarques Et Astuces de Programmation en Assembleur
Remarques Et Astuces de Programmation en Assembleur
• Equivalence en langage C :
REGISTRE = 0x8C ;
• Equivalence en langage C :
REGISTRE2 = REGISTRE1 ;
1
movf REGISTRE2, W ; W = (REGISTRE2)
• Equivalence en langage C :
REGISTRE_TEMP = REGISTRE1 ;
REGISTRE1 = REGISTRE2 ;
REGISTRE2 = REGISTRE_TEMP ;
4- Tests de comparaison
(REGISTRE) = 0x00 ?
2
movf REGISTRE , f ; (REGISTRE) = (REGISTRE)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
if (REGISTRE = = 0x00)
// bloc d'instructions 1
else
// bloc d'instructions 2
(REGISTRE) != 0x00 ?
3
movf REGISTRE , f ; (REGISTRE) = (REGISTRE)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
if (REGISTRE != 0x00)
// bloc d'instructions 1
4
else
// bloc d'instructions 2
(REGISTRE) = 0x3F ?
{ bloc d'instructions 1 }
goto suite
non
5
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
if (REGISTRE = = 0x3F)
// bloc d'instructions 1
else
// bloc d'instructions 2
(REGISTRE) != 0x3F ?
6
movlw 0x3F ; W = 0x3F
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
if (REGISTRE != 0x3F)
7
{
// bloc d'instructions 1
else
// bloc d'instructions 2
(REGISTRE1) = (REGISTRE2) ?
8
goto non ; Z = 0 c'est-à-dire (REGISTRE1) != (REGISTRE2)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
if (REGISTRE1 = = REGISTRE2)
// bloc d'instructions 1
else
// bloc d'instructions 2
(REGISTRE1) != (REGISTRE2) ?
9
movf REGISTRE2 , W ; W = (REGISTRE2)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
if (REGISTRE1 != REGISTRE2)
10
// bloc d'instructions 1
else
// bloc d'instructions 2
11
sublw 0x3F ; W = 0x3F - (REGISTRE)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
// bloc d'instructions 1
else
// bloc d'instructions 2
12
movlw 0x3F ; W = 0x3F
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
13
// bloc d'instructions 1
else
// bloc d'instructions 2
{ bloc d'instructions 1 }
14
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
// bloc d'instructions 1
else
// bloc d'instructions 2
15
movf REGISTRE , W ; W = (REGISTRE)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
16
// bloc d'instructions 1
else
// bloc d'instructions 2
4-2-5 - Le contenu du registre est-il supérieur ou égal au contenu d'un autre registre ?
17
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
// bloc d'instructions 1
else
// bloc d'instructions 2
4-2-6 - Le contenu du registre est-il strictement inférieur au contenu d'un autre registre
?
18
movf REGISTRE2 , W ; W = (REGISTRE2)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
• Equivalence en langage C :
19
// bloc d'instructions 1
else
// bloc d'instructions 2
5- Boucle Do While
Exemple :
debut
{ bloc d'instructions }
20
movf REGISTRE , f
btfsc STATUS , Z
goto debut
suite
{ suite du programme }
• Equivalence en langage C :
do
// bloc d'instructions
6- Boucle While
Exemple :
21
debut
btfss STATUS , Z
goto suite
{ bloc d'instructions }
goto debut
suite
{ suite du programme }
• Equivalence en langage C :
// bloc d'instructions
7- Boucle FOR
Exemple :
Pour exécuter le bloc d'instructions 20 fois, la valeur initiale du compteur doit être 21 :
22
movlw D'21' ; W = D'21'
debut
boucle
{ bloc d'instructions }
goto debut
23
suite
{ suite du programme }
• Equivalence en langage C
// bloc d'instructions
Exemple : on veut mettre à 0 les bits 1, 2, 4 et 6, les autres bits étant inchangés :
B'u0u0u00u'
24
N.B. S'il n'y a qu'un seul bit à mettre à 0, il faut simplement utiliser l'instruction bcf.
S'il faut mettre tous les bits à 0, il faut simplement utiliser l'instruction clrf REGISTRE.
Exemple : on veut mettre à 1 les bits 1, 2, 4 et 6, les autres bits étant inchangés :
B'u1u1u11u'
N.B. s'il n'y a qu'un seul bit à mettre à 1, il faut simplement utiliser l'instruction bcf.
Exemple : on veut complémenter les bits 1, 2, 4 et 6, les autres bits étant inchangés.
25
N.B. s'il faut inverser tous les bits, il faut simplement utiliser l'instruction comf REGISTRE ,
f
9- Tables de données
• Exemple :
Pour des raisons de simplicité, l'adresse de début de cette routine peut être (pour un
microcontrôleur 16F84A) :
• 0x100
• 0x200
• 0x300
; xxxxxxxxxxx
; Routine table
; xxxxxxxxxxx
table
retlw D'1'
retlw D'11'
retlw D'21'
retlw D'31'
26
retlw D'41'
retlw D'51'
retlw D'61'
retlw D'71'
retlw D'81'
retlw D'91'
retlw D'101'
retlw D'111'
retlw D'121'
retlw D'131'
retlw D'141'
retlw D'151'
retlw D'161'
retlw D'171'
retlw D'181'
retlw D'191'
retlw D'201'
retlw D'211'
retlw D'221'
retlw D'231'
retlw D'241'
retlw D'251'
; xxxxxxxxxxxxxxxxxx
27
Avec un début de routine à l'adresse 0x300, l'instruction retlw D'1' se trouve à l'adresse
0x301, retlw D'11' à l'adresse 0x302 etc...
Dans le programme principal, pour appeler la routine, il faut au préalable charger le registre
spécial PCLATH avec la valeur 0x03 (0x02 si l'adresse de début est 0x200 etc ...) :
call table
Adressage indirect :
• FSR est un registre spécial situé à l'adresse 0x04 (en banque 0) de la mémoire des
données (Data RAM).
• Le registre spécial INDF contient la valeur du registre pointé par le registre FSR
(on parle d'adressage indirect).
28
-> Exemple n°1 : lecture du port B
movwf FSR ; on charge 0x06 (= adresse du registre PORTB) dans le registre FSR
movwf FSR ; on charge 0x06 (= adresse du registre PORTB) dans le registre FSR
29
En pratique, il n'est pas judicieux d'utiliser l'adressage indirect dans les examples 1 et 2.
Voici un example où l'usage de l'adressage indirect est très efficace (pour optimiser la taille
du programme) :
Il s'agit d'effacer les 68 octets d'usage général de la mémoire RAM, situés aux adresses
0x0C à 0x4F :
movlw 0x0C
debut
subwf FSR, W
suite
...
N.B.
Par adressage direct, il faut aligner 68 instructions, ce qui est gourmand en mémoire de
programme.
clrf 0x0C
clrf 0x0D
...
clrf 0x4F
30
Par contre, l'exécution demande seulement 68 cycles (optimisation de la vitesse d'exécution).
31