chore: show raw pointer value in disasm
This commit is contained in:
@@ -1,7 +1,9 @@
|
|||||||
//! The main dissembling logic.
|
//! The main dissembling logic.
|
||||||
|
|
||||||
use crate::aout::Aout;
|
use crate::aout::Aout;
|
||||||
use crate::operands::{Displacement, IByte, IWord, MemoryIndex, ModRmTarget, Operand, Pointer};
|
use crate::operands::{
|
||||||
|
DWord, Displacement, IByte, IWord, MemoryIndex, ModRmTarget, Operand, Pointer,
|
||||||
|
};
|
||||||
use crate::register::{Register, RegisterId, SegmentRegister};
|
use crate::register::{Register, RegisterId, SegmentRegister};
|
||||||
use crate::{
|
use crate::{
|
||||||
Args,
|
Args,
|
||||||
@@ -541,6 +543,12 @@ impl Disassembler {
|
|||||||
0x99 => Mnemonic::CWD,
|
0x99 => Mnemonic::CWD,
|
||||||
|
|
||||||
0x9A => Mnemonic::CALL_p(Pointer {
|
0x9A => Mnemonic::CALL_p(Pointer {
|
||||||
|
raw: DWord::from_le_bytes([
|
||||||
|
self.text[self.offset],
|
||||||
|
self.text[self.offset + 1],
|
||||||
|
self.text[self.offset + 2],
|
||||||
|
self.text[self.offset + 3],
|
||||||
|
]),
|
||||||
segment: self.parse_word(),
|
segment: self.parse_word(),
|
||||||
offset: self.parse_word(),
|
offset: self.parse_word(),
|
||||||
}),
|
}),
|
||||||
@@ -657,6 +665,12 @@ impl Disassembler {
|
|||||||
|
|
||||||
0xE9 => Mnemonic::JMP_v(self.parse_j_word()),
|
0xE9 => Mnemonic::JMP_v(self.parse_j_word()),
|
||||||
0xEA => Mnemonic::JMP_p(Pointer {
|
0xEA => Mnemonic::JMP_p(Pointer {
|
||||||
|
raw: DWord::from_le_bytes([
|
||||||
|
self.text[self.offset],
|
||||||
|
self.text[self.offset + 1],
|
||||||
|
self.text[self.offset + 2],
|
||||||
|
self.text[self.offset + 3],
|
||||||
|
]),
|
||||||
segment: self.parse_word(),
|
segment: self.parse_word(),
|
||||||
offset: self.parse_word(),
|
offset: self.parse_word(),
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ pub type Byte = u8; // b
|
|||||||
pub type IByte = i8; // used for displacements of memory access
|
pub type IByte = i8; // used for displacements of memory access
|
||||||
pub type Word = u16; // w or v
|
pub type Word = u16; // w or v
|
||||||
pub type IWord = i16; // used for displacement of memory access
|
pub type IWord = i16; // used for displacement of memory access
|
||||||
|
pub type DWord = u32;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
@@ -130,12 +131,13 @@ impl fmt::Display for MemoryIndex {
|
|||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
/// 32-bit segment:offset pointer (e.g. for CALL instruction)
|
/// 32-bit segment:offset pointer (e.g. for CALL instruction)
|
||||||
pub struct Pointer {
|
pub struct Pointer {
|
||||||
|
pub raw: DWord,
|
||||||
pub segment: Word,
|
pub segment: Word,
|
||||||
pub offset: Word,
|
pub offset: Word,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for Pointer {
|
impl std::fmt::Display for Pointer {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
write!(f, "{}:{}", self.segment, self.offset)
|
write!(f, "[{:#04x}] ({}:{})", self.raw, self.segment, self.offset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user