x86_64_assembler/
lib.rs

1use gaia_types::{helpers::Architecture, GaiaError, Result};
2
3pub mod builder;
4pub mod decoder;
5pub mod encoder;
6pub mod instruction;
7
8use instruction::Instruction;
9
10pub struct X86_64Assembler {
11    architecture: Architecture,
12}
13
14impl X86_64Assembler {
15    pub fn new(architecture: Architecture) -> Result<Self> {
16        match architecture {
17            Architecture::X86 | Architecture::X86_64 => Ok(Self { architecture }),
18            _ => Err(GaiaError::unsupported_architecture(architecture)),
19        }
20    }
21
22    pub fn encode(&self, instruction: &Instruction) -> Result<Vec<u8>> {
23        let encoder = encoder::InstructionEncoder::new(self.architecture.clone());
24        encoder.encode(instruction)
25    }
26
27    pub fn decode(&self, bytes: &[u8]) -> Result<Vec<Instruction>> {
28        let decoder = decoder::InstructionDecoder::new(self.architecture.clone());
29        decoder.decode(bytes)
30    }
31
32    pub fn architecture(&self) -> Architecture {
33        self.architecture.clone()
34    }
35
36    pub fn set_architecture(&mut self, architecture: Architecture) -> Result<()> {
37        match architecture {
38            Architecture::X86 | Architecture::X86_64 => {
39                self.architecture = architecture;
40                Ok(())
41            }
42            _ => Err(GaiaError::unsupported_architecture(architecture)),
43        }
44    }
45}