From f2a2a09688421f2c532ab6f02527bf68f095407a Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 25 May 2026 17:32:57 +0000 Subject: j*cxz/pusha/popa alternate size forms these all existed since forever but the library did not distinguish them and did not provide prefix information for users to tell which had been decoded. --- src/protected_mode/behavior.rs | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) (limited to 'src/protected_mode/behavior.rs') diff --git a/src/protected_mode/behavior.rs b/src/protected_mode/behavior.rs index 43bace0..22d1f9e 100644 --- a/src/protected_mode/behavior.rs +++ b/src/protected_mode/behavior.rs @@ -129,22 +129,6 @@ impl Instruction { .set_operand(1, Access::Read) .set_operand(2, Access::Read); } - } else if self.opcode == Opcode::PUSHA { - if !self.prefixes.operand_size() { - behavior = behavior - .set_implicit_ops(PUSHAD_IDX); - } else { - behavior = behavior - .set_implicit_ops(PUSHA_IDX); - } - } else if self.opcode == Opcode::POPA { - if !self.prefixes.operand_size() { - behavior = behavior - .set_implicit_ops(POPAD_IDX); - } else { - behavior = behavior - .set_implicit_ops(POPA_IDX); - } } else if self.opcode == Opcode::DIV || self.opcode == Opcode::IDIV { let op_width = if self.operands[0] == OperandSpec::RegMMM { self.regs[1].width() @@ -247,8 +231,7 @@ impl Instruction { } } else if self.opcode() == Opcode::LOOPNZ || self.opcode() == Opcode::LOOPZ - || self.opcode() == Opcode::LOOP - || self.opcode() == Opcode::JECXZ { + || self.opcode() == Opcode::LOOP { if self.prefixes.operand_size() { behavior = behavior .set_implicit_ops(RW_CX_IDX); @@ -3840,7 +3823,7 @@ fn behavior_table_size_is_right() { } /// this table MUST line up with Opcode declaration order in `mod.rs`. -static TABLE: [BehaviorDigest; 1425] = [ +static TABLE: [BehaviorDigest; 1428] = [ /* ADD => */ GENERAL_RW_R_FLAGWRITE, /* OR => */ GENERAL_RW_R_FLAGWRITE, /* ADC => */ GENERAL_RW_R_FLAGRW, @@ -5456,14 +5439,14 @@ static TABLE: [BehaviorDigest; 1425] = [ /* JECXZ => */ BehaviorDigest::empty() .set_pl_any() .set_operand(0, Access::Read) - .set_nontrivial(true), + .set_implicit_ops(RW_ECX_IDX), /* PUSHA => */ BehaviorDigest::empty() .set_pl_any() - .set_nontrivial(true), // 66 prefix adjusts size of pushed registers + .set_implicit_ops(PUSHA_IDX), /* POPA => */ BehaviorDigest::empty() .set_pl_any() - .set_nontrivial(true), // 66 prefix adjusts size of popped registers + .set_implicit_ops(POPA_IDX), /* BOUND => */ BehaviorDigest::empty() .set_pl_any() .set_operand(0, Access::Read) @@ -6202,4 +6185,15 @@ static TABLE: [BehaviorDigest; 1425] = [ .set_pl0() .set_flags_access(Access::Write) .set_complex(true), + + /* PUSHAD => */ BehaviorDigest::empty() + .set_pl_any() + .set_implicit_ops(PUSHAD_IDX), + /* POPAD => */ BehaviorDigest::empty() + .set_pl_any() + .set_implicit_ops(POPAD_IDX), + /* JCXZ => */ BehaviorDigest::empty() + .set_pl_any() + .set_operand(0, Access::Read) + .set_implicit_ops(RW_CX_IDX), ]; -- cgit v1.1