/*
* Copyright ( C ) 2007 The Android Open Source Project
*
* Licensed under the Apache License , Version 2 . 0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
package com.android.dx.io;
/**
* All the Dalvik opcode value constants .
*
* @ see < a href = " https : //source.android.com/devices/tech/dalvik/dalvik-bytecode">Dalvik bytecode</a>
*/
public final class Opcodes {
/**
* pseudo - opcode used for nonstandard format payload " instructions " . TODO :
* Retire this concept , and start treating the payload instructions
* more like the rest .
*/
public static final int SPECIAL_FORMAT = -1 ;
/**
* pseudo - opcode used to indicate there is no next opcode ; used
* in opcode chaining lists
*/
public static final int NO_NEXT = -1 ;
/** minimum valid opcode value */
public static final int MIN_VALUE = -1 ;
/** maximum valid opcode value */
public static final int MAX_VALUE = 0 xffff;
// BEGIN(opcodes); GENERATED AUTOMATICALLY BY opcode-gen
public static final int NOP = 0 x00;
public static final int MOVE = 0 x01;
public static final int MOVE_FROM16 = 0 x02;
public static final int MOVE_16 = 0 x03;
public static final int MOVE_WIDE = 0 x04;
public static final int MOVE_WIDE_FROM16 = 0 x05;
public static final int MOVE_WIDE_16 = 0 x06;
public static final int MOVE_OBJECT = 0 x07;
public static final int MOVE_OBJECT_FROM16 = 0 x08;
public static final int MOVE_OBJECT_16 = 0 x09;
public static final int MOVE_RESULT = 0 x0a;
public static final int MOVE_RESULT_WIDE = 0 x0b;
public static final int MOVE_RESULT_OBJECT = 0 x0c;
public static final int MOVE_EXCEPTION = 0 x0d;
public static final int RETURN_VOID = 0 x0e;
public static final int RETURN = 0 x0f;
public static final int RETURN_WIDE = 0 x10;
public static final int RETURN_OBJECT = 0 x11;
public static final int CONST_4 = 0 x12;
public static final int CONST_16 = 0 x13;
public static final int CONST = 0 x14;
public static final int CONST_HIGH16 = 0 x15;
public static final int CONST_WIDE_16 = 0 x16;
public static final int CONST_WIDE_32 = 0 x17;
public static final int CONST_WIDE = 0 x18;
public static final int CONST_WIDE_HIGH16 = 0 x19;
public static final int CONST_STRING = 0 x1a;
public static final int CONST_STRING_JUMBO = 0 x1b;
public static final int CONST_CLASS = 0 x1c;
public static final int MONITOR_ENTER = 0 x1d;
public static final int MONITOR_EXIT = 0 x1e;
public static final int CHECK_CAST = 0 x1f;
public static final int INSTANCE_OF = 0 x20;
public static final int ARRAY_LENGTH = 0 x21;
public static final int NEW_INSTANCE = 0 x22;
public static final int NEW_ARRAY = 0 x23;
public static final int FILLED_NEW_ARRAY = 0 x24;
public static final int FILLED_NEW_ARRAY_RANGE = 0 x25;
public static final int FILL_ARRAY_DATA = 0 x26;
public static final int THROW = 0 x27;
public static final int GOTO = 0 x28;
public static final int GOTO_16 = 0 x29;
public static final int GOTO_32 = 0 x2a;
public static final int PACKED_SWITCH = 0 x2b;
public static final int SPARSE_SWITCH = 0 x2c;
public static final int CMPL_FLOAT = 0 x2d;
public static final int CMPG_FLOAT = 0 x2e;
public static final int CMPL_DOUBLE = 0 x2f;
public static final int CMPG_DOUBLE = 0 x30;
public static final int CMP_LONG = 0 x31;
public static final int IF_EQ = 0 x32;
public static final int IF_NE = 0 x33;
public static final int IF_LT = 0 x34;
public static final int IF_GE = 0 x35;
public static final int IF_GT = 0 x36;
public static final int IF_LE = 0 x37;
public static final int IF_EQZ = 0 x38;
public static final int IF_NEZ = 0 x39;
public static final int IF_LTZ = 0 x3a;
public static final int IF_GEZ = 0 x3b;
public static final int IF_GTZ = 0 x3c;
public static final int IF_LEZ = 0 x3d;
public static final int AGET = 0 x44;
public static final int AGET_WIDE = 0 x45;
public static final int AGET_OBJECT = 0 x46;
public static final int AGET_BOOLEAN = 0 x47;
public static final int AGET_BYTE = 0 x48;
public static final int AGET_CHAR = 0 x49;
public static final int AGET_SHORT = 0 x4a;
public static final int APUT = 0 x4b;
public static final int APUT_WIDE = 0 x4c;
public static final int APUT_OBJECT = 0 x4d;
public static final int APUT_BOOLEAN = 0 x4e;
public static final int APUT_BYTE = 0 x4f;
public static final int APUT_CHAR = 0 x50;
public static final int APUT_SHORT = 0 x51;
public static final int IGET = 0 x52;
public static final int IGET_WIDE = 0 x53;
public static final int IGET_OBJECT = 0 x54;
public static final int IGET_BOOLEAN = 0 x55;
public static final int IGET_BYTE = 0 x56;
public static final int IGET_CHAR = 0 x57;
public static final int IGET_SHORT = 0 x58;
public static final int IPUT = 0 x59;
public static final int IPUT_WIDE = 0 x5a;
public static final int IPUT_OBJECT = 0 x5b;
public static final int IPUT_BOOLEAN = 0 x5c;
public static final int IPUT_BYTE = 0 x5d;
public static final int IPUT_CHAR = 0 x5e;
public static final int IPUT_SHORT = 0 x5f;
public static final int SGET = 0 x60;
public static final int SGET_WIDE = 0 x61;
public static final int SGET_OBJECT = 0 x62;
public static final int SGET_BOOLEAN = 0 x63;
public static final int SGET_BYTE = 0 x64;
public static final int SGET_CHAR = 0 x65;
public static final int SGET_SHORT = 0 x66;
public static final int SPUT = 0 x67;
public static final int SPUT_WIDE = 0 x68;
public static final int SPUT_OBJECT = 0 x69;
public static final int SPUT_BOOLEAN = 0 x6a;
public static final int SPUT_BYTE = 0 x6b;
public static final int SPUT_CHAR = 0 x6c;
public static final int SPUT_SHORT = 0 x6d;
public static final int INVOKE_VIRTUAL = 0 x6e;
public static final int INVOKE_SUPER = 0 x6f;
public static final int INVOKE_DIRECT = 0 x70;
public static final int INVOKE_STATIC = 0 x71;
public static final int INVOKE_INTERFACE = 0 x72;
public static final int INVOKE_VIRTUAL_RANGE = 0 x74;
public static final int INVOKE_SUPER_RANGE = 0 x75;
public static final int INVOKE_DIRECT_RANGE = 0 x76;
public static final int INVOKE_STATIC_RANGE = 0 x77;
public static final int INVOKE_INTERFACE_RANGE = 0 x78;
public static final int NEG_INT = 0 x7b;
public static final int NOT_INT = 0 x7c;
public static final int NEG_LONG = 0 x7d;
public static final int NOT_LONG = 0 x7e;
public static final int NEG_FLOAT = 0 x7f;
public static final int NEG_DOUBLE = 0 x80;
public static final int INT_TO_LONG = 0 x81;
public static final int INT_TO_FLOAT = 0 x82;
public static final int INT_TO_DOUBLE = 0 x83;
public static final int LONG_TO_INT = 0 x84;
public static final int LONG_TO_FLOAT = 0 x85;
public static final int LONG_TO_DOUBLE = 0 x86;
public static final int FLOAT_TO_INT = 0 x87;
public static final int FLOAT_TO_LONG = 0 x88;
public static final int FLOAT_TO_DOUBLE = 0 x89;
public static final int DOUBLE_TO_INT = 0 x8a;
public static final int DOUBLE_TO_LONG = 0 x8b;
public static final int DOUBLE_TO_FLOAT = 0 x8c;
public static final int INT_TO_BYTE = 0 x8d;
public static final int INT_TO_CHAR = 0 x8e;
public static final int INT_TO_SHORT = 0 x8f;
public static final int ADD_INT = 0 x90;
public static final int SUB_INT = 0 x91;
public static final int MUL_INT = 0 x92;
public static final int DIV_INT = 0 x93;
public static final int REM_INT = 0 x94;
public static final int AND_INT = 0 x95;
public static final int OR_INT = 0 x96;
public static final int XOR_INT = 0 x97;
public static final int SHL_INT = 0 x98;
public static final int SHR_INT = 0 x99;
public static final int USHR_INT = 0 x9a;
public static final int ADD_LONG = 0 x9b;
public static final int SUB_LONG = 0 x9c;
public static final int MUL_LONG = 0 x9d;
public static final int DIV_LONG = 0 x9e;
public static final int REM_LONG = 0 x9f;
public static final int AND_LONG = 0 xa0;
public static final int OR_LONG = 0 xa1;
public static final int XOR_LONG = 0 xa2;
public static final int SHL_LONG = 0 xa3;
public static final int SHR_LONG = 0 xa4;
public static final int USHR_LONG = 0 xa5;
public static final int ADD_FLOAT = 0 xa6;
public static final int SUB_FLOAT = 0 xa7;
public static final int MUL_FLOAT = 0 xa8;
public static final int DIV_FLOAT = 0 xa9;
public static final int REM_FLOAT = 0 xaa;
public static final int ADD_DOUBLE = 0 xab;
public static final int SUB_DOUBLE = 0 xac;
public static final int MUL_DOUBLE = 0 xad;
public static final int DIV_DOUBLE = 0 xae;
public static final int REM_DOUBLE = 0 xaf;
public static final int ADD_INT_2ADDR = 0 xb0;
public static final int SUB_INT_2ADDR = 0 xb1;
public static final int MUL_INT_2ADDR = 0 xb2;
public static final int DIV_INT_2ADDR = 0 xb3;
public static final int REM_INT_2ADDR = 0 xb4;
public static final int AND_INT_2ADDR = 0 xb5;
public static final int OR_INT_2ADDR = 0 xb6;
public static final int XOR_INT_2ADDR = 0 xb7;
public static final int SHL_INT_2ADDR = 0 xb8;
public static final int SHR_INT_2ADDR = 0 xb9;
public static final int USHR_INT_2ADDR = 0 xba;
public static final int ADD_LONG_2ADDR = 0 xbb;
public static final int SUB_LONG_2ADDR = 0 xbc;
public static final int MUL_LONG_2ADDR = 0 xbd;
public static final int DIV_LONG_2ADDR = 0 xbe;
public static final int REM_LONG_2ADDR = 0 xbf;
public static final int AND_LONG_2ADDR = 0 xc0;
public static final int OR_LONG_2ADDR = 0 xc1;
public static final int XOR_LONG_2ADDR = 0 xc2;
public static final int SHL_LONG_2ADDR = 0 xc3;
public static final int SHR_LONG_2ADDR = 0 xc4;
public static final int USHR_LONG_2ADDR = 0 xc5;
public static final int ADD_FLOAT_2ADDR = 0 xc6;
public static final int SUB_FLOAT_2ADDR = 0 xc7;
public static final int MUL_FLOAT_2ADDR = 0 xc8;
public static final int DIV_FLOAT_2ADDR = 0 xc9;
public static final int REM_FLOAT_2ADDR = 0 xca;
public static final int ADD_DOUBLE_2ADDR = 0 xcb;
public static final int SUB_DOUBLE_2ADDR = 0 xcc;
public static final int MUL_DOUBLE_2ADDR = 0 xcd;
public static final int DIV_DOUBLE_2ADDR = 0 xce;
public static final int REM_DOUBLE_2ADDR = 0 xcf;
public static final int ADD_INT_LIT16 = 0 xd0;
public static final int RSUB_INT = 0 xd1;
public static final int MUL_INT_LIT16 = 0 xd2;
public static final int DIV_INT_LIT16 = 0 xd3;
public static final int REM_INT_LIT16 = 0 xd4;
public static final int AND_INT_LIT16 = 0 xd5;
public static final int OR_INT_LIT16 = 0 xd6;
public static final int XOR_INT_LIT16 = 0 xd7;
public static final int ADD_INT_LIT8 = 0 xd8;
public static final int RSUB_INT_LIT8 = 0 xd9;
public static final int MUL_INT_LIT8 = 0 xda;
public static final int DIV_INT_LIT8 = 0 xdb;
public static final int REM_INT_LIT8 = 0 xdc;
public static final int AND_INT_LIT8 = 0 xdd;
public static final int OR_INT_LIT8 = 0 xde;
public static final int XOR_INT_LIT8 = 0 xdf;
public static final int SHL_INT_LIT8 = 0 xe0;
public static final int SHR_INT_LIT8 = 0 xe1;
public static final int USHR_INT_LIT8 = 0 xe2;
public static final int INVOKE_POLYMORPHIC = 0 xfa;
public static final int INVOKE_POLYMORPHIC_RANGE = 0 xfb;
public static final int INVOKE_CUSTOM = 0 xfc;
public static final int INVOKE_CUSTOM_RANGE = 0 xfd;
public static final int CONST_METHOD_HANDLE = 0 xfe;
public static final int CONST_METHOD_TYPE = 0 xff;
// END(opcodes)
// TODO: Generate these payload opcodes with opcode-gen.
/**
* special pseudo - opcode value for packed - switch data payload
* instructions
*/
public static final int PACKED_SWITCH_PAYLOAD = 0 x100;
/** special pseudo-opcode value for packed-switch data payload
* instructions
*/
public static final int SPARSE_SWITCH_PAYLOAD = 0 x200;
/** special pseudo-opcode value for fill-array-data data payload
* instructions
*/
public static final int FILL_ARRAY_DATA_PAYLOAD = 0 x300;
/**
* This class is uninstantiable .
*/
private Opcodes() {
// This space intentionally left blank.
}
/**
* Determines if the given opcode has the right " shape " to be
* valid . This includes the range { @ code 0 x01 . . 0 xfe } , the range
* { @ code 0 x00ff . . 0 xffff } where the low - order byte is either
* { @ code 0 } or { @ code 0 xff } , and the special opcode values { @ code
* SPECIAL_FORMAT } and { @ code NO_NEXT } . Note that not all of the
* opcode values that pass this test are in fact used . This method
* is meant to perform a quick check to reject blatantly wrong
* values ( e . g . when validating arguments ) .
*
* @ param opcode the opcode value
* @ return { @ code true } iff the value has the right " shape " to be
* possibly valid
*/
public static boolean isValidShape(int opcode) {
/*
* Note : This method bakes in knowledge that all opcodes are
* one of the forms :
*
* * single byte in range 0 x01 . . 0 xfe - - normal opcodes
* * ( byteValue < < 8 ) - - nop and data payload opcodes
* * ( ( byteValue < < 8 ) | 0 xff ) - - 16 - bit extended opcodes
* * SPECIAL_FORMAT or NO_NEXT - - pseudo - opcodes
*/
// Note: SPECIAL_FORMAT == NO_NEXT.
if (opcode < SPECIAL_FORMAT) {
return false ;
} else if (opcode == SPECIAL_FORMAT) {
return true ;
}
int lowByte = opcode & 0 xff;
if ((lowByte == 0 ) || (lowByte == 0 xff)) {
return true ;
}
return (opcode & 0 xff00) == 0 ;
}
/**
* Gets the opcode out of an opcode unit , the latter of which may also
* include one or more argument values .
*
* @ param opcodeUnit the opcode - containing code unit
* @ return the extracted opcode
*/
public static int extractOpcodeFromUnit(int opcodeUnit) {
/*
* Note : This method bakes in knowledge that all opcodes are
* either single - byte or of the forms ( byteValue < < 8 ) or
* ( ( byteValue < < 8 ) | 0 xff ) .
*/
int lowByte = opcodeUnit & 0 xff;
return ((lowByte == 0 ) || (lowByte == 0 xff)) ? opcodeUnit : lowByte;
}
}
Messung V0.5 in Prozent C=95 H=100 G=97
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-06-27)
¤
*© Formatika GbR, Deutschland