From 1f88db75f5106eaaef7e0711c226467bbdc9fbb1 Mon Sep 17 00:00:00 2001 From: Marco Thomas Date: Wed, 14 May 2025 13:41:08 +0900 Subject: [PATCH] ft: partially implement Group 5 instructions --- src/disasm.rs | 15 ++++++++++++++- src/instructions.rs | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/disasm.rs b/src/disasm.rs index 1b3b489..9a53fe6 100644 --- a/src/disasm.rs +++ b/src/disasm.rs @@ -613,7 +613,20 @@ impl Disassembler { _ => panic!("Illegal Group 4 mnemonic"), } } - 0xFF => todo!("Group 5"), + 0xFF => { + let (target, reg) = self.parse_modrm_byte(Operand::Word(0)); + match reg { + 0b000 => Mnemonic::INC_Mod(target), + 0b001 => Mnemonic::DEC_Mod(target), + 0b010 => Mnemonic::CALL_Mod(target), + 0b011 => todo!("Implement CALL Mp"), + 0b100 => Mnemonic::JMP_Mod(target), + 0b101 => todo!("Implement JMP Mp"), + 0b110 => Mnemonic::PUSH_Mod(target), + // 0b111 => unused + _ => panic!("Illegal Group 5 mnemonic"), + } + } _ => { eprintln!("Encountered unknown instruction '0x{:x}'", opcode); diff --git a/src/instructions.rs b/src/instructions.rs index 41f6e0f..26e7d83 100644 --- a/src/instructions.rs +++ b/src/instructions.rs @@ -77,6 +77,7 @@ pub enum Mnemonic { // PUSH PUSH_R(Register), PUSH_S(SegmentRegister), + PUSH_Mod(ModRmTarget), // POP POP_S(SegmentRegister), // POP to Segment Register POP_R(Register), // POP to Register @@ -203,10 +204,12 @@ pub enum Mnemonic { // CALL CALL_p(Pointer), CALL_v(Word), + CALL_Mod(ModRmTarget), // JUMP JMP_p(Pointer), JMP_b(Byte), JMP_v(Word), + JMP_Mod(ModRmTarget), // WAIT WAIT, // Push/Pop Flags