java disassembler/assembler

Daniel Reynaud reynaud.danyel@wanadoo.fr
Tue Oct 25 19:21:00 GMT 2005


> Well, printing everything twice is not a good interface.
> Instead of:
>> ; 2: invokespecial 1 (java/lang/Object/<init> ()V)
>> and then later:
>> invokespecial java/lang/Object/<init>()V

it was an example to show you both the output of the disassembler in warmode 
and the jasmin translation. It is possible to have just the warmode output, 
or just the jasmin translation (it is even possible to have nothing, for 
those who were wondering :).
> The assembler could just ignore the "#NNN=" prefix. It would
> be nice to have an option where the the assembler would try to
> use constant pool entry NNN if it is unused or matches the request,
> or pick a different or new entry otherwise (and printing a warning).
> But I don't that's a critical feature.

I'll see what I can do with this. Sounds like a good idea. The jasmin code 
is becoming quite messy however if we combine all the new features.
> Note also you only want to print the constant pool and the constant
> pool indexes, in a "verbose" mode - probably not by default.

sure, the default is to print the jasmin output
Here is what I added these days :
- the new jasmin language accepts the pc of opcodes before the instruction, 
for example
0: ldc "hello"
2: invokesomething
- use of absolute or relative offset instead of labels. Example :
0: ldc "hello"
2: goto 0L ; the L means "0 as a label", so goto offset 0
5: goto 0 ; traditional goto, so goto 0 means stay here
8: goto -8 ; traditional goto, go 8 bytes backward
Label0:
11: goto Label0 ; traditional jasmin goto, with a label as a target
14: goto 1 ; go 1 byte forward
17: goto 5L ; go to offset 5
I think you've understood what I mean.
- I finally implemented StackMap attributes. It's quite awful but here is 
what I use :
You define stack map frames between .stack and .end stack, the attribute is 
implicitly the addition of all your stack map frames. You can define your 
stack map frames inside the code (the more convenient is to put them at the 
offset they represent). Example :
.method blablabla
...
 .stack
 offset 12
 locals Null
 locals Top
 locals Object foo/bar/Hello
 stack Null
 .end stack
 12: aload_0
 13: invokevirtual maddany/HelloWorldMIDlet/notifyDestroyed()V
 .stack
 offset 16
 locals Null
 locals Integer
 stack Uninitialized 12
 stack Long
 .end stack
 16: return
.end method
I think that's all. I'm preparing some documentation with all the syntax 
extensions to Jasmin.
Regards,
Daniel 


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /