diff options
author | iximeow <me@iximeow.net> | 2021-08-14 00:44:09 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2021-08-14 00:48:02 -0700 |
commit | 9bc4eca4b8269cb8e0898dfe05c3ed4059cf4fd5 (patch) | |
tree | 4c2cb8bdf632ea80fc09fc3f3526ce1a80559775 /src/protected_mode | |
parent | cf63d91ac22230ff5e97928f5bd319746fc49590 (diff) |
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.
Diffstat (limited to 'src/protected_mode')
-rw-r--r-- | src/protected_mode/display.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/protected_mode/display.rs b/src/protected_mode/display.rs index 987221e..72bfcb4 100644 --- a/src/protected_mode/display.rs +++ b/src/protected_mode/display.rs @@ -3351,6 +3351,34 @@ fn contextualize_intel<T: fmt::Write, Y: YaxColors>(instr: &Instruction, colors: out.write_str(" ")?; let x = Operand::from_spec(instr, instr.operands[0]); + + const RELATIVE_BRANCHES: [Opcode; 21] = [ + Opcode::JMP, Opcode::JECXZ, + 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(" ")?; |