first commit
This commit is contained in:
commit
063194f8be
349 changed files with 36508 additions and 0 deletions
505
jasmin/jasmin-2.4/docs/instructions.html
Normal file
505
jasmin/jasmin-2.4/docs/instructions.html
Normal file
|
@ -0,0 +1,505 @@
|
|||
<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>
|
Loading…
Add table
Add a link
Reference in a new issue