51 lines
1.8 KiB
Rust
51 lines
1.8 KiB
Rust
#[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))
|
|
}};
|
|
}
|