diff --git a/DevTools/UserspaceEmulator/SoftCPU.cpp b/DevTools/UserspaceEmulator/SoftCPU.cpp index 59488b5008..e52c711b9e 100644 --- a/DevTools/UserspaceEmulator/SoftCPU.cpp +++ b/DevTools/UserspaceEmulator/SoftCPU.cpp @@ -625,8 +625,17 @@ void SoftCPU::LDS_reg16_mem16(const X86::Instruction&) { TODO(); } void SoftCPU::LDS_reg32_mem32(const X86::Instruction&) { TODO(); } void SoftCPU::LEAVE16(const X86::Instruction&) { TODO(); } void SoftCPU::LEAVE32(const X86::Instruction&) { TODO(); } -void SoftCPU::LEA_reg16_mem16(const X86::Instruction&) { TODO(); } -void SoftCPU::LEA_reg32_mem32(const X86::Instruction&) { TODO(); } + +void SoftCPU::LEA_reg16_mem16(const X86::Instruction& insn) +{ + gpr16(insn.reg16()) = insn.modrm().resolve(*this, insn.segment_prefix()).offset(); +} + +void SoftCPU::LEA_reg32_mem32(const X86::Instruction& insn) +{ + gpr32(insn.reg32()) = insn.modrm().resolve(*this, insn.segment_prefix()).offset(); +} + void SoftCPU::LES_reg16_mem16(const X86::Instruction&) { TODO(); } void SoftCPU::LES_reg32_mem32(const X86::Instruction&) { TODO(); } void SoftCPU::LFS_reg16_mem16(const X86::Instruction&) { TODO(); } diff --git a/Libraries/LibX86/Instruction.h b/Libraries/LibX86/Instruction.h index 17208a829b..7a7a47eff5 100644 --- a/Libraries/LibX86/Instruction.h +++ b/Libraries/LibX86/Instruction.h @@ -218,6 +218,14 @@ public: template u32 read32(CPU&, const Instruction&); + template + LogicalAddress resolve(const CPU& cpu, Optional segment_prefix) + { + if (m_a32) + return resolve32(cpu, segment_prefix); + return resolve16(cpu, segment_prefix); + } + private: MemoryOrRegisterReference() { } @@ -234,14 +242,6 @@ private: template LogicalAddress resolve32(const CPU&, Optional); - template - LogicalAddress resolve(const CPU& cpu, Optional segment_prefix) - { - if (m_a32) - return resolve32(cpu, segment_prefix); - return resolve16(cpu, segment_prefix); - } - template u32 evaluate_sib(const CPU&, SegmentRegister& default_segment) const;