From 8316b628bbc9945fd1d08305317cf49a6482801f Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Sun, 5 Mar 2023 22:20:48 +0100 Subject: Added CALL and call extern fn example --- examples/add.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 examples/add.rs (limited to 'examples') 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:: u32>() }; + + let res = add42(5); + assert_eq!(res, 47); +} -- cgit v1.2.3