javaseiten.de   |   Version 0.6
 

5.4. Kommentare und Labels

In Jasmin-Assemblersprache gibt es die Möglichkeit einen Kommentar mit einem Semikolon ";" einzuleiten. Der darauffolgende Text wird dann bis zum Ende der Zeile als Kommentar gewertet. Im Jasmin-Quelltext wird der Strichpunkt auch bei Feld- und Methodendeskriptoren verwendet. In Listing 5.1 wird z.B. der Methodendeskriptor (Ljava/lang/String;)V im Rahmen des Methodenaufrufs von println benötigt. Ein Kommentar wird deshalb nur als solcher betrachtet, wenn ein Strichpunkt am Anfang einer Zeile steht oder falls ein Semikolon nach einem Leerzeichen folgt:

Kommentar "HelloWorld.j"
    ; HelloWorld.j
    .class public HelloWorld ; HelloWorld.j
    .class public HelloWorld ;HelloWorld.j
    
Keine Kommentare "HelloWorld.j" bzw. ")V"
    Ljava/io/PrintStream; HelloWorld.j
    java/io/PrintStream/println(Ljava/lang/String;)V

Innerhalb eines Jasmin-Quelltextes können Labels verwendet werden, um Sprungziele zu markieren. Labels können im Quelltext entweder eine komplette Zeile für sich beanspruchen oder können direkt vor einer JVM-Instruktion stehen. Als Beispiel für die Verwendung von Labels soll die folgende for-Schleife aus einem Java-Quelltext in einen entsprechenden Assemblerquelltext umgesetzt werden.

int j = 0;
  for (int i = 0; i < 10; i++) {
    j = j + 2;
  }

Die folgende Aufstellung zeigt auf der linken Seite die Realisierung der Schleife auf Assemblerebene mit konventionellen Labels. Auf der rechten Seite werden pc-Labels verwendet, wobei die Abkürzung pc für program counter steht. Die for-Schleife in der Beispielbetrachtung soll am unmittelbaren Anfang einer Methode stehen. Der zugeordnete pc der Methode beginnt bei 0. Da sich die Operationscodes und eventuell zugehörige Operationsbytes im sogenannten code-Array befinden ist der Programmzähler der Methode auch gleichzeitig als Index im code-Array zu verstehen. Für die ersten fünf JVM-Instruktionen wird lediglich ein einziges Byte (Operationscode) benötigt, wohingegen bipush 10 mit zwei Bytes realisiert werden muss. Der auf diese Instruktion folgende Label bzw. pc beginnt deshalb nicht mit 6 sonder mit 7.

Mit konventionellen Labels        Mit pc-Labels

  iconst_0                         0: iconst_0
  istore_0                         1: istore_0
  iconst_0                         2: iconst_0
  istore_1                         3: istore_1
  
Label1:
  iload_1                          4: iload_1
  bipush 10                        5: bipush 10
  if_icmpge Label2                 7: if_icmpge 20
  iload_0                         10: iload_0
  iconst_2                        11: iconst_2
  iadd                            12: iadd
  istore_0                        13: istore_0
  iinc 1 1                        14: iinc 1 1
  goto Label1                     17: goto 4
  
Label2:
  ...                             20: ...

Prinzipiell ist es nicht erforderlich, dass ein pc-Label auch mit dem tatsächlichen Programmzähler übereinstimmt. Es wird lediglich gefordert, dass ein pc-Label ein ganze Zahl repräsentiert (inklusive negativer Zahlen). Die Zahlenwerte müssen auch keiner bestimmten Ordnung unterliegen. Es bietet sich aber an, die pc-Labels entsprechend des tatsächlichen Programmzählers bzw. dem Index im code-Array zu verwenden. Um den Wert des Indexes im code-Array zu verdeutlichen, kann die Bytecodierung der for-Schleife innerhalb der Klassendatei analysiert werden (für die Bedeutung und die Zuordnung der Mnemoniks zu den korrespondierenden Operationscodes siehe Abschnitt 4.3.2):

code-Array:
03 3b 03 3c 1b 10 0a a2 00 0d 1a 05 60 3b 84 01
01 a7 ff f3 b2 00 02 1a b6 00 03 b1

Operationscode     Operandenbytes     Instruktion     Index (pc)
03                                    iconst_0          0
3b                                    istore_0          1
03                                    iconst_0          2
3c                                    istore_1          3
1b                                    iload_1           4
10                 0a                 bipush 10         5
a2                 00 0d              if_icmpge 20      7
1a                                    iload_0          10
...

Ein Label muss mit einem Doppelpunkt abgeschlossen werden. Der Name eines konventionellen Labels darf nicht mit einer Zahl beginnen und es dürfen auch nicht die folgenden Zeichen enthalten sein: =, :, ., ", - . Die Namen von Direktiven und die Bezeichnungen von Instruktionen der virtuellen Java-Maschine (Mnemoniks) können ebenfalls nicht verwendet werden. Beispiele für gültige konventionelle Labels sind: Label12:, Label3:, HelloJasmin!:, ##x_3:. Sowohl konventionelle Labels als auch pc-Labels können nur innerhalb von Methodendefinitionen also innerhalb der Direktiven .method und .end method verwendet werden. Labels innerhalb einer Methodendefinition sind nur innerhalb dieser Definition sichtbar (lokale Eigenschaft) und es können daher gleichlautende Labels verwendet werden, falls sie in unterschiedlichen Methodendefinitionen auftreten. Konventionelle Labels und pc-Labels können auch gemischt im Jasmin-Quelltext auftreten. So können z.B. pc-Labels aus rein informativen Gesichtspunkten im Quelltext stehen, wohingegen die konventionelle Labels als eigentliche Sprungmarken dienen.

 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder