Systèmes Embarqués 1 & 2 Jeu D'instructions Du µP ARM A.11 Assembler Instructions Handout

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 22

Systèmes Embarqués 1 & 2
a.11 - Jeu d’instrucons du µP ARM
Classes T-2/I-2 // 2018-2019
Daniel Gachet | HEIA-FR/TIC
a.11 | 16.11.2018
Contenu
Les instrucons de transfert
Load and Store instrucon
Les instrucons pour les opéraons arithméques et logiques
Arithmecal and logical instrucons
Les instrucons pour des boucles et des branchements
Loop and branch instrucons
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 2 / 22
Instrucon de transfert
On trouve 3 familles d’instrucons
Load pour les transferts de données de la mémoire vers le CPU
(registres Rx)
Move pour les transferts de données à l’intérieur du CPU (entre
registres Rx)
Store pour les transferts de données du CPU (registres Rx) vers la
mémoire
CPU Memory
I/O
ldr
(load)
mov
(move)
str
(store)
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 3 / 22
MOV Instrucons
MOV (move) place une donnée dans le registre desnaon. La
donnée peut être une valeur immédiate ou une donnée contenue
dans un autre registre. Elle peut être décalée (shied) avant d’être
stockée.
MOV{<cond>}{S} <Rd>, <shifter_operand>
Ulisaon
copie d’une donnée d’un registre vers un autre
mov r1, r4 // copie de la donnée contenue dans le
// registre R4 dans le registre R1
décalage ou rotaon sur un registre
mov r1, r1, lsl #5 // décale sur la gauche de 5 bits la donnée
// contenue dans le registre R1
retour de sous-roune en copiant l’adresse de retour (LR/R14) dans
le compteur ordinal (PC/R15)
mov pc, lr // retour de sous-routine si l’adresse a été
// précédemment sauvée dans le registre LR
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 4 / 22
”move”, d’autres instrucons…
MVN Copie le complément à 1 de la donnée
(inversion binaire de la valeur) MVN{<cond>}{S} <Rd>, <shier_operand>
MRS Copie la donnée d’un registre de statut
dans un registre général
MRS{<cond>} <Rd>, CPSR
MRS{<cond>} <Rd>, SPSR
MSR
Copie la donnée d’un registre général
dans les champs (c, x, s, f) d’un registre
de statut (CPSR current ou SPSR saved)
MSR{<cond>} CPSR_<fields>, #<immediate>
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>
<fields> :
c = control (bits 0..7)
x = extended (bits 8..15)
s = status (bits 16..23)
f = flags (bits 24..31)
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 5 / 22
MSR/MRS, un exemple…
Instrucons forçant le processeur en mode user (bit 4 – bit 0) du
CPSR (0b10000)
mrs r0,cpsr // read CPSR
bic r0,r0,#0xf // modify by removing current mode
msr cpsr_c,r0 // write the result back to CPSR
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 6 / 22
LDR Instrucon
LDR (load) charge le contenue d’une cellule mémoire à une adresse
donnée dans un registre général du CPU
LDR{<cond>} <Rd>, <addressing_mode>
Ulisaon
copie d’une constante dans un registre interne
ldr r0,=0x1201 // copie la constante 0x1201 dans le registre R0
copie d’une adresse dans un registre interne
ldr r4,=var // copie de la valeur de l’adresse de la
// variable var dans le registre R4
copie d’une donnée stockée en mémoire dans un registre général
ldr r1,[r4] // copie de la donnée stockée en mémoire à
// l’adresse contenue dans le registre R4 (var)
// dans le registre R1
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 7 / 22
”load”, une autre instrucon…
LDM
Transferts mulples de la mémoire vers
les registres. Ulisé pour restaurer de
manière conguë le contenu de plu-
sieurs registres préalablement stocké en
mémoire.
LDM{<cond>}<addr_mode> <Rn>{ !}, <registers>
dest : .long 101,102,103,104,105,106
ldr r9,=dest
ldmia r9 !,{r1-r6}
Modes d’adressage :
IA → increment aer
IB → increment before
DA → decrement aer
DB → decrement before
! → Mise à jour du registre <Rn> après opéraon
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 8 / 22
STR Instrucon
STR (store) transfert le contenu d’un registre général du CPU vers
une cellule mémoire à une adresse donnée
STR{<cond>} <Rd>, <addressing_mode>
Ulisaon
copie d’une donnée d’un registre général vers la mémoire
str r1,[r4] // copie de la donnée contenue dans le
// registre R1 vers l’adresse contenue
// dans le registre R4
stockage du PC (R15) comme adresse relave en mémoire
str pc,[r3] // copie l’adresse de PC, vers la position
// mémoire contenue dans le registre R3
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 9 / 22
store, une autre instrucon…
STM
Transferts mulples des registres vers
la mémoire. Ulisée pour sauvegarder
de manière conguë le contenu de plu-
sieurs registres dans la mémoire.
STM{<cond>}<addr_mode> <Rn>{ !}, <registers>
dest : .space 16*4
ldr r1,=1
ldr r2,=2
ldr r3,=3
ldr r4,=4
ldr r9,=dest
stmia r9 !,{r1-r4}
Modes d’adressage :
IA → increment aer
IB → increment before
DA → decrement aer
DB → decrement before
! → Mise à jour du registre <Rn> après opéraon
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 10 / 22
Instrucons arithméques et logiques
Les instrucons arithméques et logiques sont groupées en
plusieurs familles disnctes
Les instrucons arithméques (addion, soustracon et
mulplicaon)
Les instrucons logiques ( ET, OU, OU exclusif, test)
Les instrucons de comparaison
Format de ces opéraons
<opcode>{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
<opcode>: opération (mov, add, sub,…)
{<cond>} : condition d’exécution, optionnel
{S} : mise à jour des fanions après exécution, optionnel
<Rd>: 1ère opérande -> registre de destination
<Rn>: 2ème opérande
<shifter_operand>: 3ème opérande
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 11 / 22
Opéraons arithméques
ADD Addion de deux données
(Rd = Rn + shier_operand) ADD{<cond>}{S} <Rd>, <Rn>, <shier_operand>
ADC Addion de deux données en tenant
compte du carry ADC{<cond>}{S} <Rd>, <Rn>, <shier_operand>
SUB Soustracon de deux données
(Rd = Rn - shier_operand) SUB{<cond>}{S} <Rd>, <Rn>, <shier_operand>
SBC Soustracon de deux données en tenant
compte du carry SBC{<cond>}{S} <Rd>, <Rn>, <shier_operand>
RSB Soustracon inverse de deux données
(Rd = shier_operand - Rn) RSB{<cond>}{S} <Rd>, <Rn>, <shier_operand>
RSC Soustracon inverse de deux données
en tenant compte du carry RSC{<cond>}{S} <Rd>, <Rn>, <shier_operand>
ldr r0, =3583
ldr r1, =7620
add r2, r0, r1
→ R2 = R0 + R1 = 3583 + 7620
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 12 / 22
Addion avec Carry
Une addion avec carry permet de réaliser une addion sur 64 bits
R1 0x00000000 R0 0xffffffff
R3 0x00000000 R2 0x00000001
R5 0x00000001 R4 0x00000000
ldr r0,=0xffffffff
ldr r1,=0x0
ldr r2,=0x1
ldr r3,=0x0
adds r4,r0,r2
adc r5,r1,r3
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 13 / 22
Soustracon et soustracon inverse
Lopéraon de soustracon a un sens :
Rd = Rn – shier_operand
ldr r0, =50
ldr r1, =24
sub r2, r0, r1
→R2 = R0 – R1 = 50 – 24 = 26
Lopéraon de soustracon inverse change le sens des opérandes :
Rd = shier_operand – Rn
ldr r0, =50
rsb r2, r0, #24 →R2 = 24 – R0 = 24 – 50 = -26
La soustracon inverse permet d’obtenir le complément à 2 d’une
valeur contenue dans un registre
rsb r2, #0→R2 = 0 – R2 = -R2
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 14 / 22
Opéraons de mulplicaon
MUL Mulplicaon
32 bits x 32 bits → 32 bits
MUL <Rd>, <Rm>, <Rs>
→Rd = Rm * Rs
MLA Mulplicaon avec un accumulateur
32 bits x 32 bits → 32 bits + acc
MLA <Rd>, <Rm>, <Rs>, <Rn>
→ Rd = Rm * Rs + Rn
SMULL
Mulplicaon en valeurs signées
32 bits signés x 32 bits signés
→ 64 bits signés
SMULL <RdLo>, <RdHi>, <Rm>, <Rs>
→ RdLo = lower (Rm * Rs) → bits 31-0
→ RdHi = upper (Rm * Rs) → bits 63-32
UMULL Mulplicaon en valeurs non-signés
32 bits x 32 bits → 64 bits
UMULL <RdLo>, <RdHi>, <Rm>, <Rs>
→ RdLo = lower (Rm * Rs) → bits 31-0
→ RdHi = upper (Rm * Rs) → bits 63-32
Hormis ces quatre instrucons principales, le processeur
implémente également d’autres opéraons de mulplicaon
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 15 / 22
Opéraons logiques / booléennes
AND Réalise une opéraon ET logique bit à bit
entre deux opérandes AND{<cond>}{S} <Rd>, <Rn>, <shier_operand>
EOR Réalise une opéraon OU-Exclusif lo-
gique bit à bit entre deux opérandes EOR{<cond>}{S} <Rd>, <Rn>, <shier_operand>
ORR Réalise une opéraon OU logique bit à
bit entre deux opérandes ORR{<cond>}{S} <Rd>, <Rn>, <shier_operand>
BIC
Réalise un ET logique bit à bit entre une
valeur et le complément à 1 de la se-
conde
BIC{<cond>}{S} <Rd>, <Rn>, <shier_operand>
ldr r0, =0x11
ldr r1, =0x22
ldr r2, =0x44
ldr r3, =0x88
and r0, r0, #0x0f
orr r1, r1, #0x88
eor r2, r2, #0xf0
bic r3, r3, #0xf0
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 16 / 22
CMP Instrucon
CMP (compare) compare deux données. La première donnée vient
d’un registre. La deuxième peut être une valeur immédiate, une
donnée contenue dans un registre ou le résultat d’un décalage
avant la comparaison. CMP met à jour les condion flags à parr
du résultat de la soustracon de la deuxième donnée à la première.
CMP{<cond>} <Rn>, <shifter_operand>
<Rn> - <shifter_operand>
Ulisaon
comparaison d’un registre avec une valeur immédiate
cmp r1, #35 // compare la donnée contenue dans le
// registre R1 avec la valeur 35
comparaison de deux données contenues dans deux registres
cmp r1, r3 // compare les données contenues dans les
// registres R1 et R3
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 17 / 22
CMN Instrucon
CMN (Compare Negave) compare une donnée avec le
complément à 2 d’une deuxième donnée. La première donnée
vient d’un registre. La seconde peut être une valeur immédiate, une
donnée contenue dans un registre ou le résultat d’un décalage
préalable. CMN met à jour les condion flags à parr du résultat de
l’addion des deux données.
CMN{<cond>} <Rn>, <shifter_operand>
<Rn> - (0 - <shifter_operand>)
<Rn> + <shifter_operand>
Ulisaon
compare avec le complément à 2 d’une donnée
cmn r1, #35 // compare la donnée contenue dans le
// registre R1 avec la valeur -35
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 18 / 22
Autres instrucons de comparaison…
TST
Compare deux données et met à jour les
flags sur la base d’une opéraon AND lo-
gique
TST{<cond>}{S} <Rn>, <shier_operand>
TEQ
Compare deux données et met à jour les
flags sur la base d’une opéraon EOR (ou
exclusif)
TEQ{<cond>}{S} <Rn>, <shier_operand>
TST peut être ulisé afin de déterminer si au moins un bit contenu
dans une série est à un.
Exemple
ldr r0, =0x53
ldr r1, =0x04
tst r0, r1
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 19 / 22
Opéraons de branchement
B
Branchement par offset, valeur immé-
diate de 24 bits signés
→ PC = PC + offset « 2 + 8 → ±32MB
B <offset_24>
loop :
b loop
BX
Branchement direct par registre (p. ex.
pour le retour de sous-rounes)
→ PC = Rm & 0xffff’fffe
BX <Rm>
roune :
bx lr
BL
Branchement par offset et sauvetage de
l’adresse de la prochaine instrucon à
exécuter (adresse de retour), pour appel
de sous-rounes
→ LR = PC + 4
→ PC = PC + offset « 2 + 8 → ±32MB
BL <offset_24>
bl roune
BLX
Branchement et sauvetage de la pro-
chaine adresse à exécuter, pour appel in-
direct de sous-rounes
→ LR = PC + 4
→ PC = Rm & 0xffff’fffe
BLX <Rm>
ldr r1,=roune
blx r1
Chaque branchement peut s’exécuter de manière condionnelle
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 20 / 22
Branchements condionnels
Pour effectuer un branchement condionnel, il suffit d’ajouter les 2
caractères de la condion à l’opéraon de branchement
B<cc> label ou BLX<cc> R1
Mnemonic Descripon
AL Always (AL normally omied)
EQ (Z==1) Equal
NE (Z==0) Not equal
CS (C==1) Carry Set
CC (C==0) Carry Clear
MI (N==1) Negave (minus)
PL (N==0) Posive or zero (plus)
VS (V==1) Overflow
VC (V==0) No overflow
Mnemonic Descripon
HI > Unsigned higher
HS >= Unsigned higher or same
LS <= Unsigned lower or same
LO < Unsigned lower
Mnemonic Descripon
GT > Signed greater than
GE >= Signed greater than or equal
LE <= Signed less than or equal
LT < Signed less than
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 21 / 22
Exemple de boucle
// C-code
#define CONSTANT 10
int sum =CONSTANT ;
for (int i=0 ; i<CONSTANT ; i++) {
sum += i ;
}
// Assembler-code
ldr r3, =10
ldr r2, =0
b test
loop : add r3, r3, r2
add r2,#1
test : cmp r2,#10
blo loop
sum=10'
i'='0'
i'<'10'
sum'+='i'
i'++'
Yes
No
[Gac/a.11] T-2/I-2 // 16.11.2018 Systèmes Embarqués 1 & 2 - Jeu d’instrucons du µP ARM 22 / 22

Navigation menu