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


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.

        .source rectangle.mjv
        .class  public rectangle
        .super  java/lang/Object

;*******************************************************

        .method static public ()V
        .limit  locals 0
        .limit  stack 2
        return
        .end    method

;*******************************************************

        .method public ()V
        .limit  locals 1
        .limit  stack 2
        aload_0
        invokenonvirtual java/lang/Object/()V
        return
        .end	method

;*******************************************************

        .method public static main([Ljava/lang/String;)V
        .limit  locals 1
        .limit  stack 0
        invokestatic rectangle/main()V
        return
        .end	method

;*******************************************************

        .method	static public main()V
        .limit  locals 6
        .limit  stack 4

        .var    0 is 'n' I from L1 to L6        ; numero du point
        .var    1 is 'b' I from L1 to L6        ; base
        .var    2 is 'h' I from L1 to L6        ; hauteur
        .var    3 is 'a' I from L1 to L6        ; surface
        .var    4 is 'p' I from L1 to L6        ; perimetre
        .var    5 is 'points' [I from L1 to L6  ; coordonnees des deux points
L1:
        iconst_0   ; initialisation des variables
        istore	0
        iconst_0
        istore	1
        iconst_0
        istore	2
        iconst_0
        istore	3
        iconst_0
        istore	4
        aconst_null
        astore	5

        ldc     4  ; points = new int[4]
        multianewarray	[I 1
        astore	5
L2:
        iload	0
        ldc	2
        if_icmpeq L3
                   ; affichage du message de sollicitation pour la coordonnee en X
        getstatic java/lang/System/out Ljava/io/PrintStream;
        ldc     "Entrez la coordonnee en X du point "
        invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        iload   0
        ldc     1
        iadd       ; n + 1
        invokevirtual java/io/PrintStream/print(I)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        ldc     " : "
        invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V

        aload   5  ; lecture de la coordonnee en X d'un point
        ldc     2
        iload   0
        imul       ; 2 * n
        invokestatic mjio/scanf/readI()I
        iastore
                   ; affichage du message de sollicitation pour la coordonnee en Y
        getstatic java/lang/System/out Ljava/io/PrintStream;
        ldc     "Entrez la coordonnee en Y du point "
        invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        iload   0
        ldc     1
        iadd       ; n + 1
        invokevirtual java/io/PrintStream/print(I)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        ldc     " : "
        invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V

        aload   5  ; lecture de la coordonnee en Y d'un point
        ldc     2
        iload   0
        imul
        ldc     1
        iadd       ; 2 * n + 1
        invokestatic mjio/scanf/readI()I
        iastore

        iload   0
        ldc     1
        iadd
        istore  0  ; n = n + 1
        goto    L2
L3:
        aload   5  ; X1 - X2
        ldc     0
        iaload
        aload   5
        ldc     2
        iaload
        isub
        istore  1

        aload   5  ; Y1 - Y2
        ldc     1
        iaload
        aload   5
        ldc     3
        iaload
        isub
        istore  2

        iload   1
        ldc     0
        if_icmpge L4

        iload   1  ; |X1 - X2|
        ineg
        istore  1
L4:
        iload   2
        ldc     0
        if_icmpge L5

        iload   2  ; |Y1 - Y2|
        ineg
        istore  2
L5:
        iload   1  ; calcul de la surface
        iload   2
        imul
        istore  3

        iload   1  ; calcul du périmetre
        iload   1
        iadd
        iload   2
        iadd
        iload   2
        iadd
        istore  4
                   ; affichage des resultats
        getstatic java/lang/System/out Ljava/io/PrintStream;
        ldc     "Le perimetre est : "
        invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        iload	4
        invokevirtual java/io/PrintStream/print(I)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        invokevirtual java/io/PrintStream/println()V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        ldc     "La surface est : "
        invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        iload   3
        invokevirtual java/io/PrintStream/print(I)V
        getstatic java/lang/System/out Ljava/io/PrintStream;
        invokevirtual java/io/PrintStream/println()V
L6:
        return
        .end    method


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

echo "Assemblage ..."
java -jar /opt/jasmin-2.2/jasmin.jar rectangle.j
echo "Execution ..."
java rectangle

Le répertoire mjio contient le fichier scanf.class dérivé du fichier scanf.java