chore: align disasm output with intel spec

This commit is contained in:
2025-05-14 16:11:11 +09:00
parent 227f1bd133
commit 1aa3e2ba84

View File

@@ -325,6 +325,27 @@ impl fmt::LowerHex for Displacement {
} }
} }
impl std::fmt::Display for Displacement {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::IByte(b) => {
if *b > 0 {
write!(f, " + {}", b)
} else {
write!(f, " - {:#x}", b * -1)
}
}
Self::IWord(w) => {
if *w > 0 {
write!(f, " + {}", w)
} else {
write!(f, " - {:#x}", w * -1)
}
}
}
}
}
/// A memory index operand is usually created by ModRM bytes or words. /// A memory index operand is usually created by ModRM bytes or words.
/// e.g. [bx+si] /// e.g. [bx+si]
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@@ -340,22 +361,22 @@ impl fmt::Display for MemoryIndex {
Some(base) => match &self.index { Some(base) => match &self.index {
Some(index) => match &self.displacement { Some(index) => match &self.displacement {
Some(displacement) => { Some(displacement) => {
write!(f, "[{}+{}+{:04x}]", base, index, displacement) write!(f, "[{} + {}{}]", base, index, displacement)
} }
None => write!(f, "[{} + {}]", base, index), None => write!(f, "[{} + {}]", base, index),
}, },
None => match &self.displacement { None => match &self.displacement {
Some(displacement) => write!(f, "[{}+{:04x}]", base, displacement), Some(displacement) => write!(f, "[{}{}]", base, displacement),
None => write!(f, "[{}]", base), None => write!(f, "[{}]", base),
}, },
}, },
None => match &self.index { None => match &self.index {
Some(index) => match &self.displacement { Some(index) => match &self.displacement {
Some(displacement) => write!(f, "[{}+{:04x}]", index, displacement), Some(displacement) => write!(f, "[{}{}]", index, displacement),
None => write!(f, "[{}]", index), None => write!(f, "[{}]", index),
}, },
None => match &self.displacement { None => match &self.displacement {
Some(displacement) => write!(f, "[{:04x}]", displacement), Some(displacement) => write!(f, "[{:#x}]", displacement),
None => panic!("Memory Index without base, index and displacement"), None => panic!("Memory Index without base, index and displacement"),
}, },
}, },