Professional Documents
Culture Documents
Parmi les utilisations les plus frquentes de l'assembleur, on peut citer les contextes
d'utilisation suivants:
L'amorage d'un systme: lorsque l'on met un systme sous tension, le
processeur commence gnralement excuter des instructions particulires de
configuration/initialisation qui ne correspondent pas une instruction d'un
langage de haut niveau. C'est pourquoi, les premires instructions d'un code de
dmarrage (d'amorage ou bootstrap) sont crites en assembleur.
La mise au point d'un programme (debugging) peut ncessiter l'utilisation d'un
debugger connect l'application pendant que celleci s'excute. Il est possible
alors de rcuprer le code dsassembl en tempsrel et d'obtenir de prcieuses
informations sur le comportement du programme (il se peut que le debugger ne
puisse pas toujours associer le code source original crit dans un langage de haut
niveau avec l'instruction en cours d'excution ( mditer!).
Dans certain cas, l'acclration d'un traitement peut ncessiter l'utilisation de
l'assembleur, en particulier si le processeur dispose d'instructions performantes
qui ne sont pas utilises par le compilateur (code DSP, coprocesseur arithmtique,
etc.).
D'une manire gnrale, ds que l'on cherche utiliser des instructions
particulires du processeur, il faut utiliser du code assembleur. Comme nous le
verrons dans ce cours, il est aussi possible de mixer du code C avec du code
assembleur par exemple.
Finalement, la comprhension de l'assembleur permet d'analyser du code binaire.
10
11
12
13
14
15
Un aspect important des processeurs qui aura un impact sur le dveloppement d'un
programme en assembleur concerne la paralllisation en tage de plusieurs cycles
de traitement; chaque cycle est associ un tage. En effet, pour chaque instruction
d'un programme, le processeur doit:
1) rcuprer l'instruction en mmoire (fetch). Pour cela, il doit accder
l'instruction stocke une adresse place dans un registre de type PC
(Program Counter)
2) dcoder l'instruction partir de la valeur stocke en mmoire.
3) excuter l'instruction
4) effectuer divers traitements internes (rcriture dans un registre, mise
jour de la mmoire, etc.)
A chaque coup d'horloge, chaque tage excute une tape du cycle en parallle; il
s'agit de la technique de pipeline.
Les mcanismes de pipeline ont un impact non ngligeable sur le dveloppement
d'un code assembleur. En particulier, l'utilisation du registre PC ncessite une
attention particulire. Il faut comprendre que sa valeur durant l'excution d'une
instruction a t incrmente plusieurs fois (2 fois selon l'exemple cidessus) depuis
l'opration fetch, autrement dit le PC est en avance de 8 bytes lors de l'excution de
l'instruction, si les instructions sont codes sur 32 bits.
L'utilisation d'une instruction de type nop (no operation) peut s'avrer utile pour
vider le pipeline et anticiper une mauvaise lecture d'instruction (fin de code par
exemple).
16
17
Lareprsentationd'unevariableenmmoireestillustresurleschmacidessous.
Onsupposequelavariablevar estplantel'adresse0x00000010 etlavariable
pvar estplantel'adresse0x00001000.
RAM
.
0x00001000 10
00
00
00
0x00000010 05
03
04
02
0x00000004
0x00000000
18
Le code cidessus montre l'utilisation des oprateurs "&" et "*" pour accder
l'adresse d'une variable et modifier son contenu partir de son adresse en
mmoire.
L'utilisation du symbole "*" dans la partie dclarative sert dclarer un pointeur; il
s'agit d'une variable qui pourra contenir une adresse mmoire. A noter que le mot
cl null est utilis en C pour une adresse gale 0 (#define null (void *) 0).
Il ne faut pas oublier que la dclaration d'un pointeur (comme toute autre variable)
ne suffit pas initialiser la variable et que celleci peut contenir priori n'importe
quelle valeur.
Le symbole "*" utilis dans le corps d'une fonction permet d'accder au contenu se
trouvant l'adresse stocke dans la variable (pointeur). On parle aussi de
drfrencement. C'est ce moment que le type du pointeur intervient afin que le
compilateur sache quel quantit de donnes doit tre transfre (1, 2, ou 4 bytes
typiquement).
Le symbole "&" permettra de rcuprer l'adresse d'une variable. On notera qu'un
pointeur est trait en C comme tout autre variable, savoir qu'il est bien sr
possible de rcuprer l'adresse d'une variable contenant dj une adresse! (adresse
d'un pointeur).
19
20
21
Dans le langage C, il est possible de manipuler les valeurs au bit prs grce aux
oprateurs arithmtiques et logiques. Ces oprateurs possdent gnralement une
quivalence directe avec des instructions en assembleur ralisant les mmes
oprations.
Il s'agit notamment du ET logique (&), OU logique (|), XOR logique (^), et NOT (~).
On rajoutera galement les oprateurs de dcalages binaires vers la droite (>>) et
vers la gauche (<<).
Tous ces oprateurs agissent sur des valeurs correspondant aux types de base
(scalaires) du langage C.
22
23
24