ft: add first basic test

This commit is contained in:
2025-05-25 21:20:12 +09:00
parent 35207d23f0
commit 8ea91d80b8
4 changed files with 41 additions and 8 deletions

View File

@@ -829,3 +829,36 @@ impl Disassembler {
Ok(instructions)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic() {
let text = Vec::from([0x0, 0x0]);
let mut disassembler = Disassembler {
offset: 0,
text,
instruction: Instruction::new(),
};
let instructions = disassembler.decode_instructions().ok();
if let Some(instrs) = instructions {
assert_eq!(
instrs[0],
Instruction {
start: 0,
raw: Vec::from([0, 0]),
opcode: Mnemonic::ADD_FromReg(
ModRmTarget::Memory(MemoryIndex {
base: Some(Register::BX),
index: Some(Register::SI),
displacement: None
}),
Register::AL
)
}
)
}
}
}

View File

@@ -6,7 +6,7 @@ use crate::{
};
use core::fmt;
#[derive(Debug, Clone)]
#[derive(Debug, Clone, Eq, PartialEq)]
#[allow(dead_code)]
/// A single 'line' of executable ASM is called an Instruction, which
/// contains the `Mnemonic` that will be executed, alongside its starting offset
@@ -46,7 +46,7 @@ impl fmt::Display for Instruction {
}
}
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(dead_code, non_camel_case_types)]
/// All possible mnemonic variantions.
/// These are sorted by type and are not in hex-encoding order.

View File

@@ -39,7 +39,7 @@ impl fmt::LowerHex for Operand {
}
}
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
/// ModRM byte can either target a memory location or some register.
pub enum ModRmTarget {
Memory(MemoryIndex),
@@ -55,7 +55,7 @@ impl std::fmt::Display for ModRmTarget {
}
}
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
/// Memory displacements are signed versions of Byte and Word operands.
/// Encodes either Byte- or Word-sized operands.
pub enum Displacement {
@@ -95,7 +95,7 @@ impl std::fmt::Display for Displacement {
/// A memory index operand is usually created by ModRM bytes or words.
/// e.g. [bx+si]
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MemoryIndex {
pub base: Option<Register>,
pub index: Option<Register>,
@@ -131,7 +131,7 @@ impl fmt::Display for MemoryIndex {
}
}
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
/// 32-bit segment:offset pointer (e.g. for CALL instruction)
pub struct Pointer {
pub raw: DWord,

View File

@@ -3,7 +3,7 @@
use crate::{disasm::DisasmError, operands::Operand};
use core::fmt;
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(dead_code)]
/// Registers of a 8086 processor
pub enum Register {
@@ -88,7 +88,7 @@ impl fmt::Display for Register {
}
/// Segment Registers of a 8086 processor
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(dead_code)]
pub enum SegmentRegister {
DS,