#[macro_export] /// Generate a Mnemonic for an 8-bit Register from a ModRM byte. macro_rules! modrmb { ($self:ident, $variant:ident) => {{ let (target, reg) = $self.parse_modrm_byte(Operand::Byte(0)); Mnemonic::$variant(target, Register::by_id(Operand::Byte(reg))) }}; } #[macro_export] /// Generate a Mnemonic for a 16-bit Register from a ModRM byte. macro_rules! modrmv { ($self:ident, $variant:ident) => {{ let (target, reg) = $self.parse_modrm_byte(Operand::Word(0)); Mnemonic::$variant(target, Register::by_id(Operand::Word(reg.into()))) }}; } #[macro_export] /// Generate a Mnemonic for a 16-bit Segment Register from a ModRM byte. macro_rules! modrms { ($self:ident, $variant:ident) => {{ let (target, reg) = $self.parse_modrm_byte(Operand::Word(0)); Mnemonic::$variant(target, SegmentRegister::by_id(reg)) }}; } #[macro_export] /// Generate the resulting Mnemonic from a GPR instruction with Byte-sized /// Immediate, encoded in a ModRM byte. /// GPR always has an imm value as second operand. macro_rules! modrmgpr1b { ($self:ident) => {{ let (target, reg) = $self.parse_modrm_byte(Operand::Byte(0)); let imm = $self.parse_byte(); Self::modrm_reg_to_mnemonic(reg, target, Operand::Byte(imm)) }}; } #[macro_export] /// Generate the resulting Mnemonic from a GPR instruction with Word-sized /// Immediate, encoded in a ModRM byte. /// GPR always has an imm value as second operand. macro_rules! modrmgpr1v { ($self:ident) => {{ let (target, reg) = $self.parse_modrm_byte(Operand::Word(0)); let imm = $self.parse_word(); Self::modrm_reg_to_mnemonic(reg, target, Operand::Word(imm)) }}; }