From 70585db861e03ec76648070ed4e3fc88b9808c48 Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 3 Aug 2020 00:41:49 -0700 Subject: loop{,z,nz}/jecxz --- src/long_mode/display.rs | 8 ++++++++ src/long_mode/mod.rs | 17 +++++++++-------- test/long_mode/mod.rs | 4 ++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/long_mode/display.rs b/src/long_mode/display.rs index 260d5dc..2bd9ad8 100644 --- a/src/long_mode/display.rs +++ b/src/long_mode/display.rs @@ -1235,6 +1235,10 @@ const MNEMONICS: &[&'static str] = &[ "fxtract", "fyl2x", "fyl2xp1", + "loopnz", + "loopz", + "loop", + "jrcxz", ]; impl Opcode { @@ -1628,6 +1632,10 @@ impl > Colorize { write!(out, "{}", colors.stop_op(self)) } + Opcode::LOOPNZ | + Opcode::LOOPZ | + Opcode::LOOP | + Opcode::JRCXZ | Opcode::CALL | Opcode::CALLF | Opcode::JMP | diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index 6ff6ac9..2f5fe5d 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -1537,6 +1537,11 @@ pub enum Opcode { FXTRACT, FYL2X, FYL2XP1, + + LOOPNZ, + LOOPZ, + LOOP, + JRCXZ, } #[derive(Debug)] @@ -5236,14 +5241,10 @@ const OPCODES: [OpcodeRecord; 256] = [ // x86 df OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::x87_df), // 0xe0 - // LOOPNZ - OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), - // LOOPZ - OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), - // LOOP - OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), - // JECXZ - OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::LOOPNZ), OperandCode::Ibs), + OpcodeRecord(Interpretation::Instruction(Opcode::LOOPZ), OperandCode::Ibs), + OpcodeRecord(Interpretation::Instruction(Opcode::LOOP), OperandCode::Ibs), + OpcodeRecord(Interpretation::Instruction(Opcode::JRCXZ), OperandCode::Ibs), OpcodeRecord(Interpretation::Instruction(Opcode::IN), OperandCode::AL_Ib), OpcodeRecord(Interpretation::Instruction(Opcode::IN), OperandCode::AX_Ib), OpcodeRecord(Interpretation::Instruction(Opcode::OUT), OperandCode::Ib_AL), diff --git a/test/long_mode/mod.rs b/test/long_mode/mod.rs index 3d38d09..7c4c5fa 100644 --- a/test/long_mode/mod.rs +++ b/test/long_mode/mod.rs @@ -1099,6 +1099,10 @@ fn test_control_flow() { test_display(&[0x67, 0xff, 0xe0], "jmp rax"); test_invalid(&[0xff, 0xd8]); test_display(&[0xff, 0x18], "callf [rax]"); + test_display(&[0xe0, 0x12], "loopnz 0x12"); + test_display(&[0xe1, 0x12], "loopz 0x12"); + test_display(&[0xe2, 0x12], "loop 0x12"); + test_display(&[0xe3, 0x12], "jrcxz 0x12"); test_display(&[0xc3], "ret"); } -- cgit v1.1