From 81e9b93aab9217cf7cb508f64b19fc1c0df024b5 Mon Sep 17 00:00:00 2001
From: iximeow <me@iximeow.net>
Date: Thu, 19 Nov 2020 18:13:24 -0800
Subject: fix decoding of rex-prefixed modrm+sib operands selecting index 0b100
 and base 0b101

for memory operands with a base, index, and displacement either
the wrong base would be selected (register number ignored, so only
`*ax` or `r8*` would be reported), or yaxpeax-x86 would report a
base register is present when it is not (`RegIndexBaseScaleDisp`
when the operand is actually `RegScaleDisp`)

thank you to Evan Johnson for catching and reporting this bug!

also bump crate version to 0.1.4 as this will be immediately tagged and
released.
---
 test/long_mode/mod.rs | 11 +++++++++++
 1 file changed, 11 insertions(+)

(limited to 'test/long_mode')

diff --git a/test/long_mode/mod.rs b/test/long_mode/mod.rs
index 3b31dbb..8489822 100644
--- a/test/long_mode/mod.rs
+++ b/test/long_mode/mod.rs
@@ -109,6 +109,17 @@ fn test_modrm_decode() {
     test_display(&[0x41, 0x33, 0x84, 0xa5, 0x11, 0x22, 0x33, 0x44], "xor eax, [r13 + 0x44332211]");
     test_display(&[0x33, 0x04, 0xe5, 0x11, 0x22, 0x33, 0x44], "xor eax, [0x44332211]");
     test_display(&[0x41, 0x33, 0x04, 0xe5, 0x11, 0x22, 0x33, 0x44], "xor eax, [0x44332211]");
+
+    // specifically sib with base == 0b101
+    // mod bits 00
+    test_display(&[0x42, 0x33, 0x34, 0x25, 0x20, 0x30, 0x40, 0x50], "xor esi, [r12 * 1 + 0x50403020]");
+    test_display(&[0x43, 0x33, 0x34, 0x25, 0x20, 0x30, 0x40, 0x50], "xor esi, [r12 * 1 + 0x50403020]");
+    // mod bits 01
+    test_display(&[0x42, 0x33, 0x74, 0x25, 0x20], "xor esi, [rbp + r12 * 1 + 0x20]");
+    test_display(&[0x43, 0x33, 0x74, 0x25, 0x20], "xor esi, [r13 + r12 * 1 + 0x20]");
+    // mod bits 10
+    test_display(&[0x42, 0x33, 0xb4, 0x25, 0x20, 0x30, 0x40, 0x50], "xor esi, [rbp + r12 * 1 + 0x50403020]");
+    test_display(&[0x43, 0x33, 0xb4, 0x25, 0x20, 0x30, 0x40, 0x50], "xor esi, [r13 + r12 * 1 + 0x50403020]");
 }
 
 #[test]
-- 
cgit v1.1