ARM Optimization/fr

Projet EducOOo / Epitech 2011 (voir Amélioration des performances d'OOo4Kids sur machines de type ARM)


 * Étudiant : Pédro Moreno
 * Mentor : Eric Bachard

Important: Si vous utilisez le contenu de ces pages, n'oubliez pas que celles-ci sont sous Licence  CC by-sa, et que vous devez mentionner vos sources...

= Assembleur ARM =

Cette partie contient des informations provenant de plusieurs sources: Christine Rochange 2006(Université Paul sabatier), Graba Tarik(Telecom Paris tech) et provenant aussi de ARM.com.

Cette partie est destinée à d'autre personnes désirant contribuer à OOo4kids et souhaitant découvrir l'ARM tout en ayant déjà des informations à portée de mains.

Syntaxe d'un fichier source (assembleur)

La mémoire et les registres (propre aux processeurs ARM)

Le jeu d'instruction ARM
L'architecture ARM de type load-store : seules certaines instructions peuvent accéder à la mémoire et transférer une valeur depuis la mémoire vers un registre (load) ou inversement (store). Toutes les autres instructions opèrent sur des registres.

Les instructions de traitement de données
Le 1er registre est celui où le résultat doit être rangé, les 2 registres suivants sont les opérandes.

Opérations mathématiques et logiques
Mnémoniques  Opérandes         Commentaires ADD    r0,r1,r2          @ r0 ← r1 + r2         addition ADC    r0,r1,r2          @ r0 ← r1 + r2 + C     addition avec Carry SUB    r0,r1,r2          @ r0 ← r1 – r2         soustraction SBC    r0,r1,r2          @ r0 ← r1 – r2 + C – 1 soustraction avec Carry RSB    r0,r1,r2          @ r0 ← r2 – r1         soustraction inversée RSC    r0,r1,r2          @ r0 ← r2 – r1 + C – 1 soustraction inversée avec Carry AND    r0,r1,r2          @ r0 ← r1 & r2         ET binaire ORR    r0,r1,r2          @ r0 ← r1 | r2         OU binaire EOR    r0,r1,r2          @ r0 ← r1 ^ r2         XOR BIC    r0,r1,r2          @ r0 ← r1 &~ r2        Met à ’0’ les bits de r1 indiqués par r2 Notes: Les opérations logiques s'appliquent à chacun des 32 bits des opérandes.

Multiplications
Mnémoniques  Opérandes         Commentaires MUL     r0,r1,r2         @ r0 ← (r1 * r2)      multiplie r1 par r2 Il y a des différences importantes avec les autres opérations arithmétiques :


 * − le second opérande ne peut pas être une valeur immédiate.


 * − le registre résultat ne peut pas être identique au premier registre opérande.


 * − si il y a le suffixe 'S' est (mise à jour des codes condition), le bit V(CPSR) n'est pas modifié et le bit C est non significatif.

Multiplier entre eux deux entiers sur 32 bits donne un résultat sur 64 bits : les 32 bits de poids faible sont placés dans le registre résultat, les bits de poids fort sont ignorés.

Il est possible d'effectuer une multiplication en utilisant des décalages binaires (voir plus bas).

Mouvements entre registres et comparaisons
Mnémoniques  Opérandes         Commentaires MOV      r0,r2           @ r0 ← r2              copie r2 dans r0 MVN       r0,r2           @ r0 ← !r2             copie et negation de r2 dans r0   CMP       r1,r2           @ CPSR ← cc(r1 - r2)   comparer CMN      r1,r2           @ CPSR ← cc(r1 + r2)   comparer inversement TST      r1,r2           @ CPSR ← cc(r1 et r2)  tester les bits indiqués par r1 TEQ       r1,r2           @ CPSR ← cc(r1 ⊕ r2)   tester l'egalité bits par bits Notes: Ces instructions (les quatre dernières) ne produisent pas de résultat et ne font que mettre à jour les codes condition dans le CPSR.

Décalage
Il est possible de faire subir un décalage au second opérande avant de lui appliquer une opération.

Exemple: AND      r0,r1,r2,LSL #6 @ r0 ← r1 + r2 * 2^6 r2 subit un décalage de 6 bits vers la gauche donnant un r2'.Ensuite r0 reçoit le résultat de r1 ET binaire r2'.

Les décalages possibles sont :


 * - Logical Shift Left = décalage de 0 à 31 positions vers la gauche avec introduction de 0.


 * - Logical Shift Right = décalage de 0 à 32 positions vers la droite avec introduction de 0.


 * - Arithmetic Shift Left = identique à LSL.


 * - Arithmetic Shift Right = décalage de 0 à 32 positions vers la droite avec extension du bit de signe.


 * - ROotate Right = décalage de 0 à 32 positions circulaire vers la droite.


 * - Rotate Right Eextended = décalage d'une position vers la droite avec introduction du bit Carry.

Notes:Le nombre de positions de décalage peut être spécifié par une constante (précédée de #) ou par un registre.

Mise à jour des codes de conditions
Les opérations de comparaison mettent toujours à jour les codes condition.

Une opération arithmétique, de même que l'instruction CMP ou CMN, met à jour tous les codes de condition.

Une opération logique ou de mouvement entre registres ne met à jour que N et Z (V n'est pas modifié, C non plus, sauf s'il s'agit d'un décalage, auquel cas C reçoit le dernier bit éjecté par le décalage).

Les autres le font si on le demande explicitement en ajoutant le suffixe: S(set condition codes) au mnémonique.

Instructions de transfert
Il existe deux instructions pour déplacer des données entre la mémoire et le processeur:


 * - LDR (load) pour charger un registre avec une donnée de 32 bits en mémoire.


 * - STR (store) pour enregistrer la valeur sur 32 bits du registre en mémoire.

Adressage indirect via un registre
L'adresse de la donnée est contenu dans un registre appelé registre de base. Mnémoniques  Opérandes         Commentaires LDR       r0,[r1]         @ r0 ← mem32[r1] STR       r0,[r1]         @ mem32[r1] ← r0 Notes: C'est la méthode la plus simple.

Transfert d'octets
Il est possible aussi de transférer des octets, avec les instructions LDRB et STRB.

Transferts multiples
Quand on doit transférer plusieurs registres de ou vers la mémoire, on peut le faire en une seule fois avec les instructions LDM et STM. Par exemple :

LDMIA      r1,{r0,r2,r5} @ r0 ← mem32[r1] @ r2 ← mem32[r1+4] @ r5 ← mem32[r1+8]

La liste des registres de transfert (entre accolades) peut comprendre n'importe quels registres entre r0 et r15. L'ordre de la liste n'a pas d'importance, le transfert se fait de toute façon dans l'ordre croissant des numéros de registres.

Notes :Le suffixe IA (increment after) indique que l'adresse de base doit être incrémentée après le premier accès. D'autres extensions sont possibles : IB (increment before), DA (decrement after) et DB (decrement before).

Adressage de pile
Une pile est une zone de mémoire allouée dynamiquement et gérée en mode "dernier entré, premier sorti". L’ARM dispose des instructions nécessaires pour gérer différents types de piles.

La pile peut (par exemple) être manipulée avec les instructions de transfert multiples suivantes : STMFD r13!,{r0,r1,r5} @pour empiler LDMFD r13!,{r0,r1,r5} @pour dépiler Le point exclamation après r13 indique que r13 doit être mis à jour après le transfert.

Branchements
La façon la plus courante de rompre une exécution en séquence est d'utiliser une instruction de branchement : B                  etiquette ... etiquette:           ...

Quand le processeur atteint le branchement, il continue l'exécution à partir de etiquette au lieu de continuer en séquence (c'est-à-dire au lieu d'exécuter l'instruction qui se trouve à la suite du branchement).

Dans l'exemple ci-dessus, étiquette est après le branchement, donc il s'agit de sauter les instructions qui se trouvent entre les deux. Mais étiquette pourrait aussi bien se situer avant le branchement, et dans ce cas le processeur reprendrait l'exécution en arrière et ré-exécuterait éventuellement les mêmes instructions.

Branchements conditionels
Pour réaliser une boucle, un branchement au début du corps de boucle est nécessaire, mais il ne doit être réalisé que si la condition de boucle est vraie.

Une instruction de branchement conditionnel est associée à une condition (liée aux codes condition contenus dans le registre CPSR), et le branchement n'est réalisé que si la condition est vraie. MOV      r0, #0    @init compteur de boucle (r0) boucle: CMP       r0,#10    @compare le compteur et la borne (10) BHI      sortie    @bcht si borne atteinte ...                @corps de boucle ADD      r0,r0,#1  @incr. compteur de boucle B        boucle    @retour au test sortie: ... @ sortie de la boucle Cet exemple montre un branchement conditionnel, BNE (branch if not equal).

Branchements avec lien de retour
Faire un branchement vers une fonction et pouvoir ensuite reprendre l'exécution après le point d'appel. Ceci nécessite de mémoriser l'adresse de retour.

Cette possibilité est présente dans l'assembleur ARM, avec l'instruction BL qui sauvegarde automatiquement l'adresse de retour dans le registre r14.

Par exemple : principal:      BL     routine     @r14 ← pc + 4 ; pc ← routine suite:          ...                 ... routine:        ... MOV   pc,r14      @ pc ← r14 Comme l'adresse de retour est rangée dans un registre, un sous-programme ne peut pas en appeler un autre sans avoir sauvegardé son adresse de retour.

Généralement, cette sauvegarde se fait dans la pile. Par exemple : principal:      ... BL       sp1 ... sp1:            STMFA     r13!,{r14}           @ou STR r14,[r13,#4]! BL       sp2 ...                LDMFA     r13!,{r15}           @ou LDR r15,[r13],#4 sp2:            ... MOV      r15,r14              @pc ← r14

= Liens =


 * Liens vers des moteurs de developpement sur machine de type ARM:

Linaro_project

Debian

Archlinux

Ubuntu

Pulsar

Assembly Code Optimization