Patch: Fix DISP32 for ADD_RM32_R32
This commit is contained in:
@@ -52,6 +52,15 @@ namespace executor_cases {
|
|||||||
cc.m_Bus->WriteX<uint32_t>(dstAddress, result);
|
cc.m_Bus->WriteX<uint32_t>(dstAddress, result);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case x86::ModRMState::DISP32:
|
||||||
|
{
|
||||||
|
uint32_t dstAddress = cc.m_Instruction.m_Operand1;
|
||||||
|
uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(dstAddress);
|
||||||
|
uint32_t currRegValue = cc.m_Registers[modrm.m_Reg];
|
||||||
|
uint32_t result = dstPrevValue + currRegValue;
|
||||||
|
cc.m_Bus->WriteX<uint32_t>(dstAddress, result);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Invalid ModRM State encountered during Add_rm32_r32");
|
throw std::runtime_error("Invalid ModRM State encountered during Add_rm32_r32");
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace x86 {
|
|||||||
switch(mod) {
|
switch(mod) {
|
||||||
case 0b00000000:
|
case 0b00000000:
|
||||||
state = ModRMState::LR;
|
state = ModRMState::LR;
|
||||||
if(reg == 0b00000101)
|
if(rm == 0b00000101)
|
||||||
state = ModRMState::DISP32;
|
state = ModRMState::DISP32;
|
||||||
break;
|
break;
|
||||||
case 0b01000000:
|
case 0b01000000:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
uint8_t test[] = {
|
uint8_t test[] = {
|
||||||
0xB8, 0xF4, 0x00, 0x00, 0x00,
|
0xB8, 0xF4, 0x00, 0x00, 0x00,
|
||||||
0xB9, 0x00, 0x80, 0x00, 0x00,
|
0xB9, 0x00, 0x80, 0x00, 0x00,
|
||||||
0x01, 0x81, 0x10, 0x00, 0x00, 0x00,
|
0x01, 0x05, 0x10, 0x80, 0x00, 0x00,
|
||||||
0x00,
|
0x00,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user