Programmation syst`eme :
Test et positionnement de bits
Module II2
IUT GEII Rouen
2011-2012
1/24
Pourquoi tester un bit ?
IIl arrive qu’on souhaite connaˆıtre l’´etat d’un bit ind´ependamment
des autres.
IExemple : clavier 4 touches connect´e au port E. On veut connaˆıtre
l’´etat d’une touche quel que soit l’´etat des autres.
ISi BP0 appuy´e et les autres au repos : on
lit $0E sur le port :
1ldaa PORTE
2cmpa #%00001110
3beq BP0_APPUYE
4...
ISi BP0 et BP1 appuy´es, on lit $0C le
prog. ci dessus ne fonctionne plus.
2/24
Pourquoi positionner un bit ?
IAllumer une Del sur un port sans modifier les autres.
IPositionner un bit de contrˆole dans un registre sans modifier les
autres bits.
Par exemple : positionner le bit MULT `a 1 dans le registre ATDCTL5.
3/24
Principe de base
IToutes ces manipulations (test et positionnement) sont bas´ees sur
les op´erateur bool´eens ET et OU.
IOp´erateur OU (OR)
0101
+ 0011
-------
0111
IOp´erateur ET (AND)
0101
. 0011
-------
0001
4/24
Sommaire
Positionnement de bits
Test de bits
Inversion de bits
5/24
Focage `a 1
IPour faire passer un bit `a 1 : op´erateur OU.
IExemple : on veut faire passer le bit 5 d’un octet `a 1.
On utilise un masque valant %00100000 (=32)
0000 1111 1111 0000
+ 0010 0000 + 0010 0000
--------------- ---------------
0010 1111 1111 0000
6/24
Focage `a 0
IPour faire passer un bit `a 0 : op´erateur ET.
IExemple : on veut faire passer le bit 5 d’un octet `a 0.
On utilise un masque valant %11011111
0000 1111 1111 0000
+ 1101 1111 + 1101 1111
--------------- ---------------
0000 1111 1101 0000
IRemarque : on fournit un masque avec des ’0’ l`a ou on veut forcer le
bit.
7/24
Impl´ementation en assembleur
IOn peut utiliser les instructions and et or
IPar exemple :
1ldaa adresse
2anda #%11110111 ;focage bit 3 `a 0
3oraa #%10000000 ;focage bit 7 `a 1
4staa adresse
IQuestion : le contenu de ”adresse” vaut $68. Quelle sera sa valeur
apr`es l’ex´ecution des lignes ci-dessus : ________
IPas tr`es commode :
Iutilise un des 2 accumulateurs,
Ile masque n’est pas le mˆeme pour mettre `a 0 et pour mettre `a 1.
On pef`ere utiliser les instructions d´edi´ees bset et bclr.
8/24
Instructions d´edi´ees
ILe processeur 9s12 dispose de 2 instructions de manipulation de
bits :
Ibset : positionnement de bits `a 1 (Bits Set)
Ibclr : positionnement de bits `a 0 (Bits Clear)
IAvantages :
Ipas d’utilisation d’accumulateur,
Imasque identique pour forcer `a 0 et `a 1.
IExemples
1bset adresse,%100 ; forcage bit 2 `a 1
2bclr adresse,%100 ; forcage bit 2 `a 0
9/24
Utilisation de symboles
IAfin d’am´eliorer la lisibilit´e, il est pef´erable de pr´ed´efinir des
masques (une seule fois, dans un fichier s´epae).
1BIT0 equ %00000001 ( = 1 = $01 )
2BIT1 equ %00000010 ( = 2 = $02 )
3BIT2 equ %00000100 ( = 4 = $04 )
4...
5BIT7 equ %10000000 ( = 128 = $80 )
IOn peut alors ´ecrire :
Ipour forcer le bit 2 de ’adresse’ `a 1:bset adresse,BIT2
Ipour forcer le bit 2 de ’adresse’ `a 0:bclr adresse,BIT2
IOn pourra mˆeme combiner des masques :
bclr adresse,BIT2+BIT3 bclr adresse,$0c
$04+$08=$0C (0000.1100)
10/24
En langage C
IEn C , pas d’instructions de traitement de bit :
on doit utiliser les op´erateurs binaires ET et OU.
IExemples :
Ifocage `a 1 du bit 3 du port A :
PORTA = PORTA | 0x08; (0000 1000 = $08)
Ifocage `a 0 du bit 2 du port B :
PORTB = PORTB & 0xfb; (1111 1011 = $fb)
IInconv´enient : le masque n’est pas le mˆeme suivant qu’on foce `a 0
ou `a 1. . .
11/24
Utilisation de symboles en C
IAfin d’am´eliorer la lisibilit´e, on utilisera des masques ped´efinis :
1#define BIT0 0x01
2#define BIT1 0x02
3#define BIT2 0x04
4...
5#define BIT7 0x80
IOn peut alors ´ecrire :
IFor¸cage `a 1 : a = a | BIT3;
IFor¸cage `a 0 : a=a&BIT3;
IRappel : l’op´erateur unaire ”compl´ement `a 1” (”barre”) s’´ecrit
Exemple :
char a = 0xFA; char b = a; b vaudra 5
12/24
Sommaire
Positionnement de bits
Test de bits
Inversion de bits
13/24
Test de bits en assembleur
ILe processeur dispose de 2 instructions d´edi´ees
Ibrset :Branch if bit(s) Set ( = 1)
Ibrclr :Branch if bit(s) Clear ( = 0 )
IIl faut sp´ecifier 3 champs :
1. A quelle adresse se situe la valeur `a tester ?
2. Quel est le bit test´e (masque) ?
3. A quel adresse doit-on se brancher ?
IExemples :
brset $1234,%100,LABAS
Ou mieux :
brset ADRESSE,BIT2,LABAS
14/24
Test de bits en C
IOn utilise (toujours) l’op´erateur ET, on r´ealise un masquage.
IPrincipe : ”cacher” les bits qu’on ne veut pas voir
IExemple : test du bit 5 de la variable ’a’ de type ’char’ :
On utilise le masque 0010 0000.
0000 1111
. 0010 0000
---------------
0000 0000
= 0
1111 0000
. 0010 0000
---------------
0010 0000
⇒6= 0
15/24
En pratique
IPour ex´ecuter un bloc
d’instructions si le bit 5 d’une
variable est `a ’0’ :
1if( (a&BIT5) == 0)
2{bloc;}
IPour ex´ecuter un bloc
d’instructions si le bit 5 d’une
variable est `a ’1’ :
1if( (a&BIT5) != 0)
2{bloc;}
IAttention aux parenth`eses !
((x&y)==0) est diff´erent de (x&y==0)
ILe principe sera le mˆeme pour les autres structures de test
(while(), do ... while(...); )
16/24
Evaluation des expressions en C
IEn C, un test sera
IVRAI si l’expression est diff´erente de z´ero
IFAUX si l’expression est ´egale `a z´ero
IExemple : if( a ) sera equivalent `a if(a !=0)
IVRAI si a 6= 0
IFAUX si a = 0
17/24
Langage C : Attention
INe pas confondre & et &&
IExemple avec le ET :
if(a&b)
if((a&b)!=0)
if( a && b )
if( a != 0 && b != 0 )
if( a != 0 )if ( b != 0 )
IExemple num´erique : a=1, b=2
Il’expression (a&&b)est
vraie :
a=1 (vrai), b=2 (vrai)
vrai & vrai = vrai
Il’expression (a&b)est
fausse :
01
. 10
-------
00 => faux
18/24
Sommaire
Positionnement de bits
Test de bits
Inversion de bits
19/24
Inversion de bits
IIl arrive qu’on souhaite inverser l’´etat d’un bit (clignotement d’une
del)
IPremi`ere approche : le tester :
si le bit est `a 0, on le met `a 1, sinon `a on le met `a 0
IEn assembleur :
1brclr ADRESSE,BITX,A_ZERO
2bclr ADRESSE,BITX
3bra SUITE
4A_ZERO bset ADRESSE,BITX
5SUITE ...
IEn C :
1if( (var &BITX) == 0 )
2var =var |BITX;
3else
4var =var & ˜ BITX;
20/24
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !