diff options
| -rw-r--r-- | src/long_mode/mod.rs | 11 | ||||
| -rw-r--r-- | test/long_mode/mod.rs | 2 | 
2 files changed, 13 insertions, 0 deletions
| diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index e79c8cb..4ef7a04 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -5982,6 +5982,17 @@ fn read_operands<T: Iterator<Item=u8>>(decoder: &InstDecoder, mut bytes_iter: T,              ][r as usize];              instruction.operand_count = 1;          } +        OperandCode::ModRM_0x8f_Ev => { +            instruction.operands[0] = mem_oper; +            let r = (modrm >> 3) & 7; +            if r >= 1 { +                return Err(DecodeError::InvalidOpcode); +            } +            instruction.opcode = [ +                Opcode::POP, +            ][r as usize]; +            instruction.operand_count = 1; +        }          OperandCode::ModRM_0xff_Ev => {              instruction.operands[0] = mem_oper;              let r = (modrm >> 3) & 7; diff --git a/test/long_mode/mod.rs b/test/long_mode/mod.rs index 0d81d02..291efd4 100644 --- a/test/long_mode/mod.rs +++ b/test/long_mode/mod.rs @@ -1132,6 +1132,8 @@ fn test_push_pop() {      test_display(&[0x5b], "pop rbx");      test_display(&[0x41, 0x5e], "pop r14");      test_display(&[0x68, 0x7f, 0x63, 0xc4, 0x00], "push 0xc4637f"); +    test_display(&[0x66, 0x8f, 0x00], "pop [rax]"); +    test_display(&[0x8f, 0x00], "pop [rax]");  }  #[test] | 
