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}