Sie sind auf Seite 1von 30

1

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.

Comme nous l'avons vu dans le chapitre prcdent, l'architecture x86 a t reprise


par de nombreux fabricants et a subi d'importantes volutions matrielles; il en va
galement de son jeu d'instructions qui n'a sans cesse volu.
Le jeu d'instructions IA32 utilis par la socit Intel reprsente l'une des
implmentations pour l'architecture x86. C'est un jeu d'instruction largement
rpandu pour les architectures 32 bits.
Les compilateurs d'assemblage (ou assembleurs) se dclinent principalement en
deux familles : ceux suivant la norme d'Intel (assembleur nasm, yasm, etc.) et ceux
suivant la norme AT&T (GNU assembler), norme qui sera considre dans ce cours.
Ces deux normes diffrent principalement au niveau de la syntaxe du langage, mais
un code Intel peut tre facilement converti en un code AT&T, et viceversa.
Par la suite, nous utiliserons le terme "instructions x86" pour faire rfrence en fait
au jeu d'instructions IA32.

Une instruction reprsente l'assemblage d'une instruction avec ses oprandes et


autres valeurs associes (valeur immdiate, offset, etc.); du point de vue de la
programmation, les oprandes correspondent aux arguments de l'instruction. En
revanche, du point de vue du processeur, l'instruction excute doit contenir toutes
les informations ncessaires l'excution de celleci.
L'encodage d'une instruction x86 est prsent cidessus; la taille d'une instruction
peut tre variable, entre 1 et 17 bytes, et comprend diffrents champs dont les plus
importants sont les suivants: rex prefix (informations sur les registres utiliss
comme oprandes), opcode (code opratoire de l'instruction), et immediate (valeur
immdiate). De plus, les champs (scale, index, base, displacement) sont lis aux
modes d'adressage et donnent une trs grande flexibilit lors d'accs mmoire; dans
ce cas on se rfre des instructions de transfert qui seront tudies
ultrieurement.

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

Les exemples cidessus montrent l'utilisation d'instructions de traitement logiques.


La taille des oprandes peut tre galement explicite ou implicite.
Les instructions cld et std sont des exemples d'instructions qui agissent uniquement
sur le registre d'tat eflags. Dans le cas prsent, elles touchent uniquement le bit de
direction.
Ces deux instructions peuvent donc tre utilises conjointement avec d'autres
instructions qui se rfrent ce flag de direction; nous dcouvrirons plus tard que
c'est le cas, par exemple, pour une instruction permettant la copie rapide d'un bloc
mmoire, le flag de direction indiquant alors si les adresses doivent tre
incrmentes ou dcrmentes (sens de la copie).

13

L'instruction de comparaison cmp permet de comparer les valeurs contenues dans


deux registres, qui constituent les deux oprandes de l'instruction. Il s'agit en fait
d'une soustraction dont le rsultat sera valu l'aide du registre eflags.
Les codes de condition seront tudis avec les instructions de branchement, dans le
chapitre suivant.

14

15

Comme nous l'avons vu prcdemment, les instructions de traitement


permettent de manipuler des donnes au niveau de registres. Alors que sur
x86, les mnmoniques correspondant aux instructions de traitement
pourront aussi tre utiliss pour les instructions de transfert, ce n'est pas le
cas sur ARM. Les instructions de traitement sont uniquement ddies aux
oprandes de type registre.
Une particularit des instructions de traitement sur ARM porte sur
l'utilisation de la deuxime oprande : cette oprande est associe un
registre de dcalage permettant d'effectuer un dcalage ou une rotation de
bits sur cette oprande.
Une oprande peut tre soit un registre, soit une valeur numrique appele
valeur immdiate.
Une valeur immdiate ne peut tre utilise que sur la dernire oprande de
l'instruction.
Les oprateurs de dcalages ne s'appliquent pas sur une valeur immdiate.

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

L'encodage d'une instruction ARM est strictement limit 32 bits (4 octets),


contrairement aux instructions x86 (nous ne considrons pas ici le mode Thumb du
processeur ARM qui possde des instructions de 16 bits).
L'encodage prsent cidessus montre bien un champ de bits servant stocker le
code de condition (s'il y en a un), le code opratoire (opcode), deux registres
pouvant faire partie des oprandes, ainsi qu'un champ rserv pour le stockage
d'une valeur immdiate.

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

Des arguments peuvent tre passs la macroinstruction. Dans ce cas, chaque


occurrence faisant rfrence aux arguments sera remplac par l'argument effectif
correspondant.
Les arguments sont prfixs avec le symbole "\" dans le corps de la macro.
Lorsqu'on utilise une macroinstruction, et que celleci est utilis diffrents
endroits dans le code source, il est toujours trs important de "visualiser" le texte en
sortie avant compilation. Si des labels sont utiliss dans le corps de la macro, ces
labels apparatront plusieurs reprises. Cela est permis sous certaines conditions
(labels numriques) et il faut tre prudent lorsque l'on s'y rfre.

26

Le code de gauche est traduit par le prprocesseur et le compilateur vers le code de


droite. Dans le code source, on remarque deux appels successifs la macro
macroABC, ce qui a comme consquence l'apparition de deux fois le label 1: et deux
fois le label 999: dans le code produit.
Il faut donc indiquer au compilateur quel label l'instruction se rfre, soit le
premier qui apparat en reculant (backward), soit celui qui apparat en avant
(forward). L'utilisation des lettres b et f accoles directement au label en suffixe
permet de dfinir la direction dans laquelle rechercher le label.

27

28

29

30

Das könnte Ihnen auch gefallen