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