Skip to content

Provides a convient API to produce arm64/Aarch64 instructions

License

Notifications You must be signed in to change notification settings

Jozott00/ARMoured_rust

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ARMoured_rust

GitHub Workflow Status codecov

Provides a convenient and performant API to produce arm64/Aarch64 instructions.

Instruction Support

The instruction implementations are indexed by Encoding.

Status Instruction Types Notes
SVE encodings -
Data Processing -- Immediate -
🚧 Branches, Exception Generating and System instructions -
Loads and Stores -
Data Processing -- Register -
Data Processing -- Scalar Floating-Point and Advanced SIMD -

Note: Status ❌ means "not yet supported"

Example

Here is an example usage of the McMemory and InstrStream. The McMemory (Machine Code Memory) allocates space for one page size, while the InstrStream generates and emits instruction to this memory.

fn main() {
    let mut mem = McMemory::new_pagesize();
    let mut stream = InstrStream::new(&mut mem);
    stream.mov_64_imm(1, 0x23);
    stream.add_64_imm(0, 1, 0x4);
    stream.ret();

    // print stream disassembly before patch
    println!("Disasm before patch: ");
    stream.print_disasm();

    // patch `stream.mov_64_imm(1, 0x23);` instruction
    stream.patch_at(stream.base_ptr(), |s| {
        s.movn_64_imm(1, 4);
    });

    // print stream disassembly after patch
    println!("Disasm after patch: ");
    stream.print_disasm();

    // get stream `fn() -> u64` pointer and make memory executable 
    let func = stream.nullary_fn_ptr();
    mem.make_executable();

    // call function and get result
    let res = unsafe { func() };
    println!("Called function with result: {res:#x}");
}

About

Provides a convient API to produce arm64/Aarch64 instructions

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published