Chapitre III
Structure d’un programme
assembleur ARM
Structures d’un programme assembleur
Un programme assembleur ARM est composé de trois éléments
Les directives d’assemblage
Les instructions
Les pseudo-instructions
Structures d’un programme assembleur
Les directives d’assemblage
Une directive d’assemblage n’est pas une instruction ARM mais une
commande adressée à l’assembleur.
Une directive d’assemblage ne génère pas de code machine.
Son but est d’aider l’assembleur à générer le code objet du programme
Les directives indiquent au compilateur (assembleur) comment traiter
efficacement le code assembleur
Une directive peut par exemple réserver des emplacement en mémoire et
initialiser ces emplacement avec des valeurs (pour la déclaration de données
par exemple)
Directives d’assemblage
DCB, DCW, DCD et SPACE
{<label>} DCB n1, n2, …: Allouer un ou plusieurs octets en mémoire, et définir leurs
valeurs initiales. Les valeurs (n1, n2, , … ) ne doivent pas dépasser 255
Si label est défini, il se transforme en une variable de l’assembleur qui contiendra
l’adresse de début de la zone allouée
Exemples :
X DCB 20 ; Réserver une zone mémoire sur 1 octet et l’initialiser à 20
; l’adresse de la zone est dans X
Tableau DCB 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; Déclarer un tableau de 10 élément
; sur 1 octet chacun et l’initialiser
Chaine DCB "Bonjour" ; allouer 7 octets et initialiser aux valeurs ascii des
cars
Chaine_c DCB "Bonjour", 0 ; chaine terminée par le caractère nul
{<label>} DCW n1, n2, …: Allouer un ou plusieurs demi-mots (16 bits) en mémoire
{<label>} DCD n1, n2, …: Allouer un ou plusieurs mots en mémoire
{<label>} SPACE n : Allouer n octets en mémoire et les initialiser à zéro
ALIGN
Directives d’assemblage
ALIGN n : Aligne le contenu mémoire suivant sur une adresse divisible par n. n doit
être une puissance de 2 (1, 2, 4, 8, …etc)
La directive d’alignement est généralement utilisée après des déclarations de
données octet ou demi-mot, pour garantir que les instructions suivantes sont
bien alignées sur des frontières de demi-mot, mot, double-mot, …etc)
Exemple : X 0x00 05
0x01 00
X DCD5
0x02 00
Y DCB2, 3
ALIGN 4 0x03 00
mov R0, #10 Y 0x04 02
………
0x05 03
0x06
0x07
0x08
0x09
MOV
0x0A
0x0B
Directives d’assemblage
EQU (Equal)
Etiq equ valeur : remplace une constante ou une adresse par une étiquette
symbolique
Exemple :
const equ 0x1234
………
mov R1, #const ; R1 contiendra 0x1234
Directives d’assemblage
AREA
AREA nomSection {,attr}{,attr}... : Indique le début d’une nouvelle section d’un
programme. Cette section peut contenir du code ou des données et peut être à lecture
seule ou à lecture et écriture en fonction des attributs
Exemple :
AREA Programme,CODE,READONLY ; section de code à lecture seule
… (instructions)
…
…
AREA Donnees, DATA,READWRITE ; section de données à lecture écriture
…(déclaration de données)
…
…
Directives d’assemblage
ENTRY, EXPORT, IMPORT et END
ENTRY : Point d’entrée du programme. Pointe vers la première instruction du
programme. Chaque programme doit avoir un point d’entrée
Exemple :
AREA ARMex, CODE, READONLY
X DCD 20, 30, 40
C DCB "Bonjour"
ENTRY ; point d’entrée de l’application
Mov R0, R1
….
EXPORT : Déclare un symbole comme étant global. Il est référencé (utilisé) dans un
autre fichier
IMPORT: Déclare un symbole comme étant externe. Il est définit dans un autre
fichier
END : Informe l’assembleur de la fin du programme source. Chaque fichier doit
se terminer par un end
Les instructions
Contrairement aux directives, les instructions seront traduites en langage machine
Toutes les instructions ont une taille de 32 bits
Toutefois, le format de l’instruction diffère d’un type à un autre
En général, on retrouve les champs suivants (pas tous obligatoires):
OPCODE : Code opération
COND: exécution conditionnelle. Indique dans quelle condition l’instruction est
exécutée
RD: Registre de destination
RN: Registre premier opérande
RM: Registre deuxième opérande
Shift amount: Nombre de décalages
RS: registre contenant le nombre de décalages
S: Bit indiquant si l’opération doit modifier les bits d’état (NCVZ)
Les instructions
Formats d’instructions
Les instructions
Bits cond
Les instructions
Code opération
Les instructions
Exercice :
Ecrire le code machine correspondant aux instructions suivantes
Mov R5, # 7
31 27 27 25 24 21 20 19 16 15 12 11 8 7 0
1110 001 1101 0 0000 0101 0000 00000111
0xE3A05007
Movs R6, #0xFF000000
0xFF000000 ne peut pas s’écrire sur 8 bits on l’écrira sous forme d’une constante
immédiate et d’une rotation à droite (rotate + immediate) telle que la valeur à
charger est égale à la constante décalée circulairement à droite de 2x rotate
0xFF000000 est donc écrit sous forme de 0xFF décalé circulairement à droite de 8
bits donc rotate = 4
31 27 27 25 24 21 19 16 15 12 11 8 7 0
1110 001 1101 1 0000 0110 0100 11111111
0xE3B064FF
Les instructions
ADD R1, R2, R3
1110 000 0100 0 0010 0001 00000 00 0 0011
0xE0821003
Remarque
Si le deuxième opérande est décalé, shift indiquera le sens de décalage et
shift_amount indiquera la valeur de décalage
Shift : 00 décalage à gauche; 01 décalage à droite; 10 rotation à gauche;
11 rotation à droite
ADD R1, R2, R3, lsr #4
1110 000 0100 0 0010 0001 00100 01 0 0011
0xE0821223
Exercice
Soit le programme assembleur suivant:
area Demo, code, readonly
export __main
chaine dcb "salut"
align 4
entry
__main mov R0, #10
mov R1, #20
add R2, R1, R0
end
Traduire ce programme en code machine
Vérifier la traduction en utilisant Keil
Pseudo-instructions
Les pseudo-instructions ne sont pas des instructions ARM
Elles sont interprétées par l’assembleur comme c’est le cas pour les directives et
permettent de faciliter la programmation
Contrairement à une directive, une pseudo-instruction donne lieu à une ou
plusieurs instructions ARM et éventuellement des réservations supplémentaires de
données en mémoire
Le comportement d’une pseudo-instruction rappelle celui des macros qu’on
retrouve dans les langages de programmation ou de scripts classiques
Pseudo-instructions
Pseudo LDR
Cette pseudo-instruction se comporte différemment en fonction du contexte
ldr R0, =grande_valeur
Permet de charger une grande valeur (qui ne peux pas être codée dans une instruction
mov unique) en générant une constante en mémoire et un vrai ldr de la constante
Ldr R0, = 0x12345678 Ldr R0, [PC, #-0x04]
(DCD 0x12345678)
Ldr R0, x ; x est une étiquette déclarée dans le même espace
Charger le contenu de l’adresse X sans passer par le pré-chargement d’un registre de
base. Elle génère un ldr utilisant un adressage relatif au PC
X DCD 0x12345678 X DCD 0x12345678
ldr R0, x ldr R0, [PC, #-0x0C]
Ldr R0, =x ; x est une étiquette déclarée dans n’importe quel espace adressable
Charger l’adresse X dans un registre de base. Elle génère un ldr d’une constante
mémoire contenant l’adresse de x
Ldr R0, =x Ldr R0, [PC, #-0x04]
(DCD adresse_de_x)
Exercice
Quelles sont les instructions et les données générées par l’assembleur ARM pour
le code suivant
area demo2, code, readonly
export __main
entry
__main ldr R0, x
ldr R1, =y
ldr R2, =0xFFFF0000
fin b fin
x dcd 0xAABBCCDD
area donnees, data, readwrite
y space 4
end