blob: 83645ecca38d4a1c50676b54fbf3abd33244aa95 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
static void P(dis_onebyte)(tdis_ctx ctx) {
uint8_t *ptr = ctx->ptr;
uint8_t byte1 = *ptr++;
uint8_t bits = onebyte_bits[byte1];
uint8_t byte2 = 0;
if (byte1 == 0x0f) {
byte2 = *ptr++;
bits = _0f_bits[byte2];
if (byte2 == 0x39) {
XXX
} else if (byte2 == 0x3b) {
XXX
}
} else if ((byte1 & 0xd8) == 0xd8) {
*ptr++;
bits = I_MODA;
}
// get modrm
int mod, rm, mrlow;
if (bits & I_MOD) {
uint8_t modrm = *ptr++;
mod = modrm >> 6;
rm = modrm >> 3 & 7;
mrlow = modrm & 7;
if (rm == 4) {
/* sib */
ptr++;
}
}
if (bits & I_PFX) {
// this could affect opcode size etc... then we restart
}
};
static void P(dis_x86)(tdis_ctx ctx) {
void *orig = ctx->ptr;
P(dis_onebyte)(ctx);
ctx->op_size = ctx->ptr - orig;
}
|