Introduction à l’assembleur ARM: variables et accès mémoire GIF-1001 Ordinateur
Introduction à l’assembleur ARM: variables et accès mémoire GIF-1001 Ordinateurs: Structure et Applications, Hiver 2015 Jean-François Lalonde Rappel: cycle d’instructions 1. LIRE (FETCH) Aller chercher la prochaine instruction 3. EXÉCUTE Exécuter l’instruction Que fait le microprocesseur? 1. Lire: aller chercher la prochaine instruction 2. Décode: décode l’instruction (détermine ce qu’il y a à faire) 3. Exécute: exécuter l’instruction 2. DÉCODE Décoder l’instruction Rappel: instructions • De quoi une instruction est-elle constituée? • “Opcode” (ou code d’opération): code identifiant quelle instruction est effectuée (MOV, LDR, etc.) • Paramètres: un ou plusieurs, dépendent de l’opcode. L’assembleur: des instructions en mots • Il est donc possible d’écrire un programme en binaire si on sait comment représenter les instructions avec des “0” et des “1”. Toutefois, le processus est très pénible: qui voudrait écrire 0x23AB435F4EE7832FFA pour effectuer l’opération “a = b + c”? • Un assembleur est un programme qui traduit des mots, en anglais, dans un fichier texte, en instructions. • Exemple (a = b + c): MOV R0, #0x00 ; Adresse de la variable b LDR R0, [R0] ; Lire la variable b dans le registre R0 MOV R1, #0x01 ; Adresse de la variable c LDR R1, [R1] ; Lire la variable c dans le registre R1 ADD R2, R0, R1 ; R2 = R0 + R1 MOV R0, #0x02 ; Adresse de la variable c STR R2, [R0] ; Écrire le registre R2 dans la variable a Plan • Cette semaine: • Déclarer des variables et leur affecter des valeurs • Effectuer des opérations mathématiques et logiques • Les semaines prochaines: • Gérer la séquence des opérations avec des énoncés conditionnels et des boucles • Appeler des fonctions (diviser une tâche en sous-tâches) • Gérer les évènements et les exceptions Revenons à notre exemple d’addition • Pas pratique: • d’avoir à connaître les adresses de a, b, et c • d’avoir à utiliser deux instructions (MOV puis LDR) pour les charger • Solution? • L’assembleur nous permet de donner un nom à des adresses mémoires: ce sont les constantes et les variables! • constante = ne change pas • variable = peut changer MOV R0, #0x00 ; Adresse de la variable b LDR R0, [R0] ; Lire la variable b dans le registre R0 MOV R1, #0x01 ; Adresse de la variable c LDR R1, [R1] ; Lire la variable c dans le registre R1 ADD R2, R0, R1 ; R2 = R0 + R1 MOV R0, #0x02 ; Adresse de la variable c STR R2, [R0] ; Écrire le registre R2 dans la variable a Constantes — syntaxe • Déclarer une constante (réserve de l’espace en ROM) • “nom” est le nom de la constante • “DCss": C=constante, ss indique la taille. Par exemple: • DC8: constante de 8 bits • DC32: constante de 32 bits • “valeur”: la valeur de la constante • exemple: a DC32 0xAB b DC32 0xF2 nom DCss valeur Variables — syntaxe • Déclarer une variable (réserve de l’espace en mémoire RAM): • “nom” est le nom de la variable • “DSss": S=variable, ss indique la taille. Par exemple: • DS8: variable de 8 bits • DS32: variable de 32 bits • “nombre”: le nombre d’éléments à réserver • exemple: ; dans notre exemple d’addition, la valeur initiale importe peu, ; car nous allons la remplacer, mais en général on peut initialiser ; les variables de la même façon que les constantes c DS32 1 nom DSss nombre Tableaux (constantes et variables) • Pour déclarer un tableau: • “nom” est le nom de la variable/constante • “D*ss”: ss indique la taille • “el1 el2 el3”: la valeur des éléments du tableau s’il s’agit d’une constante • “nombreElements”: le nombre d’éléments dans le tableau s’il s’agit d’une variable • exemple: nom DCss el1 el2 el3 ... ; Constante nom DSss nombreElements ; Variable a DS32 3 ; tableau de 3 mots de 32 bits chacun b DC8 0x01 0x02 0x03 ; tableau de 3 octets Tableaux • Les tableaux peuvent être vus comme des chaînes de variables. • Une chaîne texte est un exemple de tableau d'octets, chaque caractère est présenté comme un élément de code ASCII (0 à 255). • Par exemple: • strA est la copie exacte de strB. Lorsque le compilateur voit une chaîne entourée par des ' ', il la convertit automatiquement en un ensemble d'octets. strA DC8 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x00 strB DC8 'Hello', 0 Variables et constantes • Une variable/constante est un nom donné à une adresse de mémoire. • Ce sont des créations du langage assembleur afin de faciliter la création d’un programme: il est plus facile de retenir un nom qu’une adresse de mémoire! • La directive DC sert à un insérer des octets dans la mémoire ROM du système. L’adresse de ces octets est l’adresse de la constante. • La directive DS sert à nommer des octets dans la mémoire RAM du système. L’adresse de ces octets est l’adresse de la variable. • L’assembleur (le programme) s’occupera de remplacer tous les noms des variables par les adresses correspondant à ces nom. Exemple d’addition—avec variables & constantes • Comment représenter notre programme d’addition en utilisant des variables et constantes? ; Programme principal LDR R0, b ; Lire la constante b dans le registre R0 LDR R1, c ; Lire la constante c dans le registre R1 ADD R2, R0, R1 ; Registre R2 = R0 + R1 LDR R3, =a ; Lecture de l’adresse de la variable a STR R2, [R3] ; Écrire le registre R2 dans la variable a ; Définissons les constantes b et c b DC32 0xAB c DC32 0xF2 ; Définissons la variable c (pour stocker le résultat) a DS32 1 Plus que de la “traduction” d’instructions • En plus de traduire des mots/mnémoniques en binaire, l’assembleur interprète aussi le texte de plusieurs façons. Il permet: • d’associer des mots du programmeur à des adresses de mémoire. • au programmeur de déclarer des variables et il gère l’adresse de ces variables à travers les instructions du programme. • au programmeur d’identifier des fonctions ou des sections de codes avec des étiquettes (labels). Lorsque l’assembleur décode un appel de fonction ou un branchement (saut) dans le programme, il remplace les étiquettes par les adresses ou déplacements (offset) appropriées. • L’assembleur supporte des directives qui lui disent comment placer le code en mémoire, comment gérer plusieurs fichiers, comment précompiler le code— modifier le code avant de le traduire en binaire—et plus. Les directives sont des mots réservés qui ne génèrent pas de code en binaire, mais qui dirigent la création du code exécuté. • L’assembleur permet aussi d’insérer des commentaires dans le code! Exemple de programme sur IAR Workbench NAME main PUBLIC __iar_program_start SECTION .text : CODE (2) CODE32 __iar_program_start ; a = b + c main LDR R0, b LDR R1, c ADD R2, R0, R1 LDR R3, =a STR R2, [R3] B main DATA b DC32 0xAB c DC32 0xF2 SECTION `.noinit`:DATA (2) a DS32 1 END Nom du fichier/module Rend l’étiquette __iar_program_start disponible pour d’autres fichiers Code principal Le texte qui suit doit être assemblé en mémoire FLASH Variables en mémoire RAM Fin du fichier/module Étiquette __iar_program_start: indique à IAR de commencer le programme ici Saute à l’étiquette main: boucle infinie! Le texte qui suit doit être assemblé en mémoire FLASH 6 types d’instructions en ARM • Déplacement de données: Transfert de données ou de constante impliquant des registres seulement. • Accès à la mémoire: l’instruction, un load ou store, lit ou écrit la mémoire. La valeur lue est mise dans un registre. La valeur écrite provient d’un registre. • Opération arithmétique: addition, soustraction, multiplication, division et plus. Les calculs s’effectuent sur des registres et peuvent changer les drapeaux de l’unité d’arithmétique et de logique (ALU). • Opération logique: ET, OU, NON-OU, OU EXCLUSIF et plus. Les calculs s’effectuent sur des registres et peuvent changer les drapeaux de l’unité d’arithmétique et de logique (ALU). • Gestion de la séquence d’instructions: saut et branchements. Peuvent être conditionnels ou inconditionnels, à des adresses directes ou indirectes. Comprend les appels de fonctions. • Contrôle du système: Comprend toutes les autres instructions contrôlant le microprocesseur. Permet de gérer le temps, le format des instructions, l’exécution en pipeline, les interruptions et plus. Déplacement de Données: MOV • L’instruction met l’opérande de type 1 Op1 dans le registre Rn • Opérande de type 1: • Constante (valeur immédiate): toujours précédée du symbole # • Registre • Registre décalé • Le décalage est fait avant l’opération. Cinq opérations sont possibles: LSL, LSR, ASR, ROR et RRX. Ces opérations sont détaillées en Annexe A. • Exemples: MOV R0, #1234 ; R0 = 1234 MOV R0, R1 ; R0 = R1 MOV R0, R1, ASR #2 ; R0 = R1 / 4 MOV Rn Op1 Accès Mémoire: Load/Store • Les accès à la mémoire se font avec deux instructions: • LDR (LoaD Register) lit la mémoire et met la valeur lue dans un registre. • STR (STore Register) met uploads/S4/ arm-variables-et-acces-memoire 1 .pdf
Documents similaires










-
21
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Oct 03, 2021
- Catégorie Law / Droit
- Langue French
- Taille du fichier 1.0432MB