Humboldt-Universität zu Berlin
ZE Rechenzentrum (CMS)
Abt. Systemsoftware und Kommunikation
Dr. rer. nat. Andreas Kunert
HU-CMS-Logo  HU-Berlin Logo

Befehlsreferenz Jasmin-Code

Vorwort

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

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 muß an der Stelle des x der Typ des auszugebenden Datums stehen (I, F oder Z). Ein einfaches Programm, das 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