diff --git a/src/ExecutorCases.cpp b/src/ExecutorCases.cpp index 1338584..1e06b54 100644 --- a/src/ExecutorCases.cpp +++ b/src/ExecutorCases.cpp @@ -52,6 +52,15 @@ namespace executor_cases { cc.m_Bus->WriteX(dstAddress, result); break; } + case x86::ModRMState::DISP32: + { + uint32_t dstAddress = cc.m_Instruction.m_Operand1; + uint32_t dstPrevValue = cc.m_Bus->AccessX(dstAddress); + uint32_t currRegValue = cc.m_Registers[modrm.m_Reg]; + uint32_t result = dstPrevValue + currRegValue; + cc.m_Bus->WriteX(dstAddress, result); + break; + } default: { throw std::runtime_error("Invalid ModRM State encountered during Add_rm32_r32"); diff --git a/src/Instruction.cpp b/src/Instruction.cpp index 0dd8ee4..ff7a7e7 100644 --- a/src/Instruction.cpp +++ b/src/Instruction.cpp @@ -31,7 +31,7 @@ namespace x86 { switch(mod) { case 0b00000000: state = ModRMState::LR; - if(reg == 0b00000101) + if(rm == 0b00000101) state = ModRMState::DISP32; break; case 0b01000000: diff --git a/src/main.cpp b/src/main.cpp index 90d8341..5d52a7a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,7 @@ uint8_t test[] = { 0xB8, 0xF4, 0x00, 0x00, 0x00, 0xB9, 0x00, 0x80, 0x00, 0x00, - 0x01, 0x81, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x05, 0x10, 0x80, 0x00, 0x00, 0x00, };