summaryrefslogtreecommitdiff
path: root/src/Instruction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Instruction.cpp')
-rw-r--r--src/Instruction.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/Instruction.cpp b/src/Instruction.cpp
new file mode 100644
index 0000000..c74139b
--- /dev/null
+++ b/src/Instruction.cpp
@@ -0,0 +1,49 @@
+#include "Instruction.h"
+
+#include "Exceptions.h"
+
+namespace x86 {
+ std::string Register2Str(x86::Register reg) {
+ switch(reg){
+ case x86::Register::EAX: return "EAX";
+ case x86::Register::ECX: return "ECX";
+ case x86::Register::EDX: return "EDX";
+ case x86::Register::EBX: return "EBX";
+ case x86::Register::ESP: return "ESP";
+ case x86::Register::EBP: return "EBP";
+ case x86::Register::ESI: return "ESI";
+ case x86::Register::EDI: return "EDI";
+ }
+ throw std::runtime_error("Register not found!");
+ }
+
+ SIB ProcessSIB(uint8_t sib) {
+ uint8_t scale_mask = 0b11000000;
+ uint8_t index_mask = 0b00111000;
+ uint8_t base_mask = 0b00000111;
+
+ uint8_t scale = (sib & scale_mask) >> 6;
+ uint8_t index = (sib & index_mask) >> 3;
+ uint8_t base = sib & base_mask;
+
+ if(index == 4) index = x86::Register::SIB_NONE;
+ if(base == 4) base = x86::Register::SIB_DISP;
+
+ return {.m_Scale = scale, .m_Index = (x86::Register)index, .m_Base = (x86::Register)base};
+ }
+}
+
+std::string Opcode2Str(Opcode op) {
+ switch(op) {
+ case Opcode::INVALID: return "INVALID";
+ case Opcode::ADD_RM32_R32: return "ADD_RM32_R32";
+ case Opcode::ADD_R32_RM32: return "ADD_R32_RM32";
+ case Opcode::MOV_R32_IMM32 ... 0xBF: return "MOV_R32_IMM32";
+ case Opcode::MOV_RM32_R32: return "MOV_RM32_R32";
+ case Opcode::NOP: return "NOP";
+ case Opcode::HLT: return "HLT";
+ }
+
+ std::string what = "Opcode2Str could not find '" + std::to_string(op) + "'!";
+ throw CPUException(what);
+}