diff options
| author | 0x221E <0x221E@0xinfinity.dev> | 2026-04-12 16:59:40 +0200 |
|---|---|---|
| committer | 0x221E <0x221E@0xinfinity.dev> | 2026-04-12 16:59:40 +0200 |
| commit | a66c7433c2c11b8b6c99142277ed4e16b1a2a465 (patch) | |
| tree | e54bcfb59c303acf6118fd11f06d5c0bd5f24e5d /src/Instruction.cpp | |
Diffstat (limited to 'src/Instruction.cpp')
| -rw-r--r-- | src/Instruction.cpp | 49 |
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); +} |
