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 --- src/insn.rs | 1 + src/insn/nop.rs | 7 +++++++ tests/jmp.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 src/insn/nop.rs create mode 100644 tests/jmp.rs diff --git a/src/insn.rs b/src/insn.rs index db62e6c..2a6ca42 100644 --- a/src/insn.rs +++ b/src/insn.rs @@ -6,6 +6,7 @@ mod jmp; mod jnz; mod jz; mod mov; +mod nop; mod ret; mod test; diff --git a/src/insn/nop.rs b/src/insn/nop.rs new file mode 100644 index 0000000..82057db --- /dev/null +++ b/src/insn/nop.rs @@ -0,0 +1,7 @@ +use crate::Asm; + +impl Asm { + pub fn nop(&mut self) { + self.emit(&[0x90]); + } +} 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