fix: use unsigned Operand type for immediates

This commit is contained in:
2025-05-15 09:28:28 +09:00
parent 8ff92c81b3
commit 1c7ddbe9fa
2 changed files with 27 additions and 27 deletions

View File

@@ -221,9 +221,9 @@ impl Disassembler {
/// Group 1 always have an ModRM target (all modrm bits, without reg) as
/// first and an imm value as second operand (which has to be parsed before
/// call to this function), but is available in both Byte and Word length.
pub fn modrm_reg_to_grp1(reg: u8, target: ModRmTarget, imm: Displacement) -> Mnemonic {
pub fn modrm_reg_to_grp1(reg: u8, target: ModRmTarget, imm: Operand) -> Mnemonic {
match imm {
Displacement::IByte(b) => match reg {
Operand::Byte(b) => match reg {
0b000 => Mnemonic::ADD_Ib(target, b),
0b001 => Mnemonic::OR_Ib(target, b),
0b010 => Mnemonic::ADC_Ib(target, b),
@@ -234,7 +234,7 @@ impl Disassembler {
0b111 => Mnemonic::CMP_Ib(target, b),
_ => panic!("Illegal Group 1 mnemonic"),
},
Displacement::IWord(w) => match reg {
Operand::Word(w) => match reg {
0b000 => Mnemonic::ADD_Iv(target, w),
0b001 => Mnemonic::OR_Iv(target, w),
0b010 => Mnemonic::ADC_Iv(target, w),
@@ -462,25 +462,25 @@ impl Disassembler {
// Group 1
0x80 => {
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0));
let imm = self.parse_byte() as IByte;
Self::modrm_reg_to_grp1(reg, target, Displacement::IByte(imm))
let imm = self.parse_byte();
Self::modrm_reg_to_grp1(reg, target, Operand::Byte(imm))
}
0x81 => {
let (target, reg) = self.parse_modrm_byte(Operand::Word(0));
let imm = self.parse_word() as IWord;
Self::modrm_reg_to_grp1(reg, target, Displacement::IWord(imm))
let imm = self.parse_word();
Self::modrm_reg_to_grp1(reg, target, Operand::Word(imm))
}
0x82 => {
// same as 0x80
let (target, reg) = self.parse_modrm_byte(Operand::Byte(0));
let imm = self.parse_byte() as IByte;
Self::modrm_reg_to_grp1(reg, target, Displacement::IByte(imm))
let imm = self.parse_byte();
Self::modrm_reg_to_grp1(reg, target, Operand::Byte(imm))
}
0x83 => {
// byte extended version
let (target, reg) = self.parse_modrm_byte(Operand::Word(0));
let imm = self.parse_byte() as IByte;
Self::modrm_reg_to_grp1(reg, target, Displacement::IByte(imm))
let imm = self.parse_byte();
Self::modrm_reg_to_grp1(reg, target, Operand::Byte(imm))
}
0x84 => modrmb!(self, TEST),