diff options
| author | iximeow <me@iximeow.net> | 2020-08-02 20:57:17 -0700 | 
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2020-08-09 01:38:57 -0700 | 
| commit | 4112c2282a207ab0738db44dfc69caf68fe50de9 (patch) | |
| tree | 02d1e364cfc33eb044bc7ef1279cf0709a3cfba7 /src/long_mode | |
| parent | f87d5d33c50adc6c7112945e61b23e4c4dd3e83c (diff) | |
fix setcc decoding
Diffstat (limited to 'src/long_mode')
| -rw-r--r-- | src/long_mode/mod.rs | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index 61ae89f..b620092 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -3524,7 +3524,13 @@ pub enum OperandCode {      x87_de = OperandCodeBuilder::new().special_case(37).bits(),      x87_df = OperandCodeBuilder::new().special_case(38).bits(), -    Eb_R0 = OperandCodeBuilder::new().special_case(39).bits(), +    Eb_R0 = OperandCodeBuilder::new() +        .read_modrm() +        .set_embedded_instructions() +        .read_E() +        .byte_operands() +        .operand_case(20) +        .bits(),      AL_Ib = OperandCodeBuilder::new().special_case(40).bits(),      AX_Ib = OperandCodeBuilder::new().special_case(41).bits(),      Ib_AL = OperandCodeBuilder::new().special_case(42).bits(), @@ -5770,10 +5776,11 @@ fn read_operands<T: Iterator<Item=u8>>(decoder: &InstDecoder, mut bytes_iter: T,          let operand_code: OperandCode = unsafe { core::mem::transmute(operand_code.bits()) };      match operand_code {          OperandCode::Eb_R0 => { -            if (modrm & 0b00111000) != 0 { -                instruction.opcode = Opcode::Invalid; -                return Err(DecodeError::InvalidOperand); // Err("Invalid modr/m for opcode 0xc6".to_owned()); -            } +            // turns out xed cand capstone both permit nonzero rrr bits here. +            // if (modrm & 0b00111000) != 0 { +            //    instruction.opcode = Opcode::Invalid; +            //    return Err(DecodeError::InvalidOperand); +            //}              instruction.operands[0] = mem_oper;              instruction.operand_count = 1; | 
