505 lines
9.4 KiB
HTML
505 lines
9.4 KiB
HTML
<html>
|
|
<head>
|
|
<title>Jasmin Instructions</title>
|
|
<link href="style.css" rel="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<table ID="Table1">
|
|
<tr><td width=550>
|
|
<center>
|
|
<p><img src=jasmin_icon.jpg></p>
|
|
<p>
|
|
<div class="h1">JASMIN INSTRUCTIONS</div>
|
|
Jonathan Meyer, July 1996
|
|
</p>
|
|
</center>
|
|
|
|
<h1>Introduction</h1>
|
|
|
|
This document shows the syntax and the types of parameters required by
|
|
each Java VM instruction in Jasmin. It also shows brief illustrative
|
|
examples.<p>
|
|
|
|
See <a href="guide.html">The Jasmin User Guide</a> for a description
|
|
of other aspects of the Jasmin syntax.<p>
|
|
|
|
<h1>Local variable instructions</h1>
|
|
|
|
The following instructions use local variables:<p>
|
|
|
|
<pre>
|
|
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>
|
|
</pre>
|
|
|
|
for example:<p>
|
|
|
|
<pre>
|
|
aload 1 ; push local variable 1 onto the stack
|
|
ret 2 ; return to the address held in local variable 2
|
|
</pre>
|
|
|
|
<h1>The bipush, sipush and iinc instructions</h1>
|
|
|
|
The bipush and sipush instructions take an integer as a
|
|
parameter:<p>
|
|
|
|
<pre>
|
|
bipush <int>
|
|
sipush <int>
|
|
</pre>
|
|
|
|
for example:<p>
|
|
|
|
<pre>
|
|
bipush 100 ; push 100 onto the stack
|
|
</pre>
|
|
|
|
The iinc instruction takes two integer parameters:<p>
|
|
|
|
<pre>
|
|
iinc <var-num> <amount>
|
|
</pre>
|
|
|
|
for example:<p>
|
|
|
|
<pre>
|
|
iinc 3 -10 ; subtract 10 from local variable 3
|
|
</pre>
|
|
|
|
<h1>Branch instructions</h1>
|
|
|
|
The following instructions take a label as a parameter:
|
|
|
|
<pre>
|
|
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>
|
|
</pre>
|
|
|
|
For example:<p>
|
|
|
|
<pre>
|
|
|
|
Label1:
|
|
goto Label1 ; jump to the code at Label1
|
|
; (an infinite loop!)
|
|
|
|
</pre>
|
|
|
|
<h1>Class and object operations</h1>
|
|
|
|
The following instructions take a class name
|
|
as a parameter:
|
|
|
|
<pre>
|
|
anewarray <class>
|
|
checkcast <class>
|
|
instanceof <class>
|
|
new <class>
|
|
</pre>
|
|
|
|
For example:<p>
|
|
|
|
<pre>
|
|
new java/lang/String ; create a new String object
|
|
</pre>
|
|
|
|
<h1>Method invokation</h1>
|
|
|
|
The following instructions are used to invoke methods:<p>
|
|
|
|
<pre>
|
|
invokenonvirtual <method-spec>
|
|
invokestatic <method-spec>
|
|
invokevirtual <method-spec>
|
|
</pre>
|
|
|
|
for example:<p>
|
|
|
|
<pre>
|
|
|
|
; invokes java.io.PrintStream.println(String);
|
|
|
|
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
|
|
|
|
</pre>
|
|
|
|
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.<p>
|
|
|
|
<pre>
|
|
foo/baz/Myclass/myMethod(Ljava/lang/String;)V
|
|
--------------- ---------------------
|
|
| -------- |
|
|
| | |
|
|
class method descriptor
|
|
</pre>
|
|
|
|
|
|
A special case is invokeinterface, which takes a <method-spec> and
|
|
an integer indicating how many arguments the method takes:<p>
|
|
|
|
<pre>
|
|
invokeinterface <method-spec> <num-args>
|
|
</pre>
|
|
|
|
for example:<p>
|
|
|
|
<pre>
|
|
invokeinterface foo/Baz/myMethod(I)V 1
|
|
</pre>
|
|
|
|
<h1>Field manipulation instructions</h1>
|
|
|
|
The four instructions getfield, getstatic, putfield and
|
|
putstatic have the form:<p>
|
|
|
|
<pre>
|
|
getfield <field-spec> <descriptor>
|
|
getstatic <field-spec> <descriptor>
|
|
putfield <field-spec> <descriptor>
|
|
putstatic <field-spec> <descriptor>
|
|
</pre>
|
|
|
|
for example:
|
|
|
|
<pre>
|
|
; get java.lang.System.out, which is a PrintStream
|
|
getstatic java/lang/System/out Ljava/io/PrintStream;
|
|
</pre>
|
|
|
|
<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: <p>
|
|
|
|
<pre>
|
|
foo/baz/AnotherClass/anotherFunField
|
|
-- class name ------ --field name --
|
|
</pre>
|
|
|
|
<descriptor> is the Java type descriptor of the field.
|
|
For example:<p>
|
|
|
|
<pre>
|
|
Ljava/io/PrintStream;
|
|
</pre>
|
|
|
|
|
|
<h1>The newarray instruction</h1>
|
|
|
|
The newarray instruction is followed by the type of the array,<p>
|
|
|
|
<pre>
|
|
newarray <array-type>
|
|
</pre>
|
|
|
|
for example:<p>
|
|
|
|
<pre>
|
|
newarray int
|
|
newarray short
|
|
newarray float
|
|
etc.
|
|
</pre>
|
|
|
|
<h1>The multianewarray instruction</h1>
|
|
|
|
The multianewarray instruction takes two parameters,
|
|
the type descriptor for the array and the number of
|
|
dimensions to allocate:<p>
|
|
|
|
<pre>
|
|
multianewarray <array-descriptor> <num-dimensions>
|
|
</pre>
|
|
|
|
for example:<p>
|
|
|
|
<pre>
|
|
multianewarray [[[I 2
|
|
</pre>
|
|
|
|
<h1>The ldc and ldc_w instructions</h1>
|
|
|
|
The ldc and ldc_w instructions are followed by a constant:<p>
|
|
|
|
<pre>
|
|
ldc <constant>
|
|
ldc_w <constant>
|
|
</pre>
|
|
|
|
<constant> is either an integer, a floating point number, or a
|
|
quoted string. For example:<p>
|
|
|
|
<pre>
|
|
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
|
|
</pre>
|
|
|
|
<h1>The lookupswitch instruction</h1>
|
|
|
|
The lookupswitch instruction has the syntax:<p>
|
|
|
|
<pre>
|
|
<lookupswitch> ::=
|
|
lookupswitch
|
|
<int1> : <label1>
|
|
<int2> : <label2>
|
|
...
|
|
default : <default-label>
|
|
</pre>
|
|
|
|
For example:<p>
|
|
|
|
<pre>
|
|
; 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
|
|
</pre>
|
|
|
|
<h1>The tableswitch instruction</h1>
|
|
|
|
The tableswitch instruction has the syntax:<p>
|
|
|
|
<pre>
|
|
<tableswitch> ::=
|
|
tableswitch <low>
|
|
<label1>
|
|
<label2>
|
|
...
|
|
default : <default-label>
|
|
</pre>
|
|
|
|
For example:<p>
|
|
|
|
<pre>
|
|
; 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
|
|
</pre>
|
|
|
|
<h1>No parameter</h1>
|
|
|
|
The following instructions (the majority) take no parameters:<p>
|
|
|
|
<dl><dd>
|
|
aaload
|
|
aastore
|
|
aconst_null
|
|
aload_0
|
|
aload_1
|
|
aload_2
|
|
aload_3
|
|
areturn
|
|
arraylength
|
|
astore_0
|
|
astore_1
|
|
astore_2
|
|
astore_3
|
|
athrow
|
|
baload
|
|
bastore
|
|
breakpoint
|
|
caload
|
|
castore
|
|
d2f
|
|
d2i
|
|
d2l
|
|
dadd
|
|
daload
|
|
dastore
|
|
dcmpg
|
|
dcmpl
|
|
dconst_0
|
|
dconst_1
|
|
ddiv
|
|
dload_0
|
|
dload_1
|
|
dload_2
|
|
dload_3
|
|
dmul
|
|
dneg
|
|
drem
|
|
dreturn
|
|
dstore_0
|
|
dstore_1
|
|
dstore_2
|
|
dstore_3
|
|
dsub
|
|
dup
|
|
dup2
|
|
dup2_x1
|
|
dup2_x2
|
|
dup_x1
|
|
dup_x2
|
|
f2d
|
|
f2i
|
|
f2l
|
|
fadd
|
|
faload
|
|
fastore
|
|
fcmpg
|
|
fcmpl
|
|
fconst_0
|
|
fconst_1
|
|
fconst_2
|
|
fdiv
|
|
fload_0
|
|
fload_1
|
|
fload_2
|
|
fload_3
|
|
fmul
|
|
fneg
|
|
frem
|
|
freturn
|
|
fstore_0
|
|
fstore_1
|
|
fstore_2
|
|
fstore_3
|
|
fsub
|
|
i2d
|
|
i2f
|
|
i2l
|
|
iadd
|
|
iaload
|
|
iand
|
|
iastore
|
|
iconst_0
|
|
iconst_1
|
|
iconst_2
|
|
iconst_3
|
|
iconst_4
|
|
iconst_5
|
|
iconst_m1
|
|
idiv
|
|
iload_0
|
|
iload_1
|
|
iload_2
|
|
iload_3
|
|
imul
|
|
ineg
|
|
int2byte
|
|
int2char
|
|
int2short
|
|
ior
|
|
irem
|
|
ireturn
|
|
ishl
|
|
ishr
|
|
istore_0
|
|
istore_1
|
|
istore_2
|
|
istore_3
|
|
isub
|
|
iushr
|
|
ixor
|
|
l2d
|
|
l2f
|
|
l2i
|
|
ladd
|
|
laload
|
|
land
|
|
lastore
|
|
lcmp
|
|
lconst_0
|
|
lconst_1
|
|
ldiv
|
|
lload_0
|
|
lload_1
|
|
lload_2
|
|
lload_3
|
|
lmul
|
|
lneg
|
|
lor
|
|
lrem
|
|
lreturn
|
|
lshl
|
|
lshr
|
|
lstore_0
|
|
lstore_1
|
|
lstore_2
|
|
lstore_3
|
|
lsub
|
|
lushr
|
|
lxor
|
|
monitorenter
|
|
monitorexit
|
|
nop
|
|
pop
|
|
pop2
|
|
return
|
|
saload
|
|
sastore
|
|
swap
|
|
</dl>
|
|
|
|
for example:
|
|
|
|
<pre>
|
|
pop ; remove the top item from the stack
|
|
iconst_1 ; push 1 onto the stack
|
|
swap ; swap the top two items on the stack
|
|
</pre>
|
|
|
|
<hr><address>Copyright (c) Jonathan Meyer, July 1996</address>
|
|
<hr>
|
|
<a href="http://mrl.nyu.edu/meyer/jvm/jasmin.html">Jasmin Home</a> |
|
|
<a href="http://mrl.nyu.edu/meyer/">Jon Meyer's Home</a>
|