Exemple d'un programme écrit en langage d'assemblage ARM


Le programme suivant calcule le périmètre et la surface d'un rectangle à partir des coordonnées de deux points qui représentent les sommets opposés du rectangle

        .global main              @ point d'entree

/* rectangle : Programme qui calcule le perimetre et la surface d'un rectangle
               a partir des coordonnees de deux points (X1,Y1) and (X2,Y2).

   Auteur    : Richard St-Denis, Universite de Sherbrooke, 2015.
*/

       .section .text             @ section de code
main:
        mov     v1,#-2            @ deux points a lire
        ldr     v2,=points
rec00:
        ldr     a1,=ptfmt1        @ 1er : adresse du message de sollicitation
        add     a2,v1,#3          @ 2e : numero du point = 3-|v1|
        bl      printf            @ affichage du message de sollicitation
                                  @   pour la coordonnee en X
        ldr     a1,=scfmt1        @ 1er : adresse de la chaine du format d'entree
        mov     a2,v2             @ 2e : adresse de la coordonnee en X
        bl      scanf             @ lecture de la coordonnee en X d'un point

        ldr     a1,=ptfmt2        @ 1er : adresse du message de sollicitation
        add     a2,v1,#3          @ 2e : numero du point = 3-|v1|
        bl      printf            @ affichage du message de sollicitation
                                  @   pour la coordonnee en Y
        ldr     a1,=scfmt1        @ 1er : adresse de la chaine du format d'entree
        add     v2,v2,#4
        mov     a2,v2             @ 2e : adresse de la coordonnee en Y
        bl      scanf             @ lecture de la coordonnee en Y d'un point

        add     v2,v2,#4
        adds    v1,v1,#1
        bne     rec00             @ Autre point à lire ?

        mov     v1,#0
        ldr     a1,=points
        ldr     v2,[a1]           @ point 1 (X1, ...)
        ldr     v3,[a1,#8]        @ point 2 (X2, ...)
        subs    v4,v2,v3          @ X1-X2
        submi   v4,v1,v4          @ |X1-X2|

        ldr     v2,[a1,#4]        @ point 1 (..., Y1)
        ldr     v3,[a1,#12]       @ point 2 (..., Y2)
        subs    v5,v2,v3          @ Y1-Y2
        submi   v5,v1,v5          @ |Y1-Y2|

        mul     a3,v4,v5          @ calcul de la surface

        add     v4,v4,v4          @ calcul du perimetre
        add     v5,v5,v5
        add     a2,v4,v5

        ldr     a1,=ptfmt3        @ 1er : adresse de la chaine du format de sortie
        bl      printf            @ affichage des resultats

        mov     a1,#0             @ 1er : code de retour
        bl      exit              @ sortie du programme

       .section .bss              @ section des donnees non initialisees
        .align   4
points: .space   4*4              @ X1, Y1, X2, Y2

       .section .rodata           @ section des donnees en lecture seulement
scfmt1: .asciz   "%u"
ptfmt1: .asciz   "Entrez la coordonnee en X du point %u : "
ptfmt2: .asciz   "Entrez la coordonnee en Y du point %u : "
ptfmt3: .ascii   "Le perimetre est : %u\n"
        .asciz   "La surface est : %u\n"

Sous Ubuntu, les commandes suivantes permettent d'assembler, d'effectuer l'édition des liens et d'exécuter le programme sur un PandaBoard.

echo "Assemblage ..."
as rectangle.asm -o rectangle.o
echo "Edition des liens ..."
gcc rectangle.o -o rectangle
echo "Execution ..."
./rectangle

Sous Ubuntu 4.6.3, les commandes suivantes permettent d'assembler, d'effectuer l'édition des liens et d'exécuter le programme sur un PandaBoard sans utiliser gcc.

echo "Assemblage ..."
as rectangle.asm -o rectangle.o
echo "Edition des liens ..."
ld rectangle.o -o rectangle
echo "Execution ..."
./rectangle

ld est un alias pour la commande suivante, laquelle a été dérivée à partir du compilater gcc avec l'option -v.

alias ld='/usr/lib/gcc/arm-linux-gnueabihf/4.6/collect2
              -dynamic-linker 
              /lib/ld-linux-armhf.so.3
              /usr/lib/arm-linux-gnueabihf/crt1.o
              /usr/lib/arm-linux-gnueabihf/crti.o
              -L/usr/lib/arm-linux-gnueabi/4.6.3
              -lc /usr/lib/arm-linux-gnueabihf/crtn.o'

L'alias peut être inséré dans un fichier .bashrc.