#[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(ImmediateOperand::Byte(0)); Mnemonic::$variant(target, Register::by_id(ImmediateOperand::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(ImmediateOperand::Word(0)); Mnemonic::$variant(target, Register::by_id(ImmediateOperand::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(ImmediateOperand::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! modrmgprb { ($self:ident) => {{ let (target, reg) = $self.parse_modrm_byte(ImmediateOperand::Byte(0)); let imm = $self.parse_byte(); Self::modrm_reg_to_mnemonic(reg, target, ImmediateOperand::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! modrmgprv { ($self:ident) => {{ let (target, reg) = $self.parse_modrm_byte(ImmediateOperand::Word(0)); let imm = $self.parse_word(); Self::modrm_reg_to_mnemonic(reg, target, ImmediateOperand::Word(imm)) }}; }