mipsasm_rsp/
lib.rs

1#![no_std]
2
3extern crate alloc;
4
5use alloc::{
6    string::{String, ToString},
7    vec::Vec,
8};
9use core::marker::PhantomData;
10pub use error::ParserError;
11
12mod ast;
13mod disassembler;
14mod error;
15
16/// An instance of the assembler/disassembler
17pub struct Mipsasm<'a> {
18    base_addr: u32,
19    _marker: PhantomData<&'a str>,
20}
21
22impl<'a> Default for Mipsasm<'a> {
23    fn default() -> Self {
24        Self::new()
25    }
26}
27
28impl<'a> Mipsasm<'a> {
29    /// Create a new `Mipsasm` instance.
30    ///
31    /// Sets the base address to 0 and the debug flag to false.
32    pub fn new() -> Mipsasm<'a> {
33        Mipsasm {
34            base_addr: 0,
35            _marker: PhantomData,
36        }
37    }
38
39    /// Set the base address for the assembler.
40    ///
41    /// # Examples
42    ///
43    /// ```
44    /// use mipsasm::Mipsasm;
45    ///
46    /// let mut mipsasm = Mipsasm::new();
47    /// mipsasm.base(0x8000_0000);
48    /// ```
49    pub fn base(&mut self, addr: u32) -> &mut Mipsasm<'a> {
50        self.base_addr = addr;
51        self
52    }
53
54    /// Disassembles a set of MIPS instructions.
55    ///
56    /// # Examples
57    ///
58    /// ```
59    /// use mipsasm::Mipsasm;
60    ///
61    /// let mut mipsasm = Mipsasm::new();
62    /// let instructions = mipsasm.disassemble(&[0x00850018]);
63    /// assert_eq!(instructions, vec!["mult    a0, a1"]);
64    /// ```
65    pub fn disassemble(&self, input: &[u32]) -> Vec<String> {
66        let x = disassembler::disassemble(input.to_vec());
67        x.iter().map(|x| x.to_string()).collect::<Vec<String>>()
68    }
69}