⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 javaopcode.java

📁 JPC: x86 PC Hardware Emulator. 牛津大学开发的一个纯JAVA的x86系统结构硬件模拟器。
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	case FRETURN:
	case DRETURN:
	case ARETURN:
	case RETURN:
        case ATHROW:
	    return true;
	default:
	    return false;
	}
    }

    public static int getJumpOffset(int[] code, int i)
    {
        switch (code[i]) {
        case IFEQ:
        case IFNE:
        case IFLT:
        case IFGE:
        case IFGT:
        case IFLE:
        case IF_ICMPEQ:
        case IF_ICMPNE:
        case IF_ICMPLT:
        case IF_ICMPGE:
        case IF_ICMPGT:
        case IF_ICMPLE:
        case IF_ACMPEQ:
        case IF_ACMPNE:
        case IFNULL:
        case IFNONNULL:
            return (short)((code[i+1] << 8) | code[i+2]);

        case GOTO:
        case JSR:
            return (short)((code[i+1] << 8) | code[i+2]);

        case GOTO_W:
        case JSR_W:
            return  (code[i+1] << 24) | (code[i+2] << 16) | (code[i+3] << 8) | code[i+4];

        case RET:
	    throw new IllegalStateException("Must fix stack delta measurement on methods with subroutines");

        default:
            return 0;
        }
    }

    public static int getStackDelta(int[] code, int i)
    {
        switch (code[i])
        {
        case AALOAD:
            return -1;
        case AASTORE:
            return -3;
        case ACONST_NULL:
            return +1;
        case ALOAD:
            return +1;
        case ALOAD_0:
            return +1;
        case ALOAD_1:
            return +1;
        case ALOAD_2:
            return +1;
        case ALOAD_3:
            return +1;
        case ANEWARRAY:
            return 0;
        case ARRAYLENGTH:
            return 0;
        case ASTORE:
            return -1;
        case ASTORE_0:
            return -1;
        case ASTORE_1:
            return -1;
        case ASTORE_2:
            return -1;
        case ASTORE_3:
            return -1;
        case ATHROW:
            // technically this isn't true, but I'm not sure what is...
            return 0;
        case BALOAD:
            return -1;
        case BASTORE:
            return -3;
        case BIPUSH:
            return +1;
        case CALOAD:
            return -1;
        case CASTORE:
            return -3;
        case CHECKCAST:
            return 0;
        case D2F:
            return -1;
        case D2I:
            return -1;
        case D2L:
            return 0;
        case DADD:
            return -2;
        case DALOAD:
            return 0;
        case DASTORE:
            return -4;
        case DCMPG:
            return -3;
        case DCMPL:
            return -3;
        case DCONST_0:
            return +2;
        case DCONST_1:
            return +2;
        case DDIV:
            return -2;
        case DLOAD:
            return +2;
        case DLOAD_0:
            return +2;
        case DLOAD_1:
            return +2;
        case DLOAD_2:
            return +2;
        case DLOAD_3:
            return +2;
        case DMUL:
            return -2;
        case DNEG:
            return 0;
        case DREM:
            return -2;
        case DSTORE:
            return -2;
        case DSTORE_0:
            return -2;
        case DSTORE_1:
            return -2;
        case DSTORE_2:
            return -2;
        case DSTORE_3:
            return -2;
        case DSUB:
            return -2;
        case DUP2:
            return +2;
        case DUP2_X1:
            return +2;
        case DUP2_X2:
            return +2;
        case DUP:
            return +1;
        case DUP_X1:
            return +1;
        case DUP_X2:
            return +1;
        case F2D:
            return +1;
        case F2I:
            return 0;
        case F2L:
            return +1;
        case FADD:
            return -1;
        case FALOAD:
            return -1;
        case FASTORE:
            return -3;
        case FCMPG:
            return -1;
        case FCMPL:
            return -1;
        case FCONST_0:
            return +1;
        case FCONST_1:
            return +1;
        case FCONST_2:
            return +1;
        case FDIV:
            return -1;
        case FLOAD:
            return +1;
        case FLOAD_0:
            return +1;
        case FLOAD_1:
            return +1;
        case FLOAD_2:
            return +1;
        case FLOAD_3:
            return +1;
        case FMUL:
            return -1;
        case FNEG:
            return 0;
        case FREM:
            return -1;
        case FSTORE:
            return -1;
        case FSTORE_0:
            return -1;
        case FSTORE_1:
            return -1;
        case FSTORE_2:
            return -1;
        case FSTORE_3:
            return -1;
        case FSUB:
            return -1;
        case GETFIELD:
            return CALC_FROM_CONST_POOL;
        case GETSTATIC:
            return CALC_FROM_CONST_POOL;
        case GOTO:
            return 0;
        case GOTO_W:
            return 0;
        case I2B:
            return 0;
        case I2C:
            return 0;
        case I2D:
            return +1;
        case I2F:
            return 0;
        case I2L:
            return +1;
        case I2S:
            return 0;
        case IADD:
            return -1;
        case IALOAD:
            return -1;
        case IAND:
            return -1;
        case IASTORE:
            return -3;
        case ICONST_0:
            return +1;
        case ICONST_1:
            return +1;
        case ICONST_2:
            return +1;
        case ICONST_3:
            return +1;
        case ICONST_4:
            return +1;
        case ICONST_5:
            return +1;
        case ICONST_M1:
            return +1;
        case IDIV:
            return -1;
        case IFEQ:
            return -1;
        case IFGE:
            return -1;
        case IFGT:
            return -1;
        case IFLE:
            return -1;
        case IFLT:
            return -1;
        case IFNE:
            return -1;
        case IFNONNULL:
            return -1;
        case IFNULL:
            return -1;
        case IF_ACMPEQ:
            return -2;
        case IF_ACMPNE:
            return -2;
        case IF_ICMPEQ:
            return -2;
        case IF_ICMPGE:
            return -2;
        case IF_ICMPGT:
            return -2;
        case IF_ICMPLE:
            return -2;
        case IF_ICMPLT:
            return -2;
        case IF_ICMPNE:
            return -2;
        case IINC:
            return 0;
        case ILOAD:
            return +1;
        case ILOAD_0:
            return +1;
        case ILOAD_1:
            return +1;
        case ILOAD_2:
            return +1;
        case ILOAD_3:
            return +1;
        case IMUL:
            return -1;
        case INEG:
            return 0;
        case INSTANCEOF:
            return 0;
        case INVOKEINTERFACE:
            return CALC_FROM_CONST_POOL;
//         case INVOKEINTERFACE:
//             return -(code[i+3] + 1);
        case INVOKESPECIAL:
            return CALC_FROM_CONST_POOL;
        case INVOKESTATIC:
            return CALC_FROM_CONST_POOL;
        case INVOKEVIRTUAL:
            return CALC_FROM_CONST_POOL;
        case IOR:
            return -1;
        case IREM:
            return -1;
        case ISHL:
            return -1;
        case ISHR:
            return -1;
        case ISTORE:
            return -1;
        case ISTORE_0:
            return -1;
        case ISTORE_1:
            return -1;
        case ISTORE_2:
            return -1;
        case ISTORE_3:
            return -1;
        case ISUB:
            return -1;
        case IUSHR:
            return -1;
        case IXOR:
            return -1;
        case JSR:
            return +1;
        case JSR_W:
            return +1;
        case L2D:
            return 0;
        case L2F:
            return -1;
        case L2I:
            return -1;
        case LADD:
            return -2;
        case LALOAD:
            return 0;
        case LAND:
            return -2;
        case LASTORE:
            return -4;
        case LCMP:
            return -3;
        case LCONST_0:
            return +2;
        case LCONST_1:
            return +2;
        case LDC2_W:
            return +2;
        case LDC:
            return +1;
        case LDC_W:
            return +1;
        case LDIV:
            return -2;
        case LLOAD:
            return +2;
        case LLOAD_0:
            return +2;
        case LLOAD_1:
            return +2;
        case LLOAD_2:
            return +2;
        case LLOAD_3:
            return +2;
        case LMUL:
            return -2;
        case LNEG:
            return 0;
        case LOOKUPSWITCH:
            return -1;
        case LOR:
            return -2;
        case LREM:
            return -2;
        case LSHL:
            return -1;
        case LSHR:
            return -1;
        case LSTORE:
            return -2;
        case LSTORE_0:
            return -2;
        case LSTORE_1:
            return -2;
        case LSTORE_2:
            return -2;
        case LSTORE_3:
            return -2;
        case LSUB:
            return -2;
        case LUSHR:
            return -1;
        case LXOR:
            return -2;
        case MONITORENTER:
            return -1;
        case MONITOREXIT:
            return -1;
        case MULTIANEWARRAY:
            return 1 - code[i+3];
        case NEW:
            return +1;
        case NEWARRAY:
            return 0;
        case NOP:
            return 0;
        case POP2:
            return -2;
        case POP:
            return -1;
        case PUTFIELD:
            return CALC_FROM_CONST_POOL;
        case PUTSTATIC:
            return CALC_FROM_CONST_POOL;
        case RET:
            return 0;
        case SALOAD:
            return -1;
        case SASTORE:
            return -3;
        case SIPUSH:
            return +1;
        case SWAP:
            return 0;
        case TABLESWITCH:
            return -1;
        case WIDE:
            return getStackDelta(code, i+1);
        // all returns actually flatten the stack completely....
        case ARETURN:
        case FRETURN:
        case IRETURN:
            return -1;
        case DRETURN:
        case LRETURN:
            return -2;
        case RETURN:
            return 0;
        case BREAKPOINT:
        case IMPDEP1:
        case IMPDEP2:
        case XXXUNUSEDXXX:
        default:
            throw new IllegalStateException("JavaOpcode - getStackDelta - reserved instrution!");
        }
    }


    public static int getLocalVariableAccess(int[] code, int i)
    {
        switch(code[i])
        {
        case ALOAD:
            return code[i+1];
        case ALOAD_0:
            return 0;
        case ALOAD_1:
            return 1;
        case ALOAD_2:
            return 2;
        case ALOAD_3:
            return 3;
        case ASTORE:
            return code[i+1];
        case ASTORE_0:
            return 0;
        case ASTORE_1:
            return 1;
        case ASTORE_2:
            return 2;
        case ASTORE_3:
            return 3;
        case DLOAD:
            return code[i+1] + 1;
        case DLOAD_0:
            return 1;
        case DLOAD_1:
            return 2;
        case DLOAD_2:
            return 3;
        case DLOAD_3:
            return 4;
        case DSTORE:
            return code[i+1] + 1;
        case DSTORE_0:
            return 1;
        case DSTORE_1:
            return 2;
        case DSTORE_2:
            return 3;
        case DSTORE_3:
            return 4;
        case FLOAD:
            return code[i+1];
        case FLOAD_0:
            return 0;
        case FLOAD_1:
            return 1;
        case FLOAD_2:
            return 2;
        case FLOAD_3:
            return 3;
        case FSTORE:
            return code[i+1];
        case FSTORE_0:
            return 0;
        case FSTORE_1:
            return 1;
        case FSTORE_2:
            return 2;
        case FSTORE_3:
            return 3;
        case ILOAD:
            return code[i+1];
        case ILOAD_0:
            return 0;
        case ILOAD_1:
            return 1;
        case ILOAD_2:
            return 2;
        case ILOAD_3:
            return 3;
        case ISTORE:
            return code[i+1];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -