diff --git a/src/disasm.rs b/src/disasm.rs index e58fe0c..ddce5e1 100644 --- a/src/disasm.rs +++ b/src/disasm.rs @@ -7,7 +7,7 @@ use crate::{ Args, instructions::{ImmediateByte, ImmediateWord, Instruction, Mnemonic, Register}, }; -use crate::{modrmb, modrms, modrmv}; +use crate::{modrmb, modrmgprb, modrmgprv, modrms, modrmv}; #[derive(Debug)] /// Generic errors, which are encountered during parsing. @@ -385,18 +385,9 @@ impl Disassembler { 0x7E => Mnemonic::JLE(ImmediateByte(self.parse_byte())), 0x7F => Mnemonic::JG(ImmediateByte(self.parse_byte())), - // 0x80..=0x83 => panic!("GRP1 not implemented"), - 0x80 => { - let (target, reg) = self.parse_modrm_byte(OperandWidth::Byte(0)); - let imm = self.parse_byte(); - Self::modrm_reg_to_mnemonic(reg, target, OperandWidth::Byte(imm)) - } - 0x81 => { - let (target, reg) = self.parse_modrm_byte(OperandWidth::Word(0)); - let imm = self.parse_word(); - Self::modrm_reg_to_mnemonic(reg, target, OperandWidth::Word(imm)) - } - 0x82 => panic!("Same as 0x80"), + 0x80 => modrmgprb!(self), + 0x81 => modrmgprv!(self), + 0x82 => modrmgprb!(self), // same as 0x80 0x83 => panic!("Sign extented GPR1 not yet implemented"), 0x84 => modrmb!(self, TEST), diff --git a/src/disasm_macros.rs b/src/disasm_macros.rs index 378de21..a5998ac 100644 --- a/src/disasm_macros.rs +++ b/src/disasm_macros.rs @@ -24,3 +24,23 @@ macro_rules! modrms { Mnemonic::$variant(target, SegmentRegister::by_id(reg)) }}; } + +#[macro_export] +/// Generate a GPR instruction from modrm byte for byte +macro_rules! modrmgprb { + ($self:ident) => {{ + let (target, reg) = $self.parse_modrm_byte(OperandWidth::Byte(0)); + let imm = $self.parse_byte(); + Self::modrm_reg_to_mnemonic(reg, target, OperandWidth::Byte(imm)) + }}; +} + +#[macro_export] +/// Generate a GPR instruction from modrm byte for word +macro_rules! modrmgprv { + ($self:ident) => {{ + let (target, reg) = $self.parse_modrm_byte(OperandWidth::Word(0)); + let imm = $self.parse_byte(); + Self::modrm_reg_to_mnemonic(reg, target, OperandWidth::Word(imm.into())) + }}; +}