#include <dxcut/dex.h>
Go to the source code of this file.
Classes | |
struct | DexOpFormat |
struct | DexInstruction |
Enumerations | |
enum | DexOpCode { OP_PSUEDO = 0x00, OP_NOP = 0x00, OP_MOVE = 0x01, OP_MOVE_FROM16 = 0x02, OP_MOVE_16 = 0x03, OP_MOVE_WIDE = 0x04, OP_MOVE_WIDE_FROM16 = 0x05, OP_MOVE_WIDE_16 = 0x06, OP_MOVE_OBJECT = 0x07, OP_MOVE_OBJECT_FROM16 = 0x08, OP_MOVE_OBJECT_16 = 0x09, OP_MOVE_RESULT = 0x0a, OP_MOVE_RESULT_WIDE = 0x0b, OP_MOVE_RESULT_OBJECT = 0x0c, OP_MOVE_EXCEPTION = 0x0d, OP_RETURN_VOID = 0x0e, OP_RETURN = 0x0f, OP_RETURN_WIDE = 0x10, OP_RETURN_OBJECT = 0x11, OP_CONST_4 = 0x12, OP_CONST_16 = 0x13, OP_CONST = 0x14, OP_CONST_HIGH16 = 0x15, OP_CONST_WIDE_16 = 0x16, OP_CONST_WIDE_32 = 0x17, OP_CONST_WIDE = 0x18, OP_CONST_WIDE_HIGH16 = 0x19, OP_CONST_STRING = 0x1a, OP_CONST_STRING_JUMBO = 0x1b, OP_CONST_CLASS = 0x1c, OP_MONITOR_ENTER = 0x1d, OP_MONITOR_EXIT = 0x1e, OP_CHECK_CAST = 0x1f, OP_INSTANCE_OF = 0x20, OP_ARRAY_LENGTH = 0x21, OP_NEW_INSTANCE = 0x22, OP_NEW_ARRAY = 0x23, OP_FILLED_NEW_ARRAY = 0x24, OP_FILLED_NEW_ARRAY_RANGE = 0x25, OP_FILL_ARRAY_DATA = 0x26, OP_THROW = 0x27, OP_GOTO = 0x28, OP_GOTO_16 = 0x29, OP_GOTO_32 = 0x2a, OP_PACKED_SWITCH = 0x2b, OP_SPARSE_SWITCH = 0x2c, OP_CMPL_FLOAT = 0x2d, OP_CMPG_FLOAT = 0x2e, OP_CMPL_DOUBLE = 0x2f, OP_CMPG_DOUBLE = 0x30, OP_CMP_LONG = 0x31, OP_IF_EQ = 0x32, OP_IF_NE = 0x33, OP_IF_LT = 0x34, OP_IF_GE = 0x35, OP_IF_GT = 0x36, OP_IF_LE = 0x37, OP_IF_EQZ = 0x38, OP_IF_NEZ = 0x39, OP_IF_LTZ = 0x3a, OP_IF_GEZ = 0x3b, OP_IF_GTZ = 0x3c, OP_IF_LEZ = 0x3d, OP_UNUSED_3E = 0x3e, OP_UNUSED_3F = 0x3f, OP_UNUSED_40 = 0x40, OP_UNUSED_41 = 0x41, OP_UNUSED_42 = 0x42, OP_UNUSED_43 = 0x43, OP_AGET = 0x44, OP_AGET_WIDE = 0x45, OP_AGET_OBJECT = 0x46, OP_AGET_BOOLEAN = 0x47, OP_AGET_BYTE = 0x48, OP_AGET_CHAR = 0x49, OP_AGET_SHORT = 0x4a, OP_APUT = 0x4b, OP_APUT_WIDE = 0x4c, OP_APUT_OBJECT = 0x4d, OP_APUT_BOOLEAN = 0x4e, OP_APUT_BYTE = 0x4f, OP_APUT_CHAR = 0x50, OP_APUT_SHORT = 0x51, OP_IGET = 0x52, OP_IGET_WIDE = 0x53, OP_IGET_OBJECT = 0x54, OP_IGET_BOOLEAN = 0x55, OP_IGET_BYTE = 0x56, OP_IGET_CHAR = 0x57, OP_IGET_SHORT = 0x58, OP_IPUT = 0x59, OP_IPUT_WIDE = 0x5a, OP_IPUT_OBJECT = 0x5b, OP_IPUT_BOOLEAN = 0x5c, OP_IPUT_BYTE = 0x5d, OP_IPUT_CHAR = 0x5e, OP_IPUT_SHORT = 0x5f, OP_SGET = 0x60, OP_SGET_WIDE = 0x61, OP_SGET_OBJECT = 0x62, OP_SGET_BOOLEAN = 0x63, OP_SGET_BYTE = 0x64, OP_SGET_CHAR = 0x65, OP_SGET_SHORT = 0x66, OP_SPUT = 0x67, OP_SPUT_WIDE = 0x68, OP_SPUT_OBJECT = 0x69, OP_SPUT_BOOLEAN = 0x6a, OP_SPUT_BYTE = 0x6b, OP_SPUT_CHAR = 0x6c, OP_SPUT_SHORT = 0x6d, OP_INVOKE_VIRTUAL = 0x6e, OP_INVOKE_SUPER = 0x6f, OP_INVOKE_DIRECT = 0x70, OP_INVOKE_STATIC = 0x71, OP_INVOKE_INTERFACE = 0x72, OP_UNUSED_73 = 0x73, OP_INVOKE_VIRTUAL_RANGE = 0x74, OP_INVOKE_SUPER_RANGE = 0x75, OP_INVOKE_DIRECT_RANGE = 0x76, OP_INVOKE_STATIC_RANGE = 0x77, OP_INVOKE_INTERFACE_RANGE = 0x78, OP_UNUSED_79 = 0x79, OP_UNUSED_7A = 0x7a, OP_NEG_INT = 0x7b, OP_NOT_INT = 0x7c, OP_NEG_LONG = 0x7d, OP_NOT_LONG = 0x7e, OP_NEG_FLOAT = 0x7f, OP_NEG_DOUBLE = 0x80, OP_INT_TO_LONG = 0x81, OP_INT_TO_FLOAT = 0x82, OP_INT_TO_DOUBLE = 0x83, OP_LONG_TO_INT = 0x84, OP_LONG_TO_FLOAT = 0x85, OP_LONG_TO_DOUBLE = 0x86, OP_FLOAT_TO_INT = 0x87, OP_FLOAT_TO_LONG = 0x88, OP_FLOAT_TO_DOUBLE = 0x89, OP_DOUBLE_TO_INT = 0x8a, OP_DOUBLE_TO_LONG = 0x8b, OP_DOUBLE_TO_FLOAT = 0x8c, OP_INT_TO_BYTE = 0x8d, OP_INT_TO_CHAR = 0x8e, OP_INT_TO_SHORT = 0x8f, OP_ADD_INT = 0x90, OP_SUB_INT = 0x91, OP_MUL_INT = 0x92, OP_DIV_INT = 0x93, OP_REM_INT = 0x94, OP_AND_INT = 0x95, OP_OR_INT = 0x96, OP_XOR_INT = 0x97, OP_SHL_INT = 0x98, OP_SHR_INT = 0x99, OP_USHR_INT = 0x9a, OP_ADD_LONG = 0x9b, OP_SUB_LONG = 0x9c, OP_MUL_LONG = 0x9d, OP_DIV_LONG = 0x9e, OP_REM_LONG = 0x9f, OP_AND_LONG = 0xa0, OP_OR_LONG = 0xa1, OP_XOR_LONG = 0xa2, OP_SHL_LONG = 0xa3, OP_SHR_LONG = 0xa4, OP_USHR_LONG = 0xa5, OP_ADD_FLOAT = 0xa6, OP_SUB_FLOAT = 0xa7, OP_MUL_FLOAT = 0xa8, OP_DIV_FLOAT = 0xa9, OP_REM_FLOAT = 0xaa, OP_ADD_DOUBLE = 0xab, OP_SUB_DOUBLE = 0xac, OP_MUL_DOUBLE = 0xad, OP_DIV_DOUBLE = 0xae, OP_REM_DOUBLE = 0xaf, OP_ADD_INT_2ADDR = 0xb0, OP_SUB_INT_2ADDR = 0xb1, OP_MUL_INT_2ADDR = 0xb2, OP_DIV_INT_2ADDR = 0xb3, OP_REM_INT_2ADDR = 0xb4, OP_AND_INT_2ADDR = 0xb5, OP_OR_INT_2ADDR = 0xb6, OP_XOR_INT_2ADDR = 0xb7, OP_SHL_INT_2ADDR = 0xb8, OP_SHR_INT_2ADDR = 0xb9, OP_USHR_INT_2ADDR = 0xba, OP_ADD_LONG_2ADDR = 0xbb, OP_SUB_LONG_2ADDR = 0xbc, OP_MUL_LONG_2ADDR = 0xbd, OP_DIV_LONG_2ADDR = 0xbe, OP_REM_LONG_2ADDR = 0xbf, OP_AND_LONG_2ADDR = 0xc0, OP_OR_LONG_2ADDR = 0xc1, OP_XOR_LONG_2ADDR = 0xc2, OP_SHL_LONG_2ADDR = 0xc3, OP_SHR_LONG_2ADDR = 0xc4, OP_USHR_LONG_2ADDR = 0xc5, OP_ADD_FLOAT_2ADDR = 0xc6, OP_SUB_FLOAT_2ADDR = 0xc7, OP_MUL_FLOAT_2ADDR = 0xc8, OP_DIV_FLOAT_2ADDR = 0xc9, OP_REM_FLOAT_2ADDR = 0xca, OP_ADD_DOUBLE_2ADDR = 0xcb, OP_SUB_DOUBLE_2ADDR = 0xcc, OP_MUL_DOUBLE_2ADDR = 0xcd, OP_DIV_DOUBLE_2ADDR = 0xce, OP_REM_DOUBLE_2ADDR = 0xcf, OP_ADD_INT_LIT16 = 0xd0, OP_RSUB_INT = 0xd1, OP_MUL_INT_LIT16 = 0xd2, OP_DIV_INT_LIT16 = 0xd3, OP_REM_INT_LIT16 = 0xd4, OP_AND_INT_LIT16 = 0xd5, OP_OR_INT_LIT16 = 0xd6, OP_XOR_INT_LIT16 = 0xd7, OP_ADD_INT_LIT8 = 0xd8, OP_RSUB_INT_LIT8 = 0xd9, OP_MUL_INT_LIT8 = 0xda, OP_DIV_INT_LIT8 = 0xdb, OP_REM_INT_LIT8 = 0xdc, OP_AND_INT_LIT8 = 0xdd, OP_OR_INT_LIT8 = 0xde, OP_XOR_INT_LIT8 = 0xdf, OP_SHL_INT_LIT8 = 0xe0, OP_SHR_INT_LIT8 = 0xe1, OP_USHR_INT_LIT8 = 0xe2, OP_UNUSED_E3 = 0xe3, OP_UNUSED_E4 = 0xe4, OP_UNUSED_E5 = 0xe5, OP_UNUSED_E6 = 0xe6, OP_UNUSED_E7 = 0xe7, OP_UNUSED_E8 = 0xe8, OP_UNUSED_E9 = 0xe9, OP_UNUSED_EA = 0xea, OP_UNUSED_EB = 0xeb, OP_BREAKPOINT = 0xec, OP_THROW_VERIFICATION_ERROR = 0xed, OP_EXECUTE_INLINE = 0xee, OP_EXECUTE_INLINE_RANGE = 0xef, OP_INVOKE_DIRECT_EMPTY = 0xf0, OP_UNUSED_F1 = 0xf1, OP_IGET_QUICK = 0xf2, OP_IGET_WIDE_QUICK = 0xf3, OP_IGET_OBJECT_QUICK = 0xf4, OP_IPUT_QUICK = 0xf5, OP_IPUT_WIDE_QUICK = 0xf6, OP_IPUT_OBJECT_QUICK = 0xf7, OP_INVOKE_VIRTUAL_QUICK = 0xf8, OP_INVOKE_VIRTUAL_QUICK_RANGE = 0xf9, OP_INVOKE_SUPER_QUICK = 0xfa, OP_INVOKE_SUPER_QUICK_RANGE = 0xfb, OP_UNUSED_FC = 0xfc, OP_UNUSED_FD = 0xfd, OP_UNUSED_FE = 0xfe, OP_UNUSED_FF = 0xff } |
enum | DexPsuedoOpCode { PSUEDO_OP_NOP = 0x00, PSUEDO_OP_PACKED_SWITCH = 0x01, PSUEDO_OP_SPARSE_SWITCH = 0x02, PSUEDO_OP_FILL_DATA_ARRAY = 0x03 } |
enum | DexOpSpecialType { SPECIAL_NONE = 0x00, SPECIAL_CONSTANT = 0x01, SPECIAL_TARGET = 0x02, SPECIAL_STRING = 0x03, SPECIAL_TYPE = 0x04, SPECIAL_FIELD = 0x05, SPECIAL_METHOD = 0x06, SPECIAL_INLINE = 0x07, SPECIAL_OBJECT = 0x08, SPECIAL_VTABLE = 0x09 } |
enum | DexInstrFlag { DEX_INSTR_FLAG_CONTINUE = 1 << 0, DEX_INSTR_FLAG_THROW = 1 << 1, DEX_INSTR_FLAG_INVOKE = 1 << 2, DEX_INSTR_FLAG_RETURN = 1 << 3, DEX_INSTR_FLAG_SWITCH = 1 << 4, DEX_INSTR_FLAG_BRANCH = 1 << 5, DEX_INSTR_FLAG_WRITE_REG = 1 << 6, DEX_INSTR_FLAG_WIDE_R1 = 1 << 7, DEX_INSTR_FLAG_WIDE_R2 = 1 << 8, DEX_INSTR_FLAG_WIDE_R3 = 1 << 9 } |
Functions | |
dx_uint | dxc_insn_width (const DexInstruction *insn) |
dx_ubyte | dxc_num_registers (const DexInstruction *insn) |
dx_int | dxc_set_num_registers (DexInstruction *insn, dx_ubyte regs) |
dx_int | dxc_register_width (const DexInstruction *insn, dx_uint index) |
dx_int | dxc_get_register (const DexInstruction *insn, dx_uint index) |
dx_int | dxc_set_register (DexInstruction *insn, dx_uint index, dx_ushort reg) |
Sets the index'th register used by this instruction. Returns the value of the previous register at this index. Returns -1 on error. Will result in an error if called with non-zero index on a range instruction. | |
void | dxc_free_instruction (DexInstruction *insn) |
Frees all data associated with this instruction. Does not attempt to free the passed pointer. | |
Variables | |
const DexOpFormat | dex_opcode_formats [256] |
Gives the opcode formats for each opcode. |
enum DexOpCode |
The dalvik opcodes. Opcodes index right into the dex_opcode_formats array to get formatting information for the given opcode.
Opcode list comes from libdex/OpCode.h
enum DexOpSpecialType |
Some opcodes carry special information embedded into the operation. When adding instructions to existing bytecode be mindful of instructions carrying a relative target.
There are no dalvik opcodes that carry more than one type of special information.
SPECIAL_NONE |
The opcode carries no special information. |
SPECIAL_CONSTANT |
The opcode carries a signed numeric constant. You can access/modify the constant information through DexInstruction .special.constant. |
SPECIAL_TARGET |
The opcode carries a relative offset into the bytecode. This could point to a table or it could be a branch offset. Also note that PACKED_SWITCH and SPARSE_SWITCH tables contain branch offsets relative to the invoking instruction as well. You can access/modify the target value through DexInstruction .special.target. |
SPECIAL_STRING |
The opcode carries string information. You can access/modify the string information through DexInstruction .special.str. |
SPECIAL_TYPE |
The opcode carries type information. You can access/modify the string information through DexInstruction .special.type. |
SPECIAL_FIELD |
The opcode carries field information. You can access/modify the string information through DexInstruction .special.field. |
SPECIAL_METHOD |
The opcode carries method information. You can access/modify the string information through DexInstruction .special.method. |
SPECIAL_INLINE |
The opcode carries an inline method index. This should only be found in optimized dex files. You can access/modify the inline index through DexInstruction .special.inline_ind. |
SPECIAL_OBJECT |
The opcode carries an object offset. This should only be found in optimized dex files. You can access/modify this offset through DexInstruction .special.object_off. |
SPECIAL_VTABLE |
The opcode carries a virtual table index. This should only be found in optimized dex files. You can access/modify this offset through DexInstruction .special.vtable_ind. |
enum DexPsuedoOpCode |
These are psuedo opcodes to be observed when the opcode is OPCODE_PSUEDO. In general a psuedo opcode of PSUEDO_OP_NOP should be treated as a normal opcode.
const DexOpFormat dex_opcode_formats[256] |
Gives the opcode formats for each opcode.
If you plan on modifying bytecode you probably will make use of this array. It includes formatting information for each byte code. Index into this array with the opcode value of the instruction in question.