From 005fca316085c3a2ce3e43b92531f006a15fbdd2 Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Sun, 5 Mar 2023 22:20:17 +0100 Subject: Add jmp test --- tests/jmp.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tests/jmp.rs (limited to 'tests') diff --git a/tests/jmp.rs b/tests/jmp.rs new file mode 100644 index 0000000..2524218 --- /dev/null +++ b/tests/jmp.rs @@ -0,0 +1,59 @@ +use juicebox_asm::prelude::*; + +#[test] +#[should_panic] +fn unbound_label() { + let _l = Label::new(); +} + +#[test] +#[should_panic] +fn unbound_label2() { + let mut lbl = Label::new(); + let mut asm = Asm::new(); + asm.jmp(&mut lbl); +} + +#[test] +fn jmp_label() { + { + // Bind first. + let mut lbl = Label::new(); + let mut asm = Asm::new(); + asm.bind(&mut lbl); + asm.jmp(&mut lbl); + // 0xfffffffb -> -5 + assert_eq!(asm.into_code(), [0xe9, 0xfb, 0xff, 0xff, 0xff]); + } + { + // Bind later. + let mut lbl = Label::new(); + let mut asm = Asm::new(); + asm.jmp(&mut lbl); + asm.bind(&mut lbl); + assert_eq!(asm.into_code(), [0xe9, 0x00, 0x00, 0x00, 0x00]); + } +} + +#[test] +fn jmp_label2() { + { + let mut lbl = Label::new(); + let mut asm = Asm::new(); + asm.jmp(&mut lbl); + asm.nop(); + asm.nop(); + asm.bind(&mut lbl); + assert_eq!(asm.into_code(), [0xe9, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90]); + } + { + let mut lbl = Label::new(); + let mut asm = Asm::new(); + asm.jmp(&mut lbl); + for _ in 0..0x1ff { + asm.nop(); + } + asm.bind(&mut lbl); + assert_eq!(asm.into_code()[..5], [0xe9, 0xff, 0x01, 0x00, 0x00]); + } +} -- cgit v1.2.3