JVMInstructionSet

Download Report

Transcript JVMInstructionSet

Java Virtual Machine:
Instruction Set
Cheng-Chia Chen
1
Java Program
class SumI {
public static void main (String[] args) {
int count=10;
int sum =0;
for (int index=1;index<count;index++)
sum=sum+index;
} // method main
} // class SumI
2
2
Java ByteCode
Method void main(java.lang.String[])
0 bipush 10
// byte push 10 to stack (0x10)
2 istore_1
// load 10 (top of stack) to count
3 iconst_0
// push 0 to stack
4 istore_2
// load 0 (top of stack to sum
5 iconst_1
// push 1 to stack
6 istore_3
// load 1 (top of stack) to index
7 goto 17
// go to 17
3
3
Java ByteCode
10 iload_2
// load sum to stack
11 iload_3// load index to stack
12 iadd
// add
13 istore_2
// store “top of stack” to sum
14 iinc 3 1
// index ++
17 iload_3
// load index to stack
18 iload_1
// load count to stack
19 if_icmplt 10 // if index < count goto 10
22 return
3
4
import java.io.*;
class ReadFile {
public static void main (String[] args) {
try {
FileInputStream in =
new FileInputStream(args[0]);
int c;
while((c = in.read()) != -1)
System.out.println(c);
in.close();
} catch(Exception e) {
e.printStackTrace();
}
} // method main
} // class ReadFile
5
JVM Instruction Sets











Stack and Local Variable Operations
Type Conversion
Integer Arithmetic
Logic and Bit manipulation
Floating Point Arithmetic
Objects and Arrays
Control Flow
Exceptions
Finally Clauses
Method Invocation and Return
Thread Synchronization
6
Menmonics for instruction type









i for an int operation,
l for long,
s for short,
b for byte,
c for char,
f for float,
d for double, and
a for reference/array.
EX: iload, lload, fload, dload, aload,…
7
Load and Store Instructions
transfer values between the local variables
and the operand stack
 load: localVar  Stack
 store: Stack  localVar
 [i | l | f | d | a]load u8,// or wide load u16
 [i | l | f | d | a]load_<n>, // n=0..3
 [i | l | f | d | a]store u8, // or wide load u16
 [i | l | f | d | a]store_<n>, // n=0..3

8
Push Constants onto stack

iconst_x
» x=m1..5; push int x onto stack.

fconst_x
» x=0..2; push float x onto stack.

lconst_x ; dconst_x :
» x=0 or 1; push long (or double) x onto stack


aconst_null: push null onto stack.
bipush s8; sipush s16,
» push (int) s8 [or (int) s16] onto stack
9
Push Constants onto stack

ldc u8; ldc_w u16, ldc2_w u16,
» push single word (or double worlds for
ldc2) from constant_pool entry u8 (or u16)
» ldc/ldc_w can be used to push
byte/short/char/int/float/String constants.
10
Generic Stack Operations





nop // do nothing
pop, pop2, // pop top (two) words
dup, dup2, // duplicate top (two) words
swap. // swap top two words
dup_x1, dup_x2
» duplicate top words and put 1 ( 2 ) down
» w3, w2, w1 => w3,w1,w2,w1 or (w1,w3,w2,w1)

dup2_x1, dup2_x2,
» w4, w3, w2, w1 =>w4, w2,w1, w3,w2,w1 or
(w2,w1,w4,w3,w2,w1)
11
Integer and floating point
Arithmetic Instructions







Add: iadd, ladd, fadd, dadd.
Subtract: isub, lsub, fsub, dsub.
Multiply: imul, lmul, fmul, dmul.
Divide: idiv, ldiv, fdiv, ddiv.
Remainder: irem, lrem, frem, drem.
Negate: ineg, lneg, fneg, dneg.
Local variable increment:
» iinc u8 s8 // add s8 to lcalvar[u8].
» wide iinc u16 s16 // add s16 to local var at u16
12
Shift and Bitwise operations

Shift: ishl, ishr, iushr, lshl, lshr, lushr.
» ishl : … int2, int1 => … , int2<<(int1 & 0x001f)
» lushr: … long2, int1=> … , long2 >>> (int1 &
0x003f)
Bitwise OR: ior, lor.
 Bitwise AND: iand, land.
 Bitwise exclusive OR: ixor, lxor.

13
Comparison operations

dcmpg, dcmpl,
» …d1,d2=>… int; (d1 < d2 =>-1; d2=d1=> 0;
d1>d2 =>1 ) or NaN=>(g =>1; l=>-1)
fcmpg, fcmpl, // like above
 lcmp.

» … long1, long2 => … int k where
» k = -1, 0 or 1 depending on long1 <, = or >
long2.
14
Type Conversion Instructions

widening conversions:
» int  long  float  double :
» i2l, i2f, i2d, l2f, l2d, f2d.
» // sign extension+round-to-nearest mode

Narrowing conversions:
» double  float  long  int :
» d2f, d2l, d2i, f2l, f2i, l2i // truncate+ sign
extension+ rtn mode
» int  short, byte, char:
» i2s, i2c, i2b // truncate+ sign extension

Note: byte, short, char  int are done
automaticaly.
15
Object Creation and Field
Access

new
» Create a new class instance on the heap,
» and push a reference:

Field access:
»
»
»
»

getfield fieldRefIndex;
… objRef  … value;
getstatic fieldRefIndex
…  value;
putfield fieldRefIndex,
…objRef, value …
putstatic fieldRefIndex
…value  …
Type Checking:
» instanceof class_index : … objRef  … RltVal
» checkcast class_index: …obj1  … obj1 if obj1
can be casted to class type, o/w throw
CastException
16
Array Creation

newarray aType:
» pop length, allocate new primitive array of type given
by atype, push the reference.
» aType : (z,c,f,d,b,s,i,l) ->(4,5,6,7,8,9,10,11)
» … u16 -> arrayRef

anewarray Class_index,
» pop length, allocate new array of type given by
class_index, push the reference

multianewarray type_index dim:u8.
» pop dim number of array lengths, allocate multidimensional array of type class_index, pop reference.
» new int[10][20] ==> p10, p20, multianewarray [[i 2.
17
Array Component Access

array component  stack :
» baload, caload, saload, iaload,
» … arrayRef, index:s32  … (int) array[index]
» laload, faload, daload, aaload.

stack  array component
» bastore, castore, sastore, iastore,
» … arrayRef, index:s32, val  …
» lastore, fastore, dastore, aastore.

Get the length of array: arraylength
» … arrayRef  … (int)array.length
18
Control flow Instructions
1. Conditional Branches

Conditional branch:
» unary comparsions
– ifeq, iflt, ifle, ifne, ifgt, ifge, // =0?, <0?,…
– ifnull, ifnonnull, // null or not null
» binary comparisons
– if_icmpeq, if_icmpne, if_icmplt, if_icmpgt,
if_icmple, if_icmpge,
– if_acmpeq, if_acmpne. // compare reference

For comparison of long, double and float
» use dcmpg, dcmpl, fcmpg, fcmpl, lcmp and
» unary comparisons on int.
19
Control flow Instructions :
2.Compound Conditional Branches

lookupswitch <0-3bytepads for word alignment>
defaultOffset #pairs {case offset}#pairs:
» all (blue) fields are int32 values
» case must be in ascending order
» e.g.: lookupswitch lab0 3 2 lab1 10 lab2 13 lab3

tableswitch <0-3pads> defOffset lowCase
highCase offset high-low+1.
» goto offset[top-low+1] iff low ≤ top ≤ high
» else goto defOffset.
» e.g.: tableswitch lab0 11 14 lab11 lab12 lab13 lab14.
20
Control flow Instructions
: Unconditional branches

goto s16; goto_w s32
» pc = pc + s16 (or s32).
// for implementing finally clauses
// intraMethod subroutine call
 jsr s16, jsr_w s32,
» push return addr and jumpToSubroutine pc+s16 for a
finally block
» …  … returnAddr

ret u8; widen ret u16,
» return to addr given by localVar u8 or u16 .
21
Method Invocation and Return
Instructions


invokevirtual : for normal methods
invokeInterface:
» for interface methods // search of implementation is
needed

invokespecial:
» for private method, superclass method and instance
initialization (constructors) methods



invokestatic : for static methods
format: opcode u16 // methodRefIndex
return :
» ireturn, lreturn, freturn, dreturn, areturn
» return : for void, instance, class (or interface)
initialization methods
22
Exceptions related Instructions

Throw Exception:
» athrow
» can also be thrown by other instructions if
abnormal condition detected.
» … ExcObj  …


Implementing finally
jsr s16, jsr_w s32,
» jumpToSubroutine pc+s16 for a finally block

ret u8; widen ret u16,
» return to addr given by localVar u8 or u16 .
23
Synchronization

via monitor construct:
» monitorenter, monitorexit

monitorenter
» pop objectref, acquire the lock associated
with the object.
» … ObjRef  …

monitorexit
» pop objectref, release the lock associate
with objectref
» … ObjRef  …
24
Classes needing special support
of JVM

Reflection:
» java.lang.reflect.* and java.lang.Class.

Loading and creation of a class or interface.
» ClassLoader.


Linking and initialization of a class or
interface.
Security:
» java.security.** and other classes such as
SecurityManager.



Multithreading, such as the class Thread.
Weak references: java.lang.ref.*
…
25