diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2023-02-27 23:39:46 +0100 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2023-02-27 23:39:46 +0100 |
commit | 390fd302e0314ea4cf5c150b3adb745e765d745e (patch) | |
tree | 96c74abbeb7aedc710ac32c2ad15c22b61cd3dd7 /README.md | |
parent | d44466c852dd353166c79d1cc618646b21e17f8c (diff) | |
download | juicebox-asm-390fd302e0314ea4cf5c150b3adb745e765d745e.tar.gz juicebox-asm-390fd302e0314ea4cf5c150b3adb745e765d745e.zip |
Add README and LICENSE
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 47 |
1 files changed, 47 insertions, 0 deletions
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::<extern "C" fn() -> u32>() }; + assert_eq!(func(), (0..=42).into_iter().sum()); +} +``` + +## License +This project is licensed under the [MIT](LICENSE) license. |