Assembleur (Arm)
Assembleur (Arm)
Assembleur (Arm)
1
Introduction (1)
Le cours d’architecture a illustré la conception d’un microprocesseur avec pour
outil de modélisation les FSM
le mot placé dans IR (mot instruction) contient toute l’information sur le travail
a accomplir (+ opérandes)
Comment éviter l’écriture directe du mot instruction + opérande
(ex : E1A0 0271) pour coder un algorithme ?
utilisation d’un mnémonique + opérandes réduisant l’effort de codage (ex :
movnes R0,R1,ROR R2 )
le mnémonique + op n’est qu’une représentation différente de la même
information
le microprocesseur n’utilise que la première représentation, c’est l’opération
d’assemblage qui traduit (c’est un compilateur qui génère un code du premier
type) le code assembleur en code machine
2
Introduction (2)
3
Points clefs du ARM
• Architecture load-store
• Instructions de traitement à 3 adresses
• Instructions conditionnelles (et branchement)
• Load et store multiples
• APCS (ARM Procedure Call Standard)
• En un cycle horloge: opération ALU+shift
• Interfaçage avec coproc. simplifié (ajout de registres, de type, …)
• Combine le meilleur du RISC et du CISC
• On le trouve dans la GBA, routeurs, Pockets PC, PDA, …
4
Que manipule-t-on ?
• Des registres
• Des adresses
• Des données
• Des instructions assembleurs (32 bits)
• Des directives
• Des pseudo-instructions
5
6
Des registres (mode User)
R0 16 Registres de 32 bits :
R1
R2
• R0-R10, R12 : généraux
R3 • R11 (fp) Frame pointer
R4
• R13 (sp) Stack pointer
R5
R6
• R14 (lr) Link register
R7 • R15 (pc) Program counter
R8
R9
R10
R11
R12
• Current Program Status Register
R13
R14
31 28 27 8 7 6 5 4 0
R15
7
Des adresses et données
• 232 bytes de mémoire maxi
• Un word = 32 bits
• Un half-word = 16 bits
• Un byte = 8 bits
• Little endian (0x01AA Ad+ AA 01)
• En hexa (0x0F), déc (15), bin (0b00001111)
8
Organisation mémoire
bit31 bit0
23 22 21 20
19 18 17 16
word16
15 14 13 12
Half-word14 Half-word12
11 10 9 8
word8
7 6 5 4
Byte6 Half-word14
3 2 1 0
byte3 byte2 byte1 byte0 adresse
9
Chaque
instruction est
codée sur 32 bits
(uniquement) !!!
10
Cond (toutes les instructions !)
11
OpCode (data processing)
12
Environnement de Prog.
.text directive ldrb R0,te
.globl _main ldrb R1,boul
adc R0,R0,R1
_start: label strb R0,gom
b _main
_main:
code op opmrs R0,CPSR opérandes
13
Environnement de Prog.
14
ARM-meste-2005 15
Les directives principales
Les directives sont des intructions pour l’assembleur (compilateur)
uniquement, elles commencent par « . ».
• .align: permet d’aligner en mémoire des données de types différents
.byte 0x55
.align sinon erreur à l’assemblage
.word 0xAA55EE11
• .ascii: permet de saisir des caractères (sans le NULL)
. ascii "JNZ" insère les octets 0x4A, 0x4E, 0x5A
• .asciz: comme .ascii mais insère à la fin le caractère NULL
. Asciz "JNZ" insère les octets 0x4A, 0x4E, 0x5A, 0x00
16
Les directives principales
• .byte: déclare une variable type octet et initialisation
var1: .byte 0x11
var2: .byte 0x22,0x33
• .hword: déclare une variable type deux octets et initialisation
var3: .hword 0x1122
var4: .hword 0x44
• .word: déclare une variable type word (32bits) et initialisation
var5: .word 0x11223344
• .space: déclare une variable de taille quelconque (pas d’ initialisation)
var6: .space 10 réserve 10 octets
17
Les directives principales
• .equ: associe une valeur à un symbol
.equ dix, 5+5
mov R3,#dix
• .global (ou .globl): l’étiquette (symbol) est visible globalement
.global _start _start est reconnue par le linker GNU
_start doit apparaître le code principal
• .text, .data, .bss : début de section text, data, bss (pour le linker)
• .end : fin du code source
• .ltorg : insère « ici » les constantes temporaires pour LDR =
ldr R1,=0x11111111
.ltorg
18
Pseudo-instructions
• NOP: No operation. En ARM est remplacé par MOV R0,R0
19
Pseudo-instructions
REM: l’adresse de var3 est connue par l’assembleur, on peut mieux faire
20
Pseudo-instructions
• ADR : charge dans un registre l’adresse d’une variable (load/store)
adr R4, var5 add R4,PC,#4 (des fois sub !!!)
ldr R6,[R4]
nop
var5: .word 0xBBBBBBBB
21
Module de décalage
Cela s’explique grâce au registre à décalage
-Permet
C’est l’ALUdes MUL rapides
22
Module de décalage
0xFF:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0
0xFF ror #1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0
23
Module de décalage
Et ainsi: 1024, 1040, …, 4080 [0x400-0xFF0]=[0x40-0xFF] ROR #28
4096, 4160, …, 16320 [0x1000-0x3FC0]=[0x40-0xFF] ROR #26
Ex:
mov R1, #0x1000 mov R1,#40,26 (pas une vraie syntaxe)
mov R2, #0xFFFFFFFF mvn R2,#0
mov R2, #0x11111111 génère une erreur !!!
ldr R2, # 0x11111111 on a déjà vu, pas d’erreur
24
Module de décalage
Remplace un MUL avantageusement (MOV, ADD, SUB, RSB)
Ex1: R0 = R1*5
R0 = R1+(R1*4)
add R0, R1, R1 lsl #2
Ex2: R2 = R3*105
R2 = R3*15*7
R2 = R3*(16-1)*(8-1) R2=(R3*16) - R3 puis R2=(R2*8)-R2
rsb R2, R3, R3, lsl #4 puis rsb R2, R2, R2, lsl #3
N’est pas remplacé par l’Assembleur !!!
25
Instructions
26
Instructions
Règles pour le traitement des données:
• Les opérandes sont 32 bits, constantes ou registres
• Le résultat 32 bits dans un registre
• 3 opérandes: 2 sources et 1 destination
• En signé ou non signé
• Peut mettre à jour les Flags (S)
• Le registre destination peut être un des registres sources
27
Instructions (Data Flow)
• Des LDR (indirect pour source), STR (indirect pour destination)
• Des MOV (constantes ou registre)
Les LDR sont souvent remplacés par des MOV (sauf adressage indirect)
28
Instructions (Data Flow)
En fait LDR/STR
• LDR/STR simple (un seul registre)
• SWAP simple
• LDR/STR multiple (une liste de registres)
29
Instructions (Data Flow)
Si R1 « pointe » (ADR R1,tab) sur une zone mémoire (vecteur, matrice)
Rem: une zone mémoire = vecteur, matrice, tableau, …
30
Instructions (Data Flow)
? Rem: [R1,#4]
ne modifie pas R1
31
Instructions (Data Flow)
• Si on veut modifier R1 « automatiquement » auto-incrémentation
LDRH R0, [R1,#2]! R0=mem16[R1+2] puis R1=R1+2
32
Instructions (Data Flow)
Résumé:
33
Instructions (Data Flow)
Encore plus complexe : format Word
34
Instructions (Data Flow)
Un LOAD/STORE particulier: SWAP
SWP R1,R2,[R3]
1. R1 mémoire[R3]
2. mémoire[R3] R2
35
Instructions Logiques
Elles opèrent bit à bit
(Elles sont très utilisées pour les E/S)
36
Instructions Logiques
• LSR: logical shift right
C
0
37
Instructions Arithmétiques
• Elles permettent l’addition, la soustraction, la multiplication
• Elles peuvent prendre en compte le flag C (retenue) et le mettre à jour
-multiplications
38
Multiplications
39
Instructions Arithmétiques
Un exemple de MLA:
40
Instructions Arithmétiques
CMP R1,#5 R1-5 : les flags sont mis à jour, résultat non stocké
41
Inst./struct. de contrôles
42
Inst./struct. de contrôles
If: CMP R0,R1 CMP Rn,<Operand2
If Then Else:
BHS Else
If R0 < R1
Then:
Then
B Endif
Else Else:
Endif:
43
Inst./struct. de contrôles
Case Of:
Case R2 Of Case:
-2: mDeux: CMP R2,#-2 (remplacé par CMN R1,#2) !!
BNE mTrois
-3: B Endcase
mTrois: CMP R2,#-3
BNE Otherwise
Otherwise:
B Endcase
Otherwise:
Endcase: 44
Inst./struct. de contrôles
While do:
While: CMP R3,R1 CMP Rn,<Operand2>
While R3 R1 BLT Endwhile si Rn LT Operand2 en signé
do # BLO Endwhile si Rn LO Operand2 en nonsigné
do:
B While
Endwhile:
45
Inst./struct. de contrôles
For:
LDR R3,=nfin
For R3 = 1 to nfin For:
do
46
Appels de procédures, les Piles
47
Appels de procédures, les Piles
STR R3,res
48
Appels de procédures, les Piles
LDR et STR n’utilisent qu’un seul registre
LDM et STM utilisent plusieurs registres
LDMIA R1,{R0,R2,R4} (r0=mem32[r1], r2=mem32[r1+4], r4=mem32[r1+8])
R4
R3
R2
R1 Adresse de base
R0
mémoi
re
De même
STMIA R1,{R0,R2,R4} (mem32[r1]=r0, mem32[r1+4]=r2, mem32[r1+8]=r4)
49
Appels de procédures, les Piles
L’instruction LDMIA est en fait LDM + I + A
LDM : Load Multiple
I : Incrémentation de l’adresse de base
A: l’adresse de base est incrémentée après utilisation (offset temporaire)
50
Appels de procédures, les Piles
R9’ R9’ R5
R5 R1
R9 R0 R9
R9 R5 R9
R5
R1
R1
R0
R9’ R0
R9’
51
Appels de procédures, les Piles
Ces instructions permettent l’implémentation de Piles (PUSH et POP) :
• PUSH : STMIA
• POP: LDMDB
Le sommet de pile est un emplacement vide et on empile vers les add
52
Appels de procédures, les Piles
• STMFA/LDMFA
• STMFD/LDMFD
• STMEA/LDMEA
• STMED/LDMED
53
Appels de procédures, les Piles
54
Appels de procédures, les Piles
.globl _start
.globl _main
proc:
_start: B _main
_main: STMED R13!,{R1-R2,R14}
MOV R1,#2 LDR R1,[R13,#16]
MOV R2,#3 LDR R2,[R13,#20]
(A) STMED R13!,{R1,R2}
ADD R3,R1,R2
(B) BL proc
(F) ADD R13,R13,#8
(G) STR R3,res (C) LDMED R13!,{R1-R2,R14}
(D) MOV PC,R14
55
Appels de procédures,APCS (réduit)
Le APCS (ARM Procedure Call Standard) fournit un mécanisme standardisé
permettant d’associer des routines C, assembleur, …
En définissant:
• Restrictions sur l’utilisation des registres
• Convention d’utilisation de la pile
• Convention de passage de paramètres
• Structuration du contexte de la procédure dans la pile
56
Appels de procédures, APCS
Les registres prennent des noms particuliers:
R10 : SL (stack limit)
R11 : FP (frame pointer)
R12 : IP (scratch register)
R13 : SP (stack pointer)
R14 : LR (link register)
R15 : PC
57
Appels de procédures, APCS
La pile (et les différents registres) permet de conserver une structure d’appel
pour les appels imbriqués:
LR LR LR LR
SP SP SP SP
FP FP FP FP
… … … …
58
Appels de procédures, APCS
Exemple .text
int somme(int x1, int x2, int x3, int x4, int x5) .global somme
{ return x1+x2+x3+x4+x5; } .type somme,function
somme: mov ip, sp
//extern int somme(int x1, int x2, int x3, int x4, int x5);
stmfd sp!, {fp, ip, lr, pc}
int __main() sub fp, ip, #4
{ somme(2,3,4,5,6); } sub sp, sp, #16
str r0, [fp, #-16]
str r1, [fp, #-20]
str r2, [fp, #-24]
.global __main str r3, [fp, #-28]
__main: mov ip, sp ldr r2, [fp, #-16]
stmfd sp!, {fp, ip, lr, pc} ldr r3, [fp, #-20]
sub fp, ip, #4 add r3, r2, r3
sub sp, sp, #4 ldr r2, [fp, #-24]
mov r3, #6 add r3, r3, r2
str r3, [sp, #0] ldr r2, [fp, #-28]
mov r0, #2 add r3, r3, r2
mov r1, #3 ldr r2, [fp, #4]
mov r2, #4 add r3, r3, r2
mov r3, #5 mov r0, r3
bl somme ldmea fp, {fp, sp, pc}
ldmea fp, {fp, sp, pc}
59
Appels de procédures, APCS
Restauration des registres
somme: mov ip, sp
SP(1) stmfd sp!, {fp, ip, lr, pc} SP(2)
(STMDB)
sub fp, ip, #4 FP(1)
.
.
.
FP(1) ldmea fp, {fp, sp, pc} SP(1)
(LDMDB)
60
Appels de procédures, APCS
R3so R2so R1so R0so FPso IPso LRso PCso R3ma Fpma IPma LRma PCma
61
Appels de procédures, APCS
63
Procédures particulières
De nouveaux registres
64
Procédures particulières
Quand une exception est levée:
• Le mode système est modifié (fonction du type)
• PC est sauvegardé dans le R14 correspondant
• CPSR est sauvegardé dans un Save Processor Status Register
(SPSR)
• Utilise la notion de priorité
• Force le PC à l’adresse de l’exception correspondante (Branch)
65