28 unsigned int length_disasm(
void *opcode0,
char mode) {
29 unsigned char *opcode = opcode0;
31 unsigned int flag = 0;
32 unsigned int ddef = 4, mdef = 4;
33 unsigned int msize = 0, dsize = 0;
35 unsigned char first_op, op, modrm, mod, rm, rex = 0;
36 unsigned char multibyte = 0;
38 _rip_relative =
false;
44 if (CHECK_PREFIX(op)) {
45 if (CHECK_PREFIX_66(op)) ddef = 2;
46 else if (CHECK_PREFIX_67(op)) mdef = 2;
53 if (mode == MODE_X64 && CHECK_REX(op)) {
68 if(CHECK_MODRM38(op)) flag++;
74 if(CHECK_MODRM3A(op)) flag++;
79 if (CHECK_MODRM2(op)) flag++;
80 if (CHECK_DATA12(op)) dsize++;
81 if (CHECK_DATA662(op)) dsize += ddef;
87 if (CHECK_MODRM(op)) flag++;
88 if (CHECK_TEST(op) && !(*opcode & 0x38)) dsize += (op & 1) ? ddef : 1;
89 if (CHECK_DATA1(op)) dsize++;
90 if (CHECK_DATA2(op)) dsize += 2;
91 if (CHECK_DATA66(op)) dsize += ddef;
92 if (CHECK_MEM67(op)) msize += mdef;
102 if (mod == 0x40) msize++;
103 if (mod == 0x80) msize += mdef;
104 if (mdef == 2 && mode == MODE_X32) {
105 if ((mod == 0x00) && (rm == 0x06)) msize += 2;
108 rm = *opcode++ & 0x07;
110 if (rm == 0x05 && mod == 0x00) {
111 if(mdef == 2) msize += 2;
115 if(mode == MODE_X64 && first_op != 0xff && mod == 0x00 && rm == 0x05) {
116 _rip_relative =
true;
128 if (CHECK_REXW(rex) && !multibyte) {
129 if(CHECK_IMM64(op)) dsize = 8;
130 if(CHECK_OFF64(op)) msize = 8;
133 opcode += msize + dsize;
135 return opcode - (
unsigned char *)opcode0;