[dbis logo] [dbis]

.Lehre.Semesterübersicht
[Institut fuer Informatik] [Leerraum] [Humboldt-Universitaet zu Berlin]

Befehlsreferenz Jasmin-Code

Die folgende Kurzreferenz von Jasminbefehlen ist auf zwei Arten beschränkt: zum einen enthält sie nur die für das Praktikum relevanten Befehle und zum anderen werden von diesen auch nur die benötigten Funktionen beschrieben.

Wer das Bedürfnis nach einer genaueren Beschreibung des einen oder anderen Befehls hat, wird in dem Buch The Java Virtual Machine Specification fündig, dass auf der angegebenen Webseite vollständig online zur Verfügung steht. Die alphabetisch geordnete Liste aller JVM-Befehle (also auch der nicht von uns benötigten) befindet sich dabei in Kapitel 6. Es ist jedoch zu beachten, dass es zwar zu jedem Jasmin-Befehl einen gleichnamigen, äquivalenten JVM-Befehl gibt, sich aber die Syntax manchmal leicht unterscheidet (insbesondere gibt es nur in Jasmin symbolische Namen).

Kurzreferenz

Im Praktikum werden die folgenden Befehle benötigt (die Zahlen hinter den Befehlen geben die Veränderung der Stackgröße an):

Lade- und Speicheroperationen 
 
 
ldc
+1 
lädt die Konstante n (int oder float) auf den Stack 
iload
+1 
lädt int aus der lokalen Variable mit der Nummer n 
fload
+1 
lädt float aus der lokalen Variable mit der Nummer n 
getstatic classname/varname 
+1 
lädt den Inhalt (int oder float) der statischen Variable varname auf den Stack 
istore
-1 
speichert oberstes Stackelement in die lokale int-Variable mit der Nummer n 
fstore
-1 
speichert oberstes Stackelement in die lokale float-Variable mit der Nummer n 
putstatic classname/varname 
-1 
speichert oberstes Stackelement (int oder float) in die statische Variable varname 
 
 
 
Stackmanipulationen 
 
 
dup 
+1 
dupliziert das oberste Element auf dem Stack 
pop 
-1 
wirft das oberste Element vom Stack weg 
swap 
vertauscht die beiden obersten Elemente des Stacks 
 
 
 
Arithmetische Operationen 
 
 
iadd, fadd 
-1 
Addition (Integer/Float) 
isub, fsub 
-1 
Subtraktion (Integer/Float) 
imul, fmul 
-1 
Multiplikation (Integer/Float) 
idiv, fdiv 
-1 
Division (Integer/Float) 
ineg, fneg 
Negation (Integer/Float) 
i2f 
wandelt das oberste Stackelement von int nach float um 
 
 
 
Sprünge, Verzweigungen und Vergleichsoperationen 
 
 
goto label 
unbedinger Sprung zum angegebenen Label 
ifeq label, ifne label, iflt label, ifge label, ifgt label, ifle label 
-1 
Vergleicht das oberste Stackelement mit Null und verzweigt zum Label bei Gleichheit/Ungleichheit/... 
if_icmpeq label, if_icmpne label, if_icmplt label, if_icmpge label, if_icmpgt label, if_icmple label 
-2 
vergleicht die beiden obersten Stackelemente (beide int) miteinander und verzweigt zum Label bei Gleichheit/Ungleichheit/... 
fcmpl 
-1 
vergleicht die beiden obersten Elemente auf dem Stack (beide float) und legt je nach Ergebnis eine 0, 1 (oberstes ist kleiner) oder -1 auf den Stack 
 
 
 
Methodenaufruf und Rückkehr 
 
 
invokestatic classname/methodname 
-n* 
ruft die statische Methode methodname auf (alle n Parameter müssen dabei bereits in der richtigen Reihenfolge auf dem Stack liegen) 
invokevirtual classname/methodname 
-(n+1)* 
ruft die Instanzmethode methodname auf (die Instanz und alle n Parameter müssen dabei bereits in der richtigen Reihenfolge auf dem Stack liegen) 
return 
=0 
beendet die aktuelle Methode und kehrt zurück; der Stack wird gelöscht 
ireturn, freturn 
=0 
wie return, nur dass das oberste Stackelement als Rückgabewert (int oder float) benutzt wird 

* ... +1, falls die aufgerufene Methode einen Rückgabewert hat

Sonderfall printf

Mit den Befehlen in der obigen Tabelle kann man bis auf eine Ausnahme alle in C0+ erlaubten Konstrukte umsetzen. Die Ausnahme lautet printf. In Jasmin generieren wir dazu einen Aufruf von System.out.println. Die Syntax sieht folgendermaßen aus:

getstatic java/lang/System/out Ljava/io/PrintStream;
	... (hier steht der Code, der das auszugebende auf den Stack legt)
invokevirtual java/io/PrintStream/println(x)V

Dabei muss an der Stelle des x der Typ des auszugebenden Datums stehen (I, F oder Z). Ein einfaches Programm, dass das Ergebnis der Addition 1+2 ausgibt, sieht also folgendermaßen aus:

getstatic java/lang/System/out Ljava/io/PrintStream;
ldc 1
ldc 2
iadd
invokevirtual java/io/PrintStream/println(I)V

Last update:  Friday, February 18, 2011

[Punkt]  Sommersemester 2013

[Punkt]  Wintersemester 2012/13

[Punkt]  Sommersemester 2012

[Punkt]  Wintersemester 2011/12

[Punkt]  Sommersemester 2011

[Punkt]  Wintersemester 2010/11

[Punkt]  Sommersemester 2010

[aktiver Punkt]  Wintersemester 2009/10

[Punkt]  Sommersemester 2009

[Punkt]  Wintersemester 2008/09

[Punkt]  Sommersemester 2008

[Punkt]  Wintersemester 2007/08

[Punkt]  Sommersemester 2007

[Punkt]  Wintersemester 2006/07

[Punkt]  Sommersemester 2006

[Punkt]  Wintersemester 2005/06

[Punkt]  Sommersemester 2005

[Punkt]  Wintersemester 2004/05