chore: Rename Operand -> ImmediateOperand
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
use crate::aout::Aout;
|
||||
use crate::operands::{
|
||||
Byte, DWord, Displacement, IByte, IWord, MemoryIndex, ModRmTarget, Operand, Pointer16,
|
||||
Byte, DWord, Displacement, IByte, IWord, ImmediateOperand, MemoryIndex, ModRmTarget, Pointer16,
|
||||
Pointer32, Word,
|
||||
};
|
||||
use crate::register::{Register, RegisterId, SegmentRegister};
|
||||
@@ -238,7 +238,7 @@ impl Disassembler {
|
||||
/// or even mnemonic in the group-type instructions.
|
||||
fn parse_modrm_byte(
|
||||
&mut self,
|
||||
register_width: Operand,
|
||||
register_width: ImmediateOperand,
|
||||
) -> Result<(ModRmTarget, RegisterId), DisasmError> {
|
||||
let modrm = self.parse_byte()?;
|
||||
|
||||
@@ -291,9 +291,11 @@ impl Disassembler {
|
||||
"ModRM selected Register to Register: ({rm:#b}) to/from RegID ({reg:#b})"
|
||||
);
|
||||
let target = match register_width {
|
||||
Operand::Byte(_) => ModRmTarget::Register(Register::by_id(Operand::Byte(rm))?),
|
||||
Operand::Word(_) => {
|
||||
ModRmTarget::Register(Register::by_id(Operand::Word(rm as Word))?)
|
||||
ImmediateOperand::Byte(_) => {
|
||||
ModRmTarget::Register(Register::by_id(ImmediateOperand::Byte(rm))?)
|
||||
}
|
||||
ImmediateOperand::Word(_) => {
|
||||
ModRmTarget::Register(Register::by_id(ImmediateOperand::Word(rm as Word))?)
|
||||
}
|
||||
};
|
||||
return Ok((target, reg));
|
||||
@@ -355,10 +357,10 @@ impl Disassembler {
|
||||
fn modrm_reg_to_grp1(
|
||||
reg: u8,
|
||||
target: ModRmTarget,
|
||||
instruction_width: Operand,
|
||||
instruction_width: ImmediateOperand,
|
||||
) -> Result<Mnemonic, DisasmError> {
|
||||
match instruction_width {
|
||||
Operand::Byte(b) => match reg {
|
||||
ImmediateOperand::Byte(b) => match reg {
|
||||
0b000 => Ok(Mnemonic::ADD_Ib(target, b)),
|
||||
0b001 => Ok(Mnemonic::OR_Ib(target, b)),
|
||||
0b010 => Ok(Mnemonic::ADC_Ib(target, b)),
|
||||
@@ -369,7 +371,7 @@ impl Disassembler {
|
||||
0b111 => Ok(Mnemonic::CMP_Ib(target, b)),
|
||||
_ => return Err(DisasmError::IllegalGroupMnemonic(1, reg)),
|
||||
},
|
||||
Operand::Word(w) => match reg {
|
||||
ImmediateOperand::Word(w) => match reg {
|
||||
0b000 => Ok(Mnemonic::ADD_Iv(target, w)),
|
||||
0b001 => Ok(Mnemonic::OR_Iv(target, w)),
|
||||
0b010 => Ok(Mnemonic::ADC_Iv(target, w)),
|
||||
@@ -428,12 +430,12 @@ impl Disassembler {
|
||||
&mut self,
|
||||
reg: u8,
|
||||
target: ModRmTarget,
|
||||
width: Operand,
|
||||
width: ImmediateOperand,
|
||||
) -> Result<Mnemonic, DisasmError> {
|
||||
match reg {
|
||||
0b000 => match width {
|
||||
Operand::Byte(_) => Ok(Mnemonic::TEST_Ib(target, self.parse_byte()?)),
|
||||
Operand::Word(_) => Ok(Mnemonic::TEST_Iv(target, self.parse_word()?)),
|
||||
ImmediateOperand::Byte(_) => Ok(Mnemonic::TEST_Ib(target, self.parse_byte()?)),
|
||||
ImmediateOperand::Word(_) => Ok(Mnemonic::TEST_Iv(target, self.parse_word()?)),
|
||||
},
|
||||
// 0b001 => // unused
|
||||
0b010 => Ok(Mnemonic::NOT(target)),
|
||||
@@ -635,26 +637,26 @@ impl Disassembler {
|
||||
|
||||
// Group 1
|
||||
0x80 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Byte(0))?;
|
||||
let imm = self.parse_byte()?;
|
||||
Self::modrm_reg_to_grp1(reg, target, Operand::Byte(imm))?
|
||||
Self::modrm_reg_to_grp1(reg, target, ImmediateOperand::Byte(imm))?
|
||||
}
|
||||
0x81 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
let imm = self.parse_word()?;
|
||||
Self::modrm_reg_to_grp1(reg, target, Operand::Word(imm))?
|
||||
Self::modrm_reg_to_grp1(reg, target, ImmediateOperand::Word(imm))?
|
||||
}
|
||||
0x82 => {
|
||||
// same as 0x80
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Byte(0))?;
|
||||
let imm = self.parse_byte()?;
|
||||
Self::modrm_reg_to_grp1(reg, target, Operand::Byte(imm))?
|
||||
Self::modrm_reg_to_grp1(reg, target, ImmediateOperand::Byte(imm))?
|
||||
}
|
||||
0x83 => {
|
||||
// byte extended version
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
let imm = self.parse_byte()?;
|
||||
Self::modrm_reg_to_grp1(reg, target, Operand::Byte(imm))?
|
||||
Self::modrm_reg_to_grp1(reg, target, ImmediateOperand::Byte(imm))?
|
||||
}
|
||||
|
||||
0x84 => modrm_8b_register!(self, TEST),
|
||||
@@ -673,7 +675,7 @@ impl Disassembler {
|
||||
0x8D => modrm_16b_register!(self, LEA),
|
||||
|
||||
0x8F => {
|
||||
let (target, _) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let (target, _) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
let mem = match target {
|
||||
ModRmTarget::Memory(idx) => idx,
|
||||
_ => {
|
||||
@@ -749,24 +751,24 @@ impl Disassembler {
|
||||
0xC3 => Mnemonic::RET,
|
||||
|
||||
0xC4 => {
|
||||
let (target, reg_id) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let reg = Register::by_id(Operand::Word(reg_id as Word))?;
|
||||
let (target, reg_id) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
let reg = Register::by_id(ImmediateOperand::Word(reg_id as Word))?;
|
||||
let ptr = Pointer16::try_from(target)?;
|
||||
Mnemonic::LES(reg, ptr)
|
||||
}
|
||||
0xC5 => {
|
||||
let (target, reg_id) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let reg = Register::by_id(Operand::Word(reg_id as Word))?;
|
||||
let (target, reg_id) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
let reg = Register::by_id(ImmediateOperand::Word(reg_id as Word))?;
|
||||
let ptr = Pointer16::try_from(target)?;
|
||||
Mnemonic::LDS(reg, ptr)
|
||||
}
|
||||
|
||||
0xC6 => {
|
||||
let (target, _) = self.parse_modrm_byte(Operand::Byte(0))?;
|
||||
let (target, _) = self.parse_modrm_byte(ImmediateOperand::Byte(0))?;
|
||||
Mnemonic::MOV_Ib(target, self.parse_byte()?)
|
||||
}
|
||||
0xC7 => {
|
||||
let (target, _) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let (target, _) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
Mnemonic::MOV_Iv(target, self.parse_word()?)
|
||||
}
|
||||
|
||||
@@ -783,19 +785,19 @@ impl Disassembler {
|
||||
|
||||
// Group 2
|
||||
0xD0 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Byte(0))?;
|
||||
Self::modrm_reg_to_grp2_1(reg, target)?
|
||||
}
|
||||
0xD1 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
Self::modrm_reg_to_grp2_1(reg, target)?
|
||||
}
|
||||
0xD2 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Byte(0))?;
|
||||
Self::modrm_reg_to_grp2_cl(reg, target)?
|
||||
}
|
||||
0xD3 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
Self::modrm_reg_to_grp2_cl(reg, target)?
|
||||
}
|
||||
|
||||
@@ -842,13 +844,13 @@ impl Disassembler {
|
||||
|
||||
// Group 3a
|
||||
0xF6 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0))?;
|
||||
self.modrm_reg_to_grp3(reg, target, Operand::Byte(0))?
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Byte(0))?;
|
||||
self.modrm_reg_to_grp3(reg, target, ImmediateOperand::Byte(0))?
|
||||
}
|
||||
// Group 3b
|
||||
0xF7 => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
self.modrm_reg_to_grp3(reg, target, Operand::Word(0))?
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
self.modrm_reg_to_grp3(reg, target, ImmediateOperand::Word(0))?
|
||||
}
|
||||
|
||||
0xF8 => Mnemonic::CLC,
|
||||
@@ -860,7 +862,7 @@ impl Disassembler {
|
||||
|
||||
// Group 4
|
||||
0xFE => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Byte(0))?;
|
||||
match reg {
|
||||
0b0 => Mnemonic::INC_Mod(target),
|
||||
0b1 => Mnemonic::DEC_Mod(target),
|
||||
@@ -870,7 +872,7 @@ impl Disassembler {
|
||||
|
||||
// Group 5
|
||||
0xFF => {
|
||||
let (target, reg) = self.parse_modrm_byte(Operand::Word(0))?;
|
||||
let (target, reg) = self.parse_modrm_byte(ImmediateOperand::Word(0))?;
|
||||
match reg {
|
||||
0b000 => Mnemonic::INC_Mod(target),
|
||||
0b001 => Mnemonic::DEC_Mod(target),
|
||||
|
||||
Reference in New Issue
Block a user