5 unstable releases
Uses old Rust 2015
0.6.1 | Feb 14, 2018 |
---|---|
0.6.0 | Feb 7, 2018 |
0.5.1 | Feb 7, 2018 |
0.5.0 | Feb 6, 2018 |
0.4.0 | Feb 6, 2018 |
#1256 in Programming languages
14KB
198 lines
machina
Manage and execute assembly at runtime.
Crossplatform?
Yap.
Why?
Emulators, JIT, dynarec, etc.
Install
To build the tests you need sam.
In Cargo.toml
:
[dependencies]
machina = "*"
If you work with many instructions, you may want to enable optimization (only applied to Cache
):
[dependencies.machina]
version = "*"
features = ["optimize"]
Example
extern crate machina;
#[macro_use]
extern crate sam; // just to keep it simple
use machina::cache::{Cache, STUB};
use machina::memory::Memory;
fn main() {
let asm = format!("mov rax, {}", STUB); // fill in a dummy address
let dummy = 64;
let address = &dummy as *const _; // address of dummy
let cache = Cache::new();
let memory = Memory::new(1); // 1 page = 1024 bytes
cache.insert("mov_rax_x".to_string(), sam!(x64 => &asm)); // create the bytes at compile time via sam
memory.emit_bytes(cache.get_stub("mov_rax_x".to_string(), address as u64)) // get "mov_rax_x" and fill in a dynamic address
let rax = memory.execute(); // returns rax
}
Dependencies
~245–560KB