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


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

/* 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, 2013.
*/
        .global Rectangle       ! point d'entree
        .section ".text"        ! section de code
Rectangle:
        mov     2,%l0           ! deux points a lire
        setx    points,%l7,%l1
rec00:
        setx    ptfmt1,%l7,%o0  ! 1er: adresse du message de sollicitation
        mov     3,%o1           ! 2e: numero du point = 3 - %l0
        sub     %o1,%l0,%o1
        call    printf          ! affichage du message de sollicitation pour la coordonnee en X
        nop

        setx    scfmt1,%l7,%o0  ! 1er: adresse de la chaine du format d'entree
        mov     %l1,%o1         ! 2e: adresse de la coordonnee en X
        call    scanf           ! lecture de la coordonnee en X d'un point
        nop

        setx    ptfmt2,%l7,%o0  ! 1er: adresse du message de sollicitation
        mov     3,%o1           ! 2e: numero du point = 3 - %l0
        sub     %o1,%l0,%o1
        call    printf          ! affichage du message de sollicitation pour la coordonnee en X
        nop

        setx    scfmt1,%l7,%o0  ! 1er: adresse de la chaine du format d'entree
        inc     4,%l1
        mov     %l1,%o1         ! 2e: adresse de la coordonnee en Y
        call    scanf           ! lecture de la coordonnee en Y d'un point
        nop

        inc     4,%l1
        dec     %l0
        brnz    %l0,rec00       ! Un autre point à lire ?
        nop

        setx    points,%l7,%l1
        ldsw    [%l1],%l2       ! point 1 (X1, ...)
        ldsw    [%l1+4],%l3     ! point 1 (... ,Y1)
        ldsw    [%l1+8],%l4     ! point 2 (X2, ...)
        ldsw    [%l1+12],%l5    ! point 2 (... ,Y2)

        sub     %l2,%l4,%l6     ! X1 - X2
        sub     %l3,%l5,%l7     ! Y1 - Y2
        brgez   %l6,rec05
        nop
        neg     %l6             ! |X1 - X2|
rec05:
        brgez   %l7,rec10
        nop
        neg     %l7             ! |Y1 - Y2|
rec10:
        mulx    %l6,%l7,%o2     ! calcul de la surface

        add     %l6,%l6,%l6     ! calcul du perimetre
        add     %l7,%l7,%l7
        add     %l6,%l7,%o1

        setx    ptfmt3,%l7,%o0  ! 1er: adresse de la chaine du format de sortie
        call    printf          ! affichage des resultats
        nop

        clr     %o0             ! 1er parametre
        call    exit            ! sortie du programme
        nop

/* Definitions des donnees */

        .section ".bss"         ! section des donnees non initialisees
        .align  4
points: .skip   4*4             ! X1, Y1, X2, Y2

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

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

echo "Assemblage ..."
/usr/ccs/bin/as -xarch=v9 rectangle.as -o rectangle.o
echo "Edition des liens ..."
/usr/ccs/bin/ld -e Rectangle -o rectangle rectangle.o -lc
echo "Execution ..."
rectangle