diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/add.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/examples/add.rs b/examples/add.rs new file mode 100644 index 0000000..ef010b6 --- /dev/null +++ b/examples/add.rs @@ -0,0 +1,30 @@ +use juicebox_asm::prelude::*; +use juicebox_asm::Runtime; +use Reg64::*; + +extern "C" fn add(a: u32, b: u32) -> u32 { + a + b +} + +fn main() { + let mut asm = Asm::new(); + + // SystemV abi: + // rdi -> first argument + // rsi -> second argument + // rax -> return value + // + asm.mov(rsi, Imm64::from(42)); + asm.mov(rax, Imm64::from(add as u64)); + asm.call(rax); + asm.ret(); + + let code = asm.into_code(); + std::fs::write("jit.asm", &code).unwrap(); + + let rt = Runtime::new(&code); + let add42 = unsafe { rt.as_fn::<extern "C" fn(u32) -> u32>() }; + + let res = add42(5); + assert_eq!(res, 47); +} |