From 200447fed7f7fffa6c13360375b99b8d675b81ac Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 3 Aug 2020 00:57:45 -0700 Subject: more pop --- src/long_mode/mod.rs | 11 +++++++++++ test/long_mode/mod.rs | 2 ++ 2 files changed, 13 insertions(+) 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>(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] -- cgit v1.1