00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __JAVADIS_H__
00022 #define __JAVADIS_H__
00023
00024 #include "asm.h"
00025 #include "javaopc.h"
00026
00027
00028
00029
00030
00031
00032
00033 #define JAVAINSN_MAX_PARAM_COUNT 2
00034
00035 struct javadis_insn {
00036 bool invalid;
00037 byte size;
00038 int opcode;
00039 bool wideopcode;
00040 char *name;
00041 java_insn_op op[JAVAINSN_MAX_PARAM_COUNT];
00042 };
00043
00044
00045
00046
00047
00048 typedef int (*java_token_func)(char *result, int maxlen, dword token, void *context);
00049
00050 class javadis: public Disassembler {
00051 protected:
00052 javadis_insn insn;
00053 char insnstr[1024];
00054
00055 unsigned char *codep, *ocodep;
00056 int addr;
00057 int maxlen;
00058 java_token_func token_func;
00059 void *context;
00060
00061 void decode_insn(javaopc_insn *insn);
00062 void decode_op(int optype, bool wideopc, java_insn_op *op);
00063 byte getbyte();
00064 word getword();
00065 dword getdword();
00066 void invalidate();
00067 void str_format(char **str, char **format, char *p, char *n, char *op[3], int oplen[3], char stopchar, int print);
00068 virtual void str_op(char *opstr, int *opstrlen, javadis_insn *insn, java_insn_op *op);
00069 public:
00070 javadis();
00071 javadis(java_token_func token_func, void *context);
00072 virtual ~javadis();
00073
00074
00075 virtual dis_insn *decode(byte *code, int maxlen, CPU_ADDR addr);
00076 virtual dis_insn *duplicateInsn(dis_insn *disasm_insn);
00077 virtual void getOpcodeMetrics(int &min_length, int &max_length, int &min_look_ahead, int &avg_look_ahead, int &addr_align);
00078 virtual char *getName();
00079 virtual byte getSize(dis_insn *disasm_insn);
00080 int load(ht_object_stream *f);
00081 virtual OBJECT_ID object_id() const;
00082 virtual char *str(dis_insn *disasm_insn, int options);
00083 virtual char *strf(dis_insn *disasm_insn, int options, char *format);
00084 virtual void store(ht_object_stream *f);
00085 virtual bool validInsn(dis_insn *disasm_insn);
00086 };
00087
00088 #endif
00089