From 390fd302e0314ea4cf5c150b3adb745e765d745e Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Mon, 27 Feb 2023 23:39:46 +0100 Subject: Add README and LICENSE --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 README.md (limited to 'README.md') diff --git a/README.md b/README.md new file mode 100644 index 0000000..f5842c6 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# juicebox-asm + +An `x64` jit assembler for learning purpose with the following two main goals: +- Learn about x64 instruction encoding. +- Learn how to use the rust type system to disallow invalid operands. + +## Example + +```rust +use juicebox_asm::prelude::{Reg32::*, *}; +use juicebox_asm::rt::Runtime; + +fn main() { + let mut asm = Asm::new(); + + // Reference implementation + // int ret = 0; + // int n = 0; + // + // loop: + // ret += n; + // --n; + // if (n != 0) goto loop; + // + // return; + + let mut lp = Label::new(); + + asm.mov(eax, Imm32::from(0)); + asm.mov(ecx, Imm32::from(42)); + + asm.bind(&mut lp); + asm.add(eax, ecx); + asm.dec(ecx); + asm.test(ecx, ecx); + asm.jnz(&mut lp); + + asm.ret(); + + let rt = Runtime::new(&asm.into_code()); + let func = unsafe { rt.as_fn:: u32>() }; + assert_eq!(func(), (0..=42).into_iter().sum()); +} +``` + +## License +This project is licensed under the [MIT](LICENSE) license. -- cgit v1.2.3