Cours 8 Architectures &
Systèmes- introduction à l’ARM
Jalil Boukhobza
LC 206
[email protected]
02 98 01 69 73
09/03/2015 Jalil Boukhobza 1
Plan du cours
1. Introduction
2. Versions et implémentations
3. Caractéristiques
4. Jeu d’instruction
5. Cycles d’exécution
6. Techniques de programmation
09/03/2015 Jalil Boukhobza 2
Ventes de l’ARM
http://chipdesignmag.com/sld/schirrmeister/2012/04/24/processor-architecture-enablement-betting-on-the-right-processor/
09/03/2015 Jalil Boukhobza
Introduction
ARM (Advanced Risc Machines): à l’origine Acorn Computer,
société anglaise
Concepteur d’ordinateur, 1er succès: ordinateur familial BBC
en 1982 (6502 proc 8 bits équipant le Apple II, 32KO de RAM
et cassettes…)
1983: début de travail sur la première version de l’ARM:
l’ARM1 (S. Furber, R. Wilson, et R. Heaton.
Objectif: proc 32bits RISC
Instruction de longueur fixe
Modèle Load/Store: opérations d’accès à la mémoire, sinon
instructions de calcul sur registres
Vu le jour en 1985 dans les VLSI Tech (25000 transistors).
09/03/2015 Jalil Boukhobza 4
Introduction, historique
ARM2: Archimède, 1987
Multiplication et multiplication/addition (traitement de
signal)
Interface co processeur pour le calcul flottant
Archimède, ARM2 à 8MHz
ARM: fondée en 1990: Apple, VLSI Technology,
Acorn Computer:
Définir un nouveau standard de processeur à faible
consommation et à faible coût
Premier développement: l’ARM6 (cœur version 3)
Adressage 32 bits, co processeur flottant, contrôleur vidéo.
09/03/2015 Jalil Boukhobza 5
Introduction -3-
Quelques caractéristiques:
Taille d’instructions fixe (32 bits)
Un banc de registres à usage général (32 bits)
Décodage des instructions câblé
Une exécution pipelinée (nombre d’étages dépend des versions)
Objectif d’exécution de 1 (CPI=1)
ARM fourni les cœurs de processeur, les industriels peuvent y
adjoindre des modules supplémentaires pour:
Support d’instructions de multiplication longues (64 bits de résultat)
Instructions spécifique au traitement de signal
Modules de débogage pour tracer l’exécution pas à pas
09/03/2015 Jalil Boukhobza 6
ARM Cortex A8
(ARM7)
09/03/2015 Jalil Boukhobza 7
Versions et implémentation
Version 1: ARM1
pas vraiment commercialisée (quelques centaines d’exemplaires)
Version 2: ARM2
27 registres (16 accessibles simultanément)
4 modes de fonctionnement (mode utilisateur avec certaines ressources non
disponibles, mode interruption pour gérer les interruptions externes, mode
interruption rapide avec plus de ressources dédiées, mode superviseur pour
l’exécution du système d’exploitation)
Pipeline d’exécution à trois étage (lecture, décodage exécution)
8MHz, 4 à 5 MIPS
Version 2aS: ARM250 et ARM3
Ajout d’un cache unifié (données et instructions) de 4KO
Ajout d’une instruction d’échange de données monolithique et atomique entre un
registre et la mémoire (environnement multiproc)
Version mise en œuvre dans l’ARM3 (26 à 33MHz) et ARM250 (12MHz)
09/03/2015 Jalil Boukhobza 8
Versions et implémentation -2-
Version 3: ARM6, et ARM7
Véritable adressage 32bits
Ensemble de registres pour le maintient de l’état du processeur
ARM6: plusieurs variantes (co processeur, gestionnaire de la mémoire, cache
modifié, etc.), 26-33 MHz,
ARM7 fonctionnellement identique à l’ARM6 mais avec des fréquences plus
élevées, cache énergétiquement plus performant, meilleure gestion de la mémoire
(TLB), 40MHz et plus
Version 4: ARM8, ARM9 et StrongARM
Certaines version optionnelles dans la v3 sont intégrées dans la v4: multiplication
étendue, etc.
Pipeline 5 étages: Lecture instruction décodage, exécution, mémoire et écriture
registre.
ARM8: ARM7 + unité d’exécution spéculative, politique d’écriture retardée pour le
cache, mult 64 bits, 80MIPS à 80MHz
StrongARM: cache Harvard: données et instructions séparé, 100-200MHz
ARM9: ARM8 + cache Harvard
09/03/2015 Jalil Boukhobza 9
Versions et implémentation -3-
Version 5: ARM10, XScale
V4 + instructions supplémentaires, unités d’exécution multiples, pipeline
à 6 étages
ARM10: 2*32KO de cache, gestionnaire de mémoire compatible avec les
OS embarqués, 4000MIPS, 350 MHz
Intel Xscale: gestion de plusieurs périphériques, jusqu’à 624MHz
Version 6: ARM11
Amélioration multimédia, extension SIMD (Single Instruction Multiple
Data stream), support multiprocesseurs, pipeline 8 étages, unité de
prédiction de branchement.
…. http://en.wikipedia.org/wiki/List_of_ARM_microprocessor_cores
09/03/2015 Jalil Boukhobza 10
ARM7TDMI (ARM v3)
09/03/2015 Jalil Boukhobza 11
Architecture du processeur
ARM7
Source: J. Jorda, « Processeurs ARM, Architecture et
Langage d’assemblage », Dunod, 2010
09/03/2015 Jalil Boukhobza 12
Quelques caractéristiques
Données manipulées:
Word: (long du 68K) 32bits
Halfword (Word du 68K) 16bits
Byte: octet
Pas de contrainte sur le fait d’être Big ou little endian (les 2
sont possibles, ex. ARM7TDMI)
Communication avec les périphériques via un mécanisme de
mapping mémoire
09/03/2015 Jalil Boukhobza 13
Le banc de registres
31 registres généraux 32 bits (bancs de registres)
6 registres d’état
Seul 16 registres généraux et 2 d’état sont visibles à un
instant donné: masquage en fonction du mode de
fonctionnement
2 catégories de registres généraux:
R0 à R7: jamais masqués, utilisé par n’importe quelle instruction,
visible par n’importe quel mode.
R8 à R14: versions particulières possibles en fonction du mode
de fonctionnement
R14: contient l’@ de l’instruction exécutée à la suite de l’appel
à une fonction (A7 dans le 68k) avec BL (Branch & link)
R15: compteur de programme
09/03/2015 Jalil Boukhobza 14
09/03/2015 Jalil Boukhobza 15
Registres d’états
Current Program Status Register (CPSR): registre d’état accessible
dans tous les modes, à l’inverse du Saved Program Status Register
(SPSR) accessible seulement dans le mode d’exception (mode
privilégié).
N Z C V Q I F T M4 M3 M2 M1 M0
Code de condition Réservé Bits de contrôle
Bits de contrôle:
Modifié lorsqu’une exception se produit ou explicitement via un prog. (mode
privilégié)
I & F: désactiver les interruptions, T: passer au jeu d’instruction Thumb (plutôt
qu’ARM), M: détermine le mode de fonctionnement
09/03/2015 Jalil Boukhobza 16
Jeu d’instructions standard
ARM7
Instructions de contrôle: branchements
Instructions de traitement de données
(arithmétiques et logiques)
Instructions de manipulation de
registres
Autres instructions (divers)
09/03/2015 Jalil Boukhobza 17
Exécution conditionnelle
(presque) Toutes les instructions
peuvent s’exécuter en fonction
d’une condition particulière.
Chaque instruction possède 4 bits (28-
31) pour décrire cette condition
16 valeurs possibles
Ex: ADDEQ r5,r5,r6 ; r5=r5+r6 si Z
Positionner le registre de code de
condition avec l’instruction CMP
(pas la seule à le positionner)
(presque) Toutes les instructions
permettent de modifier le CPSR, à
condition de les faire suivre d’un
« S »: MOVS R0, #4
Source: J. Jorda, « Processeurs ARM, Architecture et
Langage d’assemblage », Dunod, 2010
09/03/2015 Jalil Boukhobza 18
Instructions de branchement
Branchement court: @ actuelle +/- 32MO
modif du PC (regitre R15)
Branchement long: n’importe quelle @ (4GO)
Chargement de la mémoire dans PC (R15)
Possibilité de sauvegarde de la valeur de PC (avant saut)
dans le LR (Link register - R14) pour implémenter un appel de
fonction (pile)
Branchement simple: B(branch)
B<cond> <@ cible> (BEQ ATTENTE)
Appel de fonction/sous programme
BL<cond> <@ cible>
Retour possible avec MOV PC, R14 (notez le sens inverse par
rapport au 68K: destination, source)
09/03/2015 Jalil Boukhobza 19
Instructions de traitement de
données
2 opérandes dont une en registre (au moins)
11 Modes d’adressage (3 catégories)
Immédiat: #<valeur immédiate>
Par registre: <Rm> registre à utiliser
Par registre avec décalage: utilisation de la valeur d’un
registre décalée
Les assignations: MOV MVN (move not)
MOV{<cond>}{S} <Rd>, <shifter_operand>: cond:
condition du move, S: modif du CPSR, Rd: registre
destination, <shifter_operand>: 2nd opérande
09/03/2015 Jalil Boukhobza 20
Instruction de traitement -2-
Instructions d’addition(ADD)/soustraction(SUB):
ADD, ADC (avec retenue), SUB, RSB (inverser l’ordre des
opérandes), SBC (avec retenue), RSC (SBC et RSB)
ADD{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
SUB{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
Instruction logiques: AND, OR, EOR, BIC (Bit Clear)
AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
BIC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
Et logique avec négation préalable du 2ème opérande
09/03/2015 Jalil Boukhobza 21
Instruction de traitement -3-
Instruction de comparaison: CMP, CMN (compare negative), TST (Test), TEQ
(Test Equivalence)
CMP (CMN) mise à jour du CPSR par soustraction (addition)
TST (TEQ) mise à jour du CPSR par un ET(XOR) logique
CMN{<cond>} <Rn>, <shifter_operand>
CMP{<cond>} <Rn>, <shifter_operand>
TEQ{<cond>} <Rn>, <shifter_operand>
TST{<cond>} <Rn>, <shifter_operand>
Instructions de multiplication: multiplications normales (32bits) et
longues (64 bits)
MUL: multiplication classique,
MUL{<cond>}{S} <Rd>, <Rm>, <Rs>
MLA (Multiply & accumulate):
MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn> (Rn valeur à additionner au résultat)
UMULL (Unsigned MUL Long)
UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> (2 registres résultats: poids fort et poids faible)
UMLAL, SMULL, SMLAL
09/03/2015 Jalil Boukhobza 22
Instructions de
chargement/rangement
Modes d’adressage des instruction à accès mémoire
Adressage avec déplacement simple
Contenu d’un registre comme @
Déplacement sur 12 bits
[<Rn>, #+/-<offset_12>], [<Rn>, #+/-<Rm>], [<Rn>, #+/-<Rm>,
{LSL|LSR|ASR|ROR|RRX} #<shift_imm>]
Adressage avec déplacement pré-indexé
@ avec déplacement simple + sauvegarde de l’@ visée dans le registre:
R0=0x2100, [R0, #0x24]! Accéder à @ 0x2124 et stockage dans R0.
Adressage avec déplacement post-indexé
Crochet fermant juste après le registre: [R0], #0x24 accès à l’@ 0x2100 et
puis stockage de 0x2124 dans R0
Instruction de chargement/rangement simples: LDR et STR
STR{<cond>}{B} <Rd>, <adressing_mode> (ATTENTION ordre opérandes,
destination est la mémoire, dernier opérande)
09/03/2015 LDR{<cond>}{B} <Rd>, <adressing_mode>
Jalil Boukhobza ({B} transfert à lieu sur un octet) 23
Instructions de
chargement/rangement -2-
Instructions de chargement/rangement de demi-mot et de chargement
signées
Manipuler des demi-mots et des octets
LDRH (Load half word): LDR{<cond>}H <Rd>, <addresssing_mode_special> (pas
d’accès par registre décalé, remplissage du reste du registre par des 0)
STRH (même syntaxe)
LDRSB (Load register Signed Byte): LDR{<cond>}SB <Rd>,
<addressing_mode_special> (complétion par le bit de signe)
LDRSH (Load register Signed Halfword)
Les instructions de chargement/rangement par bloc: LDM (Load
Multiple) et STM (Store Multiple)
Modif de l’@ de base: 4 modes IA (Increment After), IB (Increment Before), DA
(Decrement After), DB (Decrement Before)
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers> (registres dans des
accolades séparés par des virgules)
STM {<cond>}<addressing_mode> <Rn>{!}, <registers> (ATTENTION ordre des
opérandes)
09/03/2015 Jalil Boukhobza 24
Instructions diverses
Pseudo instructions ADR (load address) et LDR (Load register)
Traduites par l’assembleur en instructions ARM7 (LEA du 68k)
ADR{<cond>} <Rd>, <etiquette>
LDR{<cond>} <Rd>, =[<valeur> | <etiquette>]
Les directives de compilation
.int: allocation d’un ou plusieurs mots de 32bits et initialisation (.byte et
.word)
{<label>} .int <expression>{,<expression>}
TAB .int 1, 2, 3, 4
.fill: effectuer une reservation mémoire avec initialisation eventuelle
{<label>} .fill <repeat>{, <size>{, <value>}}
Test .fill 10, 1, 0 (remplir 1 éléments d’1 octet de zéros)
.equ: associer une expression à un symbole
{<label} .equ <expression>
09/03/2015 Jalil Boukhobza 25
Codage des instructions
Instructions sur 32 bits, le format général est le suivant:
http://aelmahmoudy.users.sourceforge.net/electronix/arm/chapter2.htm
09/03/2015 Jalil Boukhobza 26
Exemple de programme
LDR R1, [R0] @récupération du premier mot
LDR R3, [R2] @ récupération du second mot
ADD R5, R3, R1 @addition des valeurs
STR R5, [R4] @ rangement du résultat
Le code hexa:
E5901000
E5923000
E0835001
E5845000
Pour l’instruction de chargement: I=0 (donc
@age immédiat, P=1 donc pas de post index,
W=0 pas de mise à jour du reg. de base. U=1:
offset ajouté à la base (peu importe dep.=0),
B=0accès par mot et non par octet, L=1 donc un
load.
09/03/2015 Jalil Boukhobza 27
http://aelmahmoudy.users.sourceforge.net/electronix/arm/chapter2.htm
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
Cycles d’exécution STR R5, [R4]
États initiaux des registres:
R0=0x3000
R2=0x3004
R4=0x300C
Programme mis en mémoire à
l’@ 0x2000
1- chargement de la première
instruction
incrémentation du PC
09/03/2015 Jalil Boukhobza 28
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
2- Le premier LDR passe en
décodage
et chargement de la 2ème
instruction
incrémentation du PC
09/03/2015 Jalil Boukhobza 29
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
3- Le premier LDR passe en contrôle
(1er cycle d’exécution: calcul de l’@)
Le deuxième LDR passe en
décodage
chargement de la 3ème instruction
incrémentation du PC
09/03/2015 Jalil Boukhobza 30
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
4- Le premier LDR reste en contrôle
(2ème cycle d’exécution: accès à la
mémoire)
L’étage de contrôle n’étant pas
libéré, pas d’évolution pour les 2
autres instructions
09/03/2015 Jalil Boukhobza 31
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
5- Le premier LDR reste en contrôle
(3ème cycle d’exécution: écriture de
la données dans le registre
destination)
L’étage de contrôle n’étant pas
libéré, pas d’évolution pour les 2
autres instructions
09/03/2015 Jalil Boukhobza 32
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
6- Le deuxième LDR passe en
contrôle (1er cycle d’exécution: calcul
@ mémoire)
l’instruction ADD passe à l’étage
décodage
l’instruction STR est chargée en
mémoire
09/03/2015 Jalil Boukhobza 33
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
7- Le deuxième LDR reste en
contrôle (2ème cycle d’exécution:
accès à la mémoire)
L’étage de contrôle n’étant pas
libéré, pas d’évolution pour les 2
autres instructions
09/03/2015 Jalil Boukhobza 34
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
8- Le deuxième LDR reste en
contrôle (3ème cycle d’exécution:
écriture de la données dans le
registre destination)
L’étage de contrôle n’étant pas
libéré, pas d’évolution pour les 2
autres instructions
09/03/2015 Jalil Boukhobza 35
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
9- L’instruction ADD accède à l’étage
de contrôle, R3 et R1 vers UAL,
résultat dans R5
STR passe dans l’étage
décodage
Nouvelles instruction chargée dans
la mémoire
09/03/2015 Jalil Boukhobza 36
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
10- STR passe à l’étage contrôle (1er
cycle d’exécution: calcul de l’@
d’écriture du résultat, R4+0)
suite du pipeline
09/03/2015 Jalil Boukhobza 37
LDR R1, [R0]
LDR R3, [R2]
ADD R5, R3, R1
STR R5, [R4]
11- STR reste à l’étage contrôle (2ème
cycle d’exécution: écriture en
mémoire à l’@ calculée)
suite du pipeline
09/03/2015 Jalil Boukhobza 38
Techniques et programmation
assembleur
La condition: Les boucles:
Si R0>R1 TantQue R0>R1
Instruction 1 Instruction 1
Instruction 2 Instruction 2
... ...
FinSi FinTantQue
Donne: Exemple:
CMP R0, R1 @R0-R1 TANTQUE: CMP R0, R1 @R0-R1
BGT ALORS BGT BOUCLE
BFINSI B FINTQ
ALORS: … BOUCLE: …
FINSI: … B TANTQUE
FINTQ: …
Sinon:
CMP R0, R1
Sinon:
BLE FINSI TANTQUE: CMP R0, R1 @R0-R1
… BLE FINTQ
FINSI: … …
B TANTQUE
FINTQ: …
09/03/2015 Jalil Boukhobza 39
i=0; s=0;
Tantque i<n
s=s+tab[i]
Mémoire et tableaux i++;
FinTanque
Si on a des mots ou demi mots
N .equ … @val de N
N .equ … @val de N TAB .int … @N valeurs
TAB .byte … @N valeurs Programme:
Programme: ADR R0, TAB @ @ de tab dans R0
ADR R0, TAB @ @ de tab dans R0 MOV R1, #0 @ i=0
MOV R1, #0 @ i=0 MOV R2, #0 @ s=0
MOV R2, #0 @ s=0 TQ: CMP R1, #N*4 @ i-N
TQ: CMP R1, #N @ i-N BCS FinTQ @i>=N
BCS FinTQ @i>=N LDR R3, [R0, R1] @ R3=*(tab+i)
LDRB R3, [R0, R1] @ R3=*(tab+i) ADD R2, R2, R3 @ R2=R3+R2
ADD R2, R2, R3 @ R2=R3+R2 ADD R1, R1, #4 @i++
ADD R1, R1, #1 @i++ B TQ @ boucle au début
B TQ @ boucle au début FinTQ:…
FinTQ:…
09/03/2015 Jalil Boukhobza 40
i=0; s=0;
Tantque i<n
s=s+tab[i]
Mémoire et tableaux -2- i++;
FinTanque
N .equ … @val de N N .equ … @val de N
TAB .int … @N valeurs TAB .int … @N valeurs
Programme: Programme:
ADR R0, TAB @ @ de tab dans R0 ADR R0, TAB @ @ de tab dans R0
MOV R1, #0 @ i=0 MOV R1, #0 @ i=0
MOV R2, #0 @ s=0 MOV R2, #0 @ s=0
MOV R4, #0 @ index du tableau TQ: CMP R1, #N @ i-N
TQ: CMP R1, #N @ i-N BCS FinTQ @i>=N
BCS FinTQ @i>=N LDR R3, [R0, R1, LSL #2] @ R3=*(tab+(i<<2))
LDR R3, [R0, R4] @ R3=*(tab+i) ADD R2, R2, R3 @ R2=R3+R2
ADD R2, R2, R3 @ R2=R3+R2 ADD R1, R1, #1 @i++
ADD R1, R1, #1 @i++ B TQ @ boucle au début
ADD R4, R4, #4 @ index=index+4 FinTQ:…
B TQ @ boucle au début
FinTQ:…
09/03/2015 Jalil Boukhobza 41
i=0; s=0; a=tab;
Tantque i<n
s=s+(a)
Pointeurs i++;
a++
FinTanque
Utilisation de pointeur sans indice i
N .equ … @val de N TAB .int elt1, elt2… @N valeurs
TAB .int … @N valeurs FTAB
Programme: Programme:
ADR R0, TAB @ @ de tab dans R0 ADR R0, TAB @ @ de tab dans R0
MOV R1, #0 @ i=0 MOV R2, #0 @ s=0
MOV R2, #0 @ s=0 TQ: CMP R0, #FTAB @ TAB-FTAB
TQ: CMP R1, #N @ i-N BCS FinTQ @i>=N
BCS FinTQ @i>=N LDR R3, [R0], #4 @ dép. imm. Post index
LDR R3, [R0] @ R3=*(tab+i), sinon ADD R2, R2, R3 @ R2=R3+R2
@ LDR R3, [R0], #4 dép. imm. Post inc. B TQ @ boucle au début
ADD R2, R2, R3 @ R2=R3+R2 FinTQ:…
ADD R1, R1, #1 @i++
@ ligne suivante inutile si @ dep. Imm. Post inc
ADD R0, R0, #4 @ index=index+4
B TQ @ boucle au début
FinTQ:…
09/03/2015 Jalil Boukhobza 42
Gestion de la pile
Base Base
Pile Pile
Nelle valeur utilisée utilisée
Taille de Taille de
Sommet Sommet
la pile la pile Nelle valeur
Pile Pile
utilisée utilisée
Base Base
Num
@
Pile « full ascending » Pile « full descending »
Base Base
Pile Pile
Sommet utilisée utilisée
Taille de Nelle valeur
Taille de Nelle valeur
Sommet Sommet
la pile la pile Sommet
Pile Pile
utilisée utilisée
Base Base
09/03/2015 Jalil Boukhobza 43
Pile « empty ascending » Pile « empty descending »
Gestion de la pile -2-
Pile « full ascending »
Empilement: incrémentation préalable du pointeur de pile
Dépilement: décrémentation du pointeur de pile après récup de la valeur
Pile « full descending » (68K)
Empilement: décrémentation préalable
Dépilement: incrémentation après récup.
Pile « empty ascending »
Empilement: Incrémentation après rangement
Dépilement: décrémentation préalable
Pile « empty descending »
Empilement: décrémentation après rangement
Dépilement: incrémentation préalable
09/03/2015 Jalil Boukhobza 44
Gestion de la pile -3-
Pas de registre spécifique pour l’@ du sommet de
la pile ou sa taille
R13: registre de sommet de la pile (convention)
Pas d’instruction spécifique à la gestion de la pile
de type PUSH et POP, utilisation des instructions
de chargement et de rangement par blocs:
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
(registres dans des accolades séparés par des viorgules)
STM {<cond>}<addressing_mode> <Rn>{!}, <registers>
09/03/2015 Jalil Boukhobza 45
Gestion de la pile -4-
Opération PUSH POP
Pile « full asending »
Empilement: incrémentation préalable du Full STMIB LDMDA
pointeur de pile Ascending (Inc. Before) (Dec. After)
Dépilement: décrémentation du pointeur de Full STMDB LDMIA
pile après récup de la valeur Descending (Dec. Before) (Inc. After)
Pile « full descending »
Empty STMIA LDMDB
Empilement: décrémentation préalable Ascending (Inc. After) (Dec. Before)
Dépilement: incrémentation après récup.
Empty STMDA LDMIB
Pile « empty ascending »
Descending (Dec. After) (Inc. Before)
Empilement: Incrémentation après rangement
Dépilement: décrémentation préalable
Pile « empty descending » Afin de simplifier l’usage des
Empilement: décrémentation après piles, 4 modes d’@age ont
rangement été ajouté: FA (Full Asc.), FD
Dépilement: incrémentation préalable (Full Des.), EA (Empty Asc.)
et ED (Empty Des.)
09/03/2015 Jalil Boukhobza 46
Exemple d’utilisation de la pile
Permutation de contenu de @ initialisation du pointeur de pile R13
registres R0 à R9: Ri <->R(9-i) DEBUT: MOV R13, #0x20000
i entre 0 et 4 @ Empilement des 10 registres
STMFD R13!, {R0, R1, R2, R3, R4, R5, R6, R7, R8, R9}
Pile en « Full Descending » @ récupération des valeurs
LDMFD R13!, {R9} @charge R9 avec le contenue
qui commence à l’@ 0x20000, de la mémoire ) l’@ donnée par R13 et mise à jour de R13
donc empilement avec LDMFD R13!, {R8}
STMFD et LDMFD LDMFD R13!, {R7}
LDMFD R13!, {R6}
LDMFD R13!, {R5}
LDMFD R13!, {R4}
LDMFD R13!, {R3}
LDMFD R13!, {R2}
LDMFD R13!, {R1}
LDMFD R13!, {R0}
09/03/2015 FIN: Jalil Boukhobza 47
@ initialisation du pointeur de pile R13
…
DEBUT: MOV R13, #0x20000
@ récupération des valeurs
@ Empilement des 10 registres
LDR R9, [R13, #0]
STMFD R13!, {R0, R1, R2, R3, R4, R5, R6, R7, R8, R9} LDR R8, [R13, #4]
@ récupération des valeurs LDR R7, [R13, #8]
LDR R9, [R13], #4 @R13 =R13+4 …
LDR R8, [R13], #4 FIN:
LDR R7, [R13], #4
LDR R6, [R13], #4
LDR R5, [R13], #4
LDR R4, [R13], #4
LDR R3, [R13], #4
LDR R2, [R13], #4
LDR R1, [R13], #4
LDR R0, [R13], #4
FIN:
09/03/2015 Jalil Boukhobza 48