See The Jasmin User Guide for a description of other aspects of the Jasmin syntax.
ret <var-num>
aload <var-num>
astore <var-num>
dload <var-num>
dstore <var-num>
fload <var-num>
fstore <var-num>
iload <var-num>
istore <var-num>
lload <var-num>
lstore <var-num>
for example:
aload 1 ; push local variable 1 onto the stack
ret 2 ; return to the address held in local variable 2
bipush <int>
sipush <int>
for example:
bipush 100 ; push 100 onto the stack
The iinc instruction takes two integer parameters:
iinc <var-num> <amount>
for example:
iinc 3 -10 ; subtract 10 from local variable 3
goto <label>
goto_w <label>
if_acmpeq <label>
if_acmpne <label>
if_icmpeq <label>
if_icmpge <label>
if_icmpgt <label>
if_icmple <label>
if_icmplt <label>
if_icmpne <label>
ifeq <label>
ifge <label>
ifgt <label>
ifle <label>
iflt <label>
ifne <label>
ifnonnull <label>
ifnull <label>
jsr <label>
jsr_w <label>
For example:
Label1:
goto Label1 ; jump to the code at Label1
; (an infinite loop!)
anewarray <class>
checkcast <class>
instanceof <class>
new <class>
For example:
new java/lang/String ; create a new String object
invokenonvirtual <method-spec>
invokestatic <method-spec>
invokevirtual <method-spec>
for example:
; invokes java.io.PrintStream.println(String);
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
A method specification is formed of three parts: the characters before the
last '/' form the class name. The characters between the last '/' and '(' are
the method name. The rest of the string is the descriptor.
foo/baz/Myclass/myMethod(Ljava/lang/String;)V
--------------- ---------------------
| -------- |
| | |
class method descriptor
A special case is invokeinterface, which takes a <method-spec> and
an integer indicating how many arguments the method takes:
invokeinterface <method-spec> <num-args>
for example:
invokeinterface foo/Baz/myMethod(I)V 1
getfield <field-spec> <descriptor>
getstatic <field-spec> <descriptor>
putfield <field-spec> <descriptor>
putstatic <field-spec> <descriptor>
for example:
; get java.lang.System.out, which is a PrintStream
getstatic java/lang/System/out Ljava/io/PrintStream;
<field-spec> is composed of two parts, a classname and a fieldname. The
classname is all of the characters in the <field-spec> up to the last
'/' character, and the fieldname is the rest of the characters after the last
'/'. For example:
foo/baz/AnotherClass/anotherFunField
-- class name ------ --field name --
<descriptor> is the Java type descriptor of the field.
For example:
Ljava/io/PrintStream;
newarray <array-type>
for example:
newarray int
newarray short
newarray float
etc.
multianewarray <array-descriptor> <num-dimensions>
for example:
multianewarray [[[I 2
ldc <constant>
ldc_w <constant>
<constant> is either an integer, a floating point number, or a
quoted string. For example:
ldc 1.2 ; push a float
ldc 10 ; push an int
ldc "Hello World" ; push a String
ldc_w 3.141592654 ; push PI as a double
<lookupswitch> ::=
lookupswitch
<int1> : <label1>
<int2> : <label2>
...
default : <default-label>
For example:
; If the int on the stack is 3, jump to Label1.
; If it is 5, jump to Label2.
; Otherwise jump to DefaultLabel.
lookupswitch
3 : Label1
5 : Label2
default : DefaultLabel
Label1:
... got 3
Label2:
... got 5
DefaultLabel:
... got something else
<tableswitch> ::=
tableswitch <low>
<label1>
<label2>
...
default : <default-label>
For example:
; If the int on the stack is 0, jump to Label1.
; If it is 1, jump to Label2.
; Otherwise jump to DefaultLabel.
tableswitch 0
Label1
Label2
default : DefaultLabel
Label1:
... got 0
Label2:
... got 1
DefaultLabel:
... got something else
pop ; remove the top item from the stack
iconst_1 ; push 1 onto the stack
swap ; swap the top two items on the stack