1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Licensed under the 2-Clause BSD license <LICENSE or
// https://opensource.org/licenses/BSD-2-Clause>. This
// file may not be copied, modified, or distributed
// except according to those terms.

//! # Burst
//!
//! Burst is a library supporting decomposing binary code
//! into instructions, while maintaining detailed information
//! about the instructions, their flags, and the operands. The
//! result is a structure rather than textual strings.
//!
//! While Burst currently only supports x86 and x86_64 code,
//! this will change in the near future and we anticipate adding
//! many additional architectures.
//!
//! ## Goals of Burst:
//!
//! * Regular releases without waiting for long periods of time.
//! * Uses fuzz testing to avoid crashes.
//! * Well tested.
//! * Fast. Few allocations and little data copying should be required.
//!
//! ## Installation
//!
//! This crate works with Cargo and is on
//! [crates.io](https://crates.io/crates/burst).
//! Add it to your `Cargo.toml` like so:
//!
//! ```toml
//! [dependencies]
//! burst = "0.0.3"
//! ```
//!
//! Then, let `rustc` know that you're going to use this crate at the
//! top of your own crate:
//!
//! ```
//! extern crate burst;
//! # fn main() {}
//! ```
//!
//! ## Contributions
//!
//! Contributions are welcome.
//!

#![warn(missing_docs)]
#![deny(trivial_numeric_casts, unstable_features,
        unused_import_braces, unused_qualifications)]

pub mod x86;

/// An instruction operation.
///
/// This is description of the actual CPU operation that the
/// instruction carries out.
pub trait Operation {
    /// The mnemonic for this instruction.
    fn mnemonic(&self) -> &str;
}

/// An operand for an `Instruction`.
pub trait Operand {}

/// An decoded instruction, including an `Operation` and its
/// `Operand`s.
///
/// An instruction represents the full amount of information that
/// we have about the instruction that has been disassembled from
/// the binary opcode data.
pub trait Instruction {
    /// The type of the operation for this instruction.
    type Operation: Operation;

    /// The type of the operands for this instruction.
    type Operand: Operand;

    /// The operation carried out by this instruction.
    fn operation(&self) -> Self::Operation;

    /// The mnemonic for this instruction.
    fn mnemonic(&self) -> &str;

    /// The operands for this instruction.
    fn operands(&self) -> &[Self::Operand];

    /// How many bytes in the binary opcode data are used by this
    /// instruction.
    ///
    /// This can be used to continue disassembling at the next
    /// instruction. An invalid instruction may have a value of
    /// `0` here.
    fn length(&self) -> usize;
}