RE: JavaVM description

theUser BL <[email protected]>
Newsgroups gmane.comp.java.classpath.devel
Message-ID <[email protected]>
> theUser BL wrote:
> > Hi!
> 
> > But where can I find documentations about .class files? How are they are
> > structures and so on?
> 
> In the JVM specification, 2nd edition, for example. There is quite a
> bunch of literature explaining the workings of bytecode and the class
> file format, depending on the background you're after, from compiler
> design books, over interactive introductions, to formal methods.

Thx. It helps, but not much.
I have written  a little HelloWorld program in Java and have then treied to understand the created binary.
The most things I understand, but there are three big fields where I don't know for what they are. But if I change there a bit, the program will not run, so that areas seens to be important.
To understand it, I have written a little QBasic, program which generates that .class file. But as I said, there are the three big areas (one with 34 bytes and two with 39 bytes at a time) , which I don't understand.

------------------------------------

DECLARE FUNCTION invokespecial$ (a&)
DECLARE FUNCTION invokevirtual$ (a&)
DECLARE FUNCTION ldc$ (a%)
DECLARE FUNCTION getstatic$ (a&)
DECLARE FUNCTION LStr$ (name$)
DECLARE FUNCTION unhex$ (hexa$)
aload0$ = CHR$(42)
return$ = CHR$(177)
CLS
OPEN "HW.dat" FOR OUTPUT AS #1
PRINT #1, ""
CLOSE #1
OPEN "HW.dat" FOR BINARY AS #1
co$ = ""
co$ = co$ + unhex$("CAFEBABE")
co$ = co$ + unhex$("00000032")                  ' Classversion Number 0x32=50

co$ = co$ + unhex$("0024")                      'Length of the now comming field+1

co$ = co$ + unhex$("0A00090012")                '0x01 'java/lang/Object."<init>":()V
co$ = co$ + unhex$("0900130014")                '0x02 'java/lang/System.out:Ljava/io/PrintStream;
co$ = co$ + unhex$("080015")                    '0x03 'der erste Text,
co$ = co$ + unhex$("0A00160017")                '0x04 'java/io/PrintStream.println:(Ljava/lang/String;)V
co$ = co$ + unhex$("080018")                    '0x05 'der zweite Text
co$ = co$ + unhex$("0A00160019")                '0x06 'java/io/PrintStream.print:(Ljava/lang/String;)V
co$ = co$ + unhex$("08001A")                    '0x07 'und der dritte Text.
co$ = co$ + unhex$("07001B")                    '0x08 'HalloWelt
co$ = co$ + unhex$("07001C")                    '0x09 'java/lang/Object
co$ = co$ + LStr$("<init>")                     '0x0A
co$ = co$ + LStr$("()V")                        '0x0B
co$ = co$ + LStr$("Code")                       '0x0C
co$ = co$ + LStr$("LineNumberTable")            '0x0D
co$ = co$ + LStr$("main")                       '0x0E
co$ = co$ + LStr$("([Ljava/lang/String;)V")     '0x0F
co$ = co$ + LStr$("SourceFile")                 '0x10
co$ = co$ + LStr$("HalloWelt.java")             '0x11
co$ = co$ + unhex$("0C000A000B")                '0x12 '"<init>":()V
co$ = co$ + unhex$("07001D")                    '0x13 'java/lang/System.
co$ = co$ + unhex$("0C001E001F")                '0x14 'out:Ljava/io/PrintStream;
co$ = co$ + LStr$("der erste Text,")            '0x15
co$ = co$ + unhex$("070020")                    '0x16 'java/io/PrintStream.
co$ = co$ + unhex$("0C00210022")                '0x17 'println:(Ljava/lang/String;)V
co$ = co$ + LStr$("der zweite Text ")           '0x18
co$ = co$ + unhex$("0C00230022")                '0x19 'print:(Ljava/lang/String;)V
co$ = co$ + LStr$("und der dritte Text.")       '0x1A
co$ = co$ + LStr$("HalloWelt")                  '0x1B
co$ = co$ + LStr$("java/lang/Object")           '0x1C
co$ = co$ + LStr$("java/lang/System")           '0x1D
co$ = co$ + LStr$("out")                        '0x1E
co$ = co$ + LStr$("Ljava/io/PrintStream;")      '0x1F
co$ = co$ + LStr$("java/io/PrintStream")        '0x20
co$ = co$ + LStr$("println")                    '0x21
co$ = co$ + LStr$("(Ljava/lang/String;)V")      '0x22
co$ = co$ + LStr$("print")                      '0x23

co$ = co$ + unhex$("0020000800090000000000020000000A")  ' for what is this ??? possible is the 0x20=32 the number of bytes until
co$ = co$ + unhex$("000B0001000C0000001D000100010000")  ' the first assembler code. But what is with the rest?
co$ = co$ + unhex$("0005")

co$ = co$ + aload0$
co$ = co$ + invokespecial$(1)
co$ = co$ + return$

co$ = co$ + unhex$("00000001000D00000006000100000001")  ' and for what this ???
co$ = co$ + unhex$("0009000E000F0001000C0000003D0002")
co$ = co$ + unhex$("000100000019")

co$ = co$ + getstatic$(2)
co$ = co$ + ldc$(3)
co$ = co$ + invokevirtual$(4)
co$ = co$ + getstatic$(2)
co$ = co$ + ldc$(5)
co$ = co$ + invokevirtual$(6)
co$ = co$ + getstatic$(2)
co$ = co$ + ldc$(7)
co$ = co$ + invokevirtual$(4)
co$ = co$ + return$

co$ = co$ + unhex$("00000001000D00000012000400000003")  ' and this ???
co$ = co$ + unhex$("00080004001000050018000600010010")
co$ = co$ + unhex$("000000020011")


PUT #1, 1, co$
CLOSE #1

SHELL "xcopy /y HW.dat HalloWelt.class"
SHELL "java HalloWelt"
'SHELL "c:\Progra~1\java\jdk16~1.0_1\bin\javap.exe -c HalloWelt"

FUNCTION getstatic$ (a&)
IF a& > 65535 THEN PRINT "*** Error": END
a1& = INT(a& / 256)
a2& = a& - a1& * 256
getstatic$ = CHR$(178) + CHR$(a1&) + CHR$(a2&)
END FUNCTION

FUNCTION invokespecial$ (a&)
IF a& > 65535 THEN PRINT "*** Error": END
a1& = INT(a& / 256)
a2& = a& - a1& * 256
invokespecial$ = CHR$(183) + CHR$(a1&) + CHR$(a2&)
END FUNCTION

FUNCTION invokevirtual$ (a&)
IF a& > 65535 THEN PRINT "*** Error": END
a1& = INT(a& / 256)
a2& = a& - a1& * 256
invokevirtual$ = CHR$(182) + CHR$(a1&) + CHR$(a2&)
END FUNCTION

FUNCTION ldc$ (a%)
IF a% > 255 THEN PRINT "*** Error": END
ldc$ = CHR$(18) + CHR$(a%)
END FUNCTION

FUNCTION LStr$ (name$)
' gives out the length of name$ as character and adds the name$ to it

a& = LEN(name$)
IF a& > 65535 THEN PRINT "*** Error": END
a1& = INT(a& / 256)
a2& = a& - a1& * 256

LStr$ = CHR$(1) + CHR$(a1&) + CHR$(a2&) + name$

END FUNCTION

FUNCTION unhex$ (hexa$)

uhex$ = ""

FOR i = 1 TO LEN(hexa$) / 2
 ahex$ = MID$(hexa$, i * 2 - 1, 1)
  IF ahex$ = "0" THEN abyte% = 0
  IF ahex$ = "1" THEN abyte% = 1
  IF ahex$ = "2" THEN abyte% = 2
  IF ahex$ = "3" THEN abyte% = 3
  IF ahex$ = "4" THEN abyte% = 4
  IF ahex$ = "5" THEN abyte% = 5
  IF ahex$ = "6" THEN abyte% = 6
  IF ahex$ = "7" THEN abyte% = 7
  IF ahex$ = "8" THEN abyte% = 8
  IF ahex$ = "9" THEN abyte% = 9
  IF ahex$ = "A" THEN abyte% = 10
  IF ahex$ = "B" THEN abyte% = 11
  IF ahex$ = "C" THEN abyte% = 12
  IF ahex$ = "D" THEN abyte% = 13
  IF ahex$ = "E" THEN abyte% = 14
  IF ahex$ = "F" THEN abyte% = 15

 bhex$ = MID$(hexa$, i * 2, 1)
  IF bhex$ = "0" THEN bbyte% = 0
  IF bhex$ = "1" THEN bbyte% = 1
  IF bhex$ = "2" THEN bbyte% = 2
  IF bhex$ = "3" THEN bbyte% = 3
  IF bhex$ = "4" THEN bbyte% = 4
  IF bhex$ = "5" THEN bbyte% = 5
  IF bhex$ = "6" THEN bbyte% = 6
  IF bhex$ = "7" THEN bbyte% = 7
  IF bhex$ = "8" THEN bbyte% = 8
  IF bhex$ = "9" THEN bbyte% = 9
  IF bhex$ = "A" THEN bbyte% = 10
  IF bhex$ = "B" THEN bbyte% = 11
  IF bhex$ = "C" THEN bbyte% = 12
  IF bhex$ = "D" THEN bbyte% = 13
  IF bhex$ = "E" THEN bbyte% = 14
  IF bhex$ = "F" THEN bbyte% = 15

uhex$ = uhex$ + CHR$(abyte% * 16 + bbyte%)
NEXT i
unhex$ = uhex$
END FUNCTION



_________________________________________________________________
Spielspaß für Jedermann! Mit tausenden von Spielen für Windows Vista!
http://redirect.gimas.net/?n=M0812xSpieleVistaDE
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.