aboutsummaryrefslogtreecommitdiff
path: root/lib/x86/dis-x86.inc.h
diff options
context:
space:
mode:
authorcomex2015-02-05 02:51:05 -0500
committercomex2015-02-05 02:51:05 -0500
commite4fd3d6e254984dad5077468256657239fd32b48 (patch)
treee238a59a2db809470a84ac3d86d98e187ec6af57 /lib/x86/dis-x86.inc.h
parentstarting dis-tables.h (diff)
downloadsubstitute-e4fd3d6e254984dad5077468256657239fd32b48.tar.gz
right, going to bed
Diffstat (limited to '')
-rw-r--r--lib/x86/dis-x86.inc.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/x86/dis-x86.inc.h b/lib/x86/dis-x86.inc.h
new file mode 100644
index 0000000..83645ec
--- /dev/null
+++ b/lib/x86/dis-x86.inc.h
@@ -0,0 +1,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;
+}