Humboldt-Universität zu Berlin ZE Rechenzentrum (CMS) Abt. Systemsoftware und Kommunikation Dr. rer. nat. Andreas Kunert |
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).
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 | +1 | lädt die Konstante n (int oder float) auf den Stack |
iload n | +1 | lädt int aus der lokalen Variable mit der Nummer n |
fload n | +1 | lädt float aus der lokalen Variable mit der Nummer n |
getstatic classname/varname type | +1 | lädt den Inhalt (int oder float) der statischen Variable varname auf den Stack |
istore n | -1 | speichert oberstes Stackelement in die lokale int-Variable mit der Nummer n |
fstore n | -1 | speichert oberstes Stackelement in die lokale float-Variable mit der Nummer n |
putstatic classname/varname type | -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 |
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 | 0 | Negation (Integer/Float) |
i2f | 0 | wandelt das oberste Stackelement von int nach float um |
Sprünge, Verzweigungen und Vergleichsoperationen | ||
goto label | 0 | 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 oder -1 auf den Stack |
Methodenaufruf und Rückkehr | ||
invokestatic classname/methodname | -n | ruft die statische Methode methodname auf (alle 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 daß das oberste Stackelement als Rückgabewert (int oder float) benutzt wird |
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
Page created: Thursday, 09-Oct-2003 14:35:00 MET DST Last update: Friday, 14-February-2014 17:53:48 CET Datenschutzerklärung |