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
où 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.