/* * Interactive disassembler (IDA) * Copyright (c) 1990-98 by Ilfak Guilfanov. * E-mail: ig@datarescue.com * JVM module. * Copyright (c) 1995-2006 by Iouri Kharon. * E-mail: yjh@styx.cabel.net * * ALL RIGHTS RESERVED. * */ #include #include #include "ins.hpp" // ATTENTION: if change mnemonic(s) change version in 'jas_rw.cc' const instruc_t Instructions[] = { //{ "", 0 }, // Unknown Operation { "nop", 0 }, //Do nothing { "aconst_null", 0 }, //Push null object reference { "iconst_m1", 0 }, //Push integer constant -1 { "iconst_0", 0 }, //Push the integer 0 { "iconst_1", 0 }, //Push the integer 1 { "iconst_2", 0 }, //Push the integer 2 { "iconst_3", 0 }, //Push the integer 3 { "iconst_4", 0 }, //Push the integer 4 { "iconst_5", 0 }, //Push the integer 5 { "lconst_0", 0 }, //Push the long integer 0 { "lconst_1", 0 }, //Push the long integer 1 { "fconst_0", 0 }, //Push the single-precision foating point 0.0 { "fconst_1", 0 }, //Push the single-precision foating point 1.0 { "fconst_2", 0 }, //Push the single-precision foating point 2.0 { "dconst_0", 0 }, //Push the double-precision foating point 0.0 { "dconst_1", 0 }, //Push the double-precision foating point 1.0 { "bipush", CF_USE1 }, //Push one-byte integer { "sipush", CF_USE1 }, //Push two-byte integer { "ldc", CF_USE1 }, //Push item from constant pool (i1) { "ldc_w", CF_USE1 }, //Push item from constant pool (i2) { "ldc2_w", CF_USE1 }, //Push long or double from constant pool { "iload", CF_USE1 }, //Push integer value of the local variable { "lload", CF_USE1 }, //Push long value of the local variable { "fload", CF_USE1 }, //Push single-float. val. of the local variable { "dload", CF_USE1 }, //Push double-float. val. of the local variable { "aload", CF_USE1 }, //Push object reference from the local variable { "iload_0", 0 }, //Push integer value of the local variable #0 { "iload_1", 0 }, //Push integer value of the local variable #1 { "iload_2", 0 }, //Push integer value of the local variable #2 { "iload_3", 0 }, //Push integer value of the local variable #3 { "lload_0", 0 }, //Push long value of the local variable #0 { "lload_1", 0 }, //Push long value of the local variable #1 { "lload_2", 0 }, //Push long value of the local variable #2 { "lload_3", 0 }, //Push long value of the local variable #3 { "fload_0", 0 }, //Push single-flt. val. of the local variable #0 { "fload_1", 0 }, //Push single-flt. val. of the local variable #1 { "fload_2", 0 }, //Push single-flt. val. of the local variable #2 { "fload_3", 0 }, //Push single-flt. val. of the local variable #3 { "dload_0", 0 }, //Push double-flt. val. of the local variable #0 { "dload_1", 0 }, //Push double-flt. val. of the local variable #1 { "dload_2", 0 }, //Push double-flt. val. of the local variable #2 { "dload_3", 0 }, //Push double-flt. val. of the local variable #3 { "aload_0", 0 }, //Push object reference from the local var. #0 { "aload_1", 0 }, //Push object reference from the local var. #1 { "aload_2", 0 }, //Push object reference from the local var. #2 { "aload_3", 0 }, //Push object reference from the local var. #3 { "iaload", 0 }, //Push integer from array { "laload", 0 }, //Push long from array { "faload", 0 }, //Push single float from array { "daload", 0 }, //Push double float from array { "aaload", 0 }, //Push object reference from array { "baload", 0 }, //Push signed byte from array { "caload", 0 }, //Push signed char from array { "saload", 0 }, //Push short from array { "istore", CF_CHG1 }, //Pop integer value into local variable { "lstore", CF_CHG1 }, //Pop long value into local variable { "fstore", CF_CHG1 }, //Pop single float value into local variable { "dstore", CF_CHG1 }, //Pop double float value into local variable { "astore", CF_CHG1 }, //Pop object refernce into local variable { "istore_0", 0 }, //Pop integer value into local variable #0 { "istore_1", 0 }, //Pop integer value into local variable #1 { "istore_2", 0 }, //Pop integer value into local variable #2 { "istore_3", 0 }, //Pop integer value into local variable #3 { "lstore_0", 0 }, //Pop long value into local variable #0 { "lstore_1", 0 }, //Pop long value into local variable #1 { "lstore_2", 0 }, //Pop long value into local variable #2 { "lstore_3", 0 }, //Pop long value into local variable #3 { "fstore_0", 0 }, //Pop single float value into local variable #0 { "fstore_1", 0 }, //Pop single float value into local variable #1 { "fstore_2", 0 }, //Pop single float value into local variable #2 { "fstore_3", 0 }, //Pop single float value into local variable #3 { "dstore_0", 0 }, //Pop doublefloat value into local variable #0 { "dstore_1", 0 }, //Pop doublefloat value into local variable #1 { "dstore_2", 0 }, //Pop doublefloat value into local variable #2 { "dstore_3", 0 }, //Pop doublefloat value into local variable #3 { "astore_0", 0 }, //Pop object refernce into local variable #0 { "astore_1", 0 }, //Pop object refernce into local variable #1 { "astore_2", 0 }, //Pop object refernce into local variable #2 { "astore_3", 0 }, //Pop object refernce into local variable #3 { "iastore", 0 }, //Pop integer from array { "lastore", 0 }, //Pop long from array { "fastore", 0 }, //Pop single float from array { "dastore", 0 }, //Pop double float from array { "aastore", 0 }, //Pop object reference from array { "bastore", 0 }, //Pop signed byte from array { "castore", 0 }, //Pop signed char from array { "sastore", 0 }, //Pop short from array { "pop", 0 }, //Pop top stack word { "pop2", 0 }, //Pop top two stack word { "dup", 0 }, //Duplicate top stack word { "dup_x1", 0 }, //Duplicate top stack word and put two down { "dup_x2", 0 }, //Duplicate top stack word and put three down { "dup2", 0 }, //Duplicate top two stack word { "dup2_x1", 0 }, //Duplicate top two stack words and put two down { "dup2_x2", 0 }, //Duplicate top two stack words and put three down { "swap", 0 }, //Swap two top stack words { "iadd", 0 }, //Integer add { "ladd", 0 }, //Long add { "fadd", 0 }, //Single float add { "dadd", 0 }, //Double float add { "isub", 0 }, //Integer subtract { "lsub", 0 }, //Long subtract { "fsub", 0 }, //Single float subtract { "dsub", 0 }, //Double float subtract { "imul", 0 }, //Integer multiply { "lmul", 0 }, //Long multiply { "fmul", 0 }, //Single float multiply { "dmul", 0 }, //Double float multiply { "idiv", 0 }, //Integer divide { "ldiv", 0 }, //Long divide { "fdiv", 0 }, //Single float divide { "ddiv", 0 }, //Double float divide { "irem", 0 }, //Integer remainder { "lrem", 0 }, //Long remainder { "frem", 0 }, //Single float remainder { "drem", 0 }, //Double float remainder { "ineg", 0 }, //Integer negate { "lneg", 0 }, //Long negate { "fneg", 0 }, //Single float negate { "dneg", 0 }, //Double float negate { "ishl", 0 }, //Integer shift left { "lshl", 0 }, //Long shift left { "ishr", 0 }, //Integer logical shift right { "lshr", 0 }, //Long logical shift right { "iushr", 0 }, //Integer arithmetic shift right { "lushr", 0 }, //Long arithmeticshift right { "iand", 0 }, //Integer boolean AND { "land", 0 }, //Long boolean AND { "ior", 0 }, //Integer boolean OR { "lor", 0 }, //Long boolean OR { "ixor", 0 }, //Integer boolean XOR { "lxor", 0 }, //Long boolean XOR { "iinc", CF_CHG1|CF_USE2 }, //Add 8-bit signed const to local variable { "i2l", 0 }, //Integer to Long conversion { "i2f", 0 }, //Integer to Single float conversion { "i2d", 0 }, //Integer to Double float conversion { "l2i", 0 }, //Long to Integer conversion { "l2f", 0 }, //Long to Single float conversion { "l2d", 0 }, //Long to Double float conversion { "f2i", 0 }, //Single float to Integer conversion { "f2l", 0 }, //Single float to Long conversion { "f2d", 0 }, //Single float to Double float conversion { "d2i", 0 }, //Double float to Integer conversion { "d2l", 0 }, //Double float to Long conversion { "d2f", 0 }, //Double float to Single float conversion { "int2byte", 0 }, //Integer to signed byte conversion { "int2char", 0 }, //Integer to unsigned short conversion { "int2short", 0 }, //Integer to signed short conversion { "lcmp", 0 }, //Long compare { "fcmpl", 0 }, //Single float compare (-1 on NaN) { "fcmpg", 0 }, //Single float compare (1 on NaN) { "dcmpl", 0 }, //Double float compare (-1 on NaN) { "dcmpg", 0 }, //Double float compare (1 on NaN) { "ifeq", CF_USE1 }, //Branch if equal to 0 { "ifne", CF_USE1 }, //Branch if not equal to 0 { "iflt", CF_USE1 }, //Branch if less then 0 { "ifge", CF_USE1 }, //Branch if greater than or equal to 0 { "ifgt", CF_USE1 }, //Branch if greater than 0 { "ifle", CF_USE1 }, //Branch if less than or equal to 0 { "if_icmpeq", CF_USE1 }, //Branch if integers equal { "if_icmpne", CF_USE1 }, //Branch if integers not equal { "if_icmplt", CF_USE1 }, //Branch if integers less than { "if_icmpge", CF_USE1 }, //Branch if integers grater than or equal to { "if_icmpgt", CF_USE1 }, //Branch if integers grater than { "if_icmple", CF_USE1 }, //Branch if integers less than or equal to { "if_acmpeq", CF_USE1 }, //Branch if object references are equal { "if_acmpne", CF_USE1 }, //Branch if object references not equal { "goto", CF_USE1|CF_STOP }, //Branch always { "jsr", CF_USE1|CF_CALL }, //Jump subroutine { "ret", CF_USE1|CF_STOP }, //Return from subroutine { "tableswitch", CF_USE1|CF_USE2|CF_USE3 }, //Access jump table by index and jump { "lookupswitch", CF_USE1|CF_USE2 }, //Access jump table by key match and jump { "ireturn", CF_STOP }, //Return integer from function { "lreturn", CF_STOP }, //Return long from function { "freturn", CF_STOP }, //Return single float from function { "dreturn", CF_STOP }, //Return double float from function { "areturn", CF_STOP }, //Return object reference from function { "return", CF_STOP }, //Return (void) from procedure { "getstatic", CF_USE1 }, //Set static field from class { "putstatic", CF_USE1 }, //Set static field in class { "getfield", CF_USE1 }, //Fetch field from object { "putfield", CF_CHG1 }, //Set field in object { "invokevirtual", CF_USE1|CF_USE2|CF_CALL }, //invoke instance method { "invokespecial", CF_USE1|CF_CALL }, //invoke instance method (super/private/init) { "invokestatic", CF_USE1|CF_CALL }, //invoke a class (static) method { "invokeinterface", CF_USE1|CF_USE2|CF_USE3|CF_CALL }, //invoke interface method { "invokedynamic", CF_USE1|CF_USE2|CF_CALL }, // { "new", CF_USE1 }, //Create new object { "newarray", CF_USE1 }, //Allocate new array { "anewarray", CF_USE1 }, //Allocate new array of references to object { "arraylength", 0 }, //Get length of array { "athrow", CF_STOP }, //Throw exception or error { "checkcast", CF_USE1 }, //Make sure object is of given type { "instanceof", CF_USE1 }, //Determine if an object is of given type { "monitorenter", 0 }, //Enter monitored region of code { "monitorexit", 0 }, //Exit monitored region of code { "wide", 0 }, //WIDE PREFIX of Command { "multianewarray", CF_USE1|CF_USE2 }, //Allocate new multidimensional array { "ifnull", CF_USE1 }, //Branch if NULL-ptr { "ifnonnull", CF_USE1 }, //Branch if not NULL-ptr { "goto_w", CF_USE1 }, //Branch always (wide index) { "jsr_w", CF_USE1 }, //Jump subroutine (wide index) { "breakpoint", 0 }, //Stop and pass control to breakpoint handler //{ "ret_w", CF_USE1 }, //Return from subroutine (wide index) //Pseudocode for quick { "invokesuper", CF_USE1|CF_CALL }, { "invokevirtualobject", CF_USE1|CF_USE2|CF_CALL }, { "invokeignored", CF_USE1 }, //SUN-dependet { "software", 0 }, { "hardware", 0 } }; CASSERT(qnumber(Instructions) == j_last);