blob: f5842c661e78a72b7028b566fd9130147eb7b29f (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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.
|