Beruflich Dokumente
Kultur Dokumente
Dans les prochains chapitres, nous dcouvrirons les jeux d'instructions des
processeurs x86 et ARM. Il ne s'agira en aucun cas d'une tude exhaustive des
instructions, mais il s'agira plutt d'aborder les instructions fondamentales. Les
instructions sont diviss en 3 groupes fondamentaux:
Les instructions de traitement
Ce sont les instructions agissant sur les registres uniquement dans le contexte
d'oprations arithmtiques ou logiques. Elles comprennent galement les
instructions de comparaisons et de tests.
Les instructions de transfert de donnes
Ce sont les instructions utilises dans le cadre d'change de donnes entre la
mmoire et les registres; ces instructions permettent de grer les interactions entre
le cur de processeur et les priphriques (RAM, I/O, etc.). Les instructions de
transfert de donnes sont associes diffrents modes d'adressage.
Les instructions de branchement
Finalement, les instructions de branchement permettent de contrler le
droulement d'un programme durant son excution.
Ce chapitre se concentre sur les instructions de traitement.
Lacartederfrencerapidecidessusdonneunrsumdesinstructionsx86debase
ainsiquelesdiffrentsflagsduregistred'tatetmodesd'adressage.
Toutes les instructions ARM sont codes sur 32 bits; cela comprend les
diffrentes parties de l'instruction, savoir le code opratoire (opcode), les
oprandes, les flags, les valeurs immdiates (constantes), etc.
La majeur partie des instructions sont excutes en un seul cycle (
l'exception des instructions de transferts et de quelques instructions de
traitement particulires) et peuvent tre excutes de manire
conditionnelle.
Un site de rfrence pour les processeurs ARM: http://infocenter.arm.com
Les flags du registre d'tat (CPSR) sont mis jour lors d'une excution d'une
instruction arithmtique par exemple, ou lors d'une comparaison.
Toutefois, comme nous le verrons plus tard, une instruction arithmtique ncessite
l'ajout d'un suffixe spcial (lettre 's') pour indiquer que la mise jour doit s'effectuer.
Par exemple, le code de condition eq est utilis lorsqu'il y a galit lors d'une
comparaison. L'instruction de comparaison effectuant une soustraction, le rsultat
de cette soustraction aura pour effet de mettre le flag Z 1 dans le registre CPSR, et
donc l'instruction avec ce code de condition teste la valeur de ce flag. La valeur 1
correspond "Z set" dans le tableau ("Z clear" signifie que le bit Z est 0).
Tout comme pour l'assembleur x86, il existe des cartes de rfrence rapide
prsentant l'ensemble des instructions les plus importantes. Ces cartes sont trs
utiles lors du dveloppement, en particulier avec l'assembleur ARM, car les
instructions sont plutt rigides au niveau des oprandes qu'elles manipulent. Le
tableau indique de manire trs rigoureuse le format des oprandes, modes
d'adressage et les diffrentes formes des instructions qui peuvent tre valids par le
compilateur.
Dans ce sens, l'assembleur ARM peut tre considr comme plus contraignant que
l'assembleur x86.
Lorsqu'uneinstructionpeutcontenirunregistrecommeoprande,celuicidoittre
prfixavec%
Lavaleurimmdiatereprsenteunevaleurnumriquequiseraencodeavec
l'instruction.Cettevaleurdoittreprfixeaveclesymbole$
10
La taille des oprandes peut tre intgre l'instruction l'aide d'un suffixe (cf ci
dessus). S'il n'y a pas d'ambigut, il n'est en principe pas ncessaire de rajouter le
suffixe, bien que le rajout soit vivement recommand pour faciliter la lecture.
Normalement, il n'y a pas d'ambigut dans le cas de transfert mmoire (nous
verrons les instructions de transfert dans un autre chapitre).
11
L'instruction mov peut tre utilis avec un suffixe compos de trois lettres
permettant de convertir la taille d'une donne une taille suprieure. Ce type
d'instruction ncessite l'utilisation de deux oprandes de type registre.
La premire lettre du suffixe dtermine s'il faut considrer le signe de la valeur
source, i.e. s'il faut tenir compte de son bit de poids fort ou non, durant sa
conversion. Si la valeur est ngative, la valeur convertie la nouvelle taille
conservera le signe ngatif et sa reprsentation sera conforme une valeur
ngative. Si la valeur est positif, les bits de poids fort de la valeur cible seront nuls. La
lettre s (signedextended) signifie que l'on souhaite prserver le signe, alors que la
lettre z (zeroextended) considre une valeur non signe et les bits de poids fort
vaudront 0.
Lesdeuxlettressuivantesindiquentletypedeconversion;bw signifiebytetoword
(8to16),bl bytetodword (8to32),wl wordtodword (16to32),etc.
12
13
14
15
16
Nous avons vu qu'une instruction ARM est code sur 32 bits, comprenant tout ce qui
caractrise l'instruction (opcode, oprandes, valeur immdiate, etc.). Cette approche
ne permet donc pas d'utiliser une valeur immdiate sur 32 bits, mais ncessite un
codage particulier de celleci.
Seul 12 bits sont rservs pour la valeur immdiate. Avec 12 bits, il est possible
d'exprimer une valeur dans un intervalle de 0 212 1 (4095); ce qui serait un peu
limitatif. C'est pourquoi les 12 bits sont utiliss d'une autre manire: on utilise les 8
bits de poids faible pour coder une valeur entre 0 et 255, puis les 4 bits de poids fort
pour coder un exposant. Ainsi une valeur immdiate (imm) est calcule selon la
formule suivante:
imm = val(8 bits) * 22*n, n tant l'exposant.
De cette manire, une valeur immdiate peut prendre les valeurs entre 0 et 255,
puis tous les nombres qui peuvent s'exprimer comme tant le dcalage de 2 bits
d'une valeur entre 0 et 255.
Si n vaut 0, on obtient toutes les valeurs entre 0 et 255.
Si n vaut 1, on obtient toutes les valeurs entre 0 et 255 multiplies par 4
Si n vaut 2, on obtient toutes les valeurs entre 0 et 255 multiplies par 16
Si n vaut 3, on obtient toutes les valeurs entre 0 et 255 multiplies par 64
et ainsi de suite. On voit donc apparatre les multiples de 4, 16, 64, etc. (jusqu' la
valeur maximale donne par le facteur 255).
Cela permet ainsi de donner une meilleure amplitude de la valeur immdiate.
Lorsqu'il n'est pas possible de coder une valeur immdiate sous cette forme, il faut
utiliser une autre approche, dtaille ciaprs et dans le chapitre suivant.
17
Une diffrence essentielle avec la norme AT&T de l'assembleur x86 rside dans le
sens de fonctionnement des oprandes : alors que l'oprande source apparat en
second ( droite de la virgule) sur x86, elle apparat toujours en premier ( gauche
de la virgule) en assembleur ARM. A l'instar du x86, l'instruction mov permet de
copier une valeur dans un registre. L'oprande source peut tre soit un registre, soit
une valeur immdiate. Nous avons dcouvert que dans ce dernier cas, la valeur
immdiate est encode d'une certaine manire. Depuis les version v7 des
architectures ARM, deux nouvelles instructions ont fait leur apparition : il s'agit de
movw et movt qui permettent de stocker une valeur quelconque sur 32 bits. Ces
deux instructions prennent un registre commun comme premire oprande, puis
une valeur immdiate sur 16 bits comme seconde oprande. Elles doivent tre
excutes dans cet ordre (movw, movt) et ne pas tre "trop distantes" l'une de
l'autre (en principe, les deux instructions se suivent). La premire instruction permet
de stocker les 16 bits de poids faible de la valeur, alors que la seconde les 16 bits de
poids fort; cette dernire opre un dcalage de 16 bits gauche d'une valeur
immdiate de 16 bits.
Il existe une autre manire gnrale de manipuler des valeurs 32 bits que nous
tudierons dans le chapitre portant sur les instructions de transfert.
Une autre diffrence majeure porte sur l'excution conditionnelle des instructions
ARM. En effet, un code de condition sur deux lettres peut tre utilis pour dcider si
l'instruction doit tre excut ou non. Bien entendu, ce code de condition se basera
sur l'tat des flags du registre d'tat (registre cpsr).
18
Dans les exemples cidessus, on voit qu'une instruction ARM peut se dcliner
diffremment (diffrents mnmoniques) selon que l'on veut une mise jour
automatique des flags, ou une excution conditionnelle de l'instruction.
Dans le premier cas, l'instruction adds aura pour effet de mettre jours les flags du
cpsr en fonction du rsultat de l'addition (un rsultat nul mettra le bit Z 1 (Z set).
L'excution conditionnelle de l'instruction sub dpendra des flags du cpsr. Ainsi,
dans cet exemple, en fonction du rsultat de la premire soustraction, la seconde
soustraction sera effectue seulement si le bit Z est 1 (donc rsultat nul de la
premire instruction).
19
20
Comme sur x86, l'instruction de comparaison effectue une soustraction entre les
deux oprandes et le rsultat de la comparaison est caractris par les flags du
registre d'tat cpsr.
21
Sur ARM, il existe galement une instruction de multiplication: mul Rd, Rm, Rs
Cette instruction est particulire et son implmentation matrielle peut varier d'une
version du processeur l'autre. Elle est plus complexe et ncessite plusieurs cycles.
Les registres des oprandes doivent tre obligatoirement diffrents les uns des
autres (il n'est pas possible d'effectuer: mul r2, r2, r3 par exemple. De plus, la
dernire oprande ne peut pas tre une valeur immdiate.
22
23
24
Une macroinstruction est la description d'une inscription logique (qui n'existe pas
du tout au niveau du processeur) partir d'instructions assembleur.
C'est le prprocesseur qui remplacera chaque occurrence de l'instruction logique
(dfinie par un nom symbolique) avec le contenu correspondant. Il s'agit donc bien
d'une manipulation du code source effectue par le prprocesseur.
25
26
27
28
29
30