#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); }