Vous êtes sur la page 1sur 18

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

Vous aimerez peut-être aussi