From 9bc4eca4b8269cb8e0898dfe05c3ed4059cf4fd5 Mon Sep 17 00:00:00 2001 From: iximeow Date: Sat, 14 Aug 2021 00:44:09 -0700 Subject: relative branches should be shown as $+offset, not just plain offset while x86 branches of immediates are all relative to PC, other architectures may have absolute branches to immediate addresses, leaving this syntax ambiguous and potentially confusing. yaxpeax prefers to write relative offsets `$+...` as a rule, so uphold that here. --- src/long_mode/display.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/long_mode') diff --git a/src/long_mode/display.rs b/src/long_mode/display.rs index 68189f0..59efe38 100644 --- a/src/long_mode/display.rs +++ b/src/long_mode/display.rs @@ -3338,6 +3338,34 @@ fn contextualize_intel(instr: &Instruction, colors: out.write_str(" ")?; let x = Operand::from_spec(instr, instr.operands[0]); + + const RELATIVE_BRANCHES: [Opcode; 21] = [ + Opcode::JMP, Opcode::JRCXZ, + Opcode::LOOP, Opcode::LOOPZ, Opcode::LOOPNZ, + Opcode::JO, Opcode::JNO, + Opcode::JB, Opcode::JNB, + Opcode::JZ, Opcode::JNZ, + Opcode::JNA, Opcode::JA, + Opcode::JS, Opcode::JNS, + Opcode::JP, Opcode::JNP, + Opcode::JL, Opcode::JGE, + Opcode::JLE, Opcode::JG, + ]; + + if instr.operands[0] == OperandSpec::ImmI8 || instr.operands[0] == OperandSpec::ImmI32 { + if RELATIVE_BRANCHES.contains(&instr.opcode) { + return match x { + Operand::ImmediateI8(rel) => { + write!(out, "$+{}", colors.number(signed_i32_hex(rel as i32))) + } + Operand::ImmediateI32(rel) => { + write!(out, "$+{}", colors.number(signed_i32_hex(rel))) + } + _ => { unreachable!() } + }; + } + } + if x.is_memory() { out.write_str(MEM_SIZE_STRINGS[instr.mem_size as usize - 1])?; out.write_str(" ")?; -- cgit v1.1