aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2020-02-11 00:22:16 -0800
committeriximeow <me@iximeow.net>2020-02-11 00:22:16 -0800
commitbd9ae00ba84275c9414298d016da21e8106cda36 (patch)
treea671e957288f00459664beaf1b9e13088daafc52
parentf08c8bbf9f180283490fc7a4e116e8fa0ffcc681 (diff)
add `RegSpec::name` to get `&'static str` labels for registers
-rw-r--r--src/long_mode/display.rs101
-rw-r--r--src/long_mode/mod.rs4
-rw-r--r--test/regspec.rs22
-rw-r--r--test/test.rs2
4 files changed, 80 insertions, 49 deletions
diff --git a/src/long_mode/display.rs b/src/long_mode/display.rs
index ff51613..899391d 100644
--- a/src/long_mode/display.rs
+++ b/src/long_mode/display.rs
@@ -115,57 +115,60 @@ impl fmt::Display for Segment {
}
}
+pub(crate) fn regspec_label(spec: &RegSpec) -> &'static str {
+ match spec.bank {
+ RegisterBank::Q => {
+ ["rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"][spec.num as usize]
+ },
+ RegisterBank::D => {
+ ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"][spec.num as usize]
+ },
+ RegisterBank::W => {
+ ["ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"][spec.num as usize]
+ },
+ RegisterBank::B => {
+ ["al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"][spec.num as usize]
+ },
+ RegisterBank::rB => {
+ ["al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"][spec.num as usize]
+ },
+ RegisterBank::EIP => { "eip" },
+ RegisterBank::RIP => { "rip" },
+ RegisterBank::EFlags => { "eflags" },
+ RegisterBank::RFlags => { "rflags" },
+ RegisterBank::CR => {
+ ["cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15"][spec.num as usize]
+ }
+ RegisterBank::DR => {
+ ["dr0", "dr1", "dr2", "dr3", "dr4", "dr5", "dr6", "dr7", "dr8", "dr9", "dr10", "dr11", "dr12", "dr13", "dr14", "dr15"][spec.num as usize]
+ }
+ RegisterBank::X => {
+ ["xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"][spec.num as usize]
+ },
+ RegisterBank::Y => {
+ ["ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15"][spec.num as usize]
+ },
+ RegisterBank::Z => {
+ ["zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7", "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15", "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23", "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31"][spec.num as usize]
+ },
+ RegisterBank::ST => {
+ ["st(0)", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)"][spec.num as usize]
+ },
+ RegisterBank::MM => {
+ ["mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7"][spec.num as usize]
+ }
+ RegisterBank::S => {
+ ["cs", "ds", "es", "fs", "gs", "ss"][spec.num as usize]
+ }
+ RegisterBank::K => {
+ ["k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"][spec.num as usize]
+ }
+ }
+}
+
impl fmt::Display for RegSpec {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let name = match self.bank {
- RegisterBank::Q => {
- ["rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"][self.num as usize]
- },
- RegisterBank::D => {
- ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"][self.num as usize]
- },
- RegisterBank::W => {
- ["ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"][self.num as usize]
- },
- RegisterBank::B => {
- ["al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"][self.num as usize]
- },
- RegisterBank::rB => {
- ["al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"][self.num as usize]
- },
- RegisterBank::EIP => { "eip" },
- RegisterBank::RIP => { "rip" },
- RegisterBank::EFlags => { "eflags" },
- RegisterBank::RFlags => { "rflags" },
- RegisterBank::CR => {
- ["cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15"][self.num as usize]
- }
- RegisterBank::DR => {
- ["dr0", "dr1", "dr2", "dr3", "dr4", "dr5", "dr6", "dr7", "dr8", "dr9", "dr10", "dr11", "dr12", "dr13", "dr14", "dr15"][self.num as usize]
- }
- RegisterBank::X => {
- ["xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"][self.num as usize]
- },
- RegisterBank::Y => {
- ["ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15"][self.num as usize]
- },
- RegisterBank::Z => {
- ["zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7", "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15", "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23", "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31"][self.num as usize]
- },
- RegisterBank::ST => {
- ["st(0)", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)"][self.num as usize]
- },
- RegisterBank::MM => {
- ["mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7"][self.num as usize]
- }
- RegisterBank::S => {
- ["cs", "ds", "es", "fs", "gs", "ss"][self.num as usize]
- }
- RegisterBank::K => {
- ["k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"][self.num as usize]
- }
- };
- write!(f, "{}", name)
+ write!(f, "{}", regspec_label(self))
}
}
diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs
index 099cc47..8aa164d 100644
--- a/src/long_mode/mod.rs
+++ b/src/long_mode/mod.rs
@@ -59,6 +59,10 @@ pub enum ConditionCode {
#[allow(non_snake_case)]
impl RegSpec {
+ pub fn name(&self) -> &'static str {
+ display::regspec_label(self)
+ }
+
#[inline]
fn from_parts(num: u8, extended: bool, bank: RegisterBank) -> RegSpec {
RegSpec {
diff --git a/test/regspec.rs b/test/regspec.rs
new file mode 100644
index 0000000..914c376
--- /dev/null
+++ b/test/regspec.rs
@@ -0,0 +1,22 @@
+use yaxpeax_x86::long_mode::RegSpec;
+use std::collections::{BTreeMap, HashMap};
+
+#[test]
+fn test_ord() {
+ let _: BTreeMap<RegSpec, u64> = BTreeMap::new();
+}
+
+#[test]
+fn test_hash() {
+ let _: HashMap<RegSpec, u64> = HashMap::new();
+}
+
+#[test]
+fn test_labels() {
+ assert_eq!(RegSpec::rip().name(), "rip");
+ assert_eq!(RegSpec::eip().name(), "eip");
+ assert_eq!(RegSpec::rflags().name(), "rflags");
+ assert_eq!(RegSpec::rbp().name(), "rbp");
+ assert_eq!(RegSpec::gs().name(), "gs");
+ assert_eq!(RegSpec::al().name(), "al");
+}
diff --git a/test/test.rs b/test/test.rs
index 5ba8bd9..6bc8972 100644
--- a/test/test.rs
+++ b/test/test.rs
@@ -1,6 +1,8 @@
extern crate yaxpeax_arch;
extern crate yaxpeax_x86;
+mod regspec;
+
use std::fmt::Write;
use yaxpeax_arch::{Decoder, LengthedInstruction};