aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/insn.rs6
-rw-r--r--src/insn/add.rs6
-rw-r--r--src/insn/dec.rs6
-rw-r--r--src/insn/jnz.rs7
-rw-r--r--src/insn/test.rs6
-rw-r--r--src/prelude.rs2
6 files changed, 32 insertions, 1 deletions
diff --git a/src/insn.rs b/src/insn.rs
index 8351c54..f3ba18d 100644
--- a/src/insn.rs
+++ b/src/insn.rs
@@ -1,6 +1,7 @@
mod add;
mod dec;
mod jmp;
+mod jnz;
mod jz;
mod mov;
mod ret;
@@ -21,6 +22,11 @@ pub trait Jmp<T> {
fn jmp(&mut self, op1: T);
}
+pub trait Jnz<T> {
+ /// Emit a conditional jump if not zero instruction (`ZF = 0`).
+ fn jnz(&mut self, op1: T);
+}
+
pub trait Jz<T> {
/// Emit a conditional jump if zero instruction (`ZF = 1`).
fn jz(&mut self, op1: T);
diff --git a/src/insn/add.rs b/src/insn/add.rs
index b8456c4..3757d14 100644
--- a/src/insn/add.rs
+++ b/src/insn/add.rs
@@ -5,3 +5,9 @@ impl Add<Reg64, Reg64> for Asm {
self.encode_rr(0x01, op1, op2);
}
}
+
+impl Add<Reg32, Reg32> for Asm {
+ fn add(&mut self, op1: Reg32, op2: Reg32) {
+ self.encode_rr(0x01, op1, op2);
+ }
+}
diff --git a/src/insn/dec.rs b/src/insn/dec.rs
index 7de5a54..c5803e7 100644
--- a/src/insn/dec.rs
+++ b/src/insn/dec.rs
@@ -5,3 +5,9 @@ impl Dec<Reg64> for Asm {
self.encode_r(0xff, 1, op1);
}
}
+
+impl Dec<Reg32> for Asm {
+ fn dec(&mut self, op1: Reg32) {
+ self.encode_r(0xff, 1, op1);
+ }
+}
diff --git a/src/insn/jnz.rs b/src/insn/jnz.rs
new file mode 100644
index 0000000..6517bd7
--- /dev/null
+++ b/src/insn/jnz.rs
@@ -0,0 +1,7 @@
+use crate::prelude::*;
+
+impl Jnz<&mut Label> for Asm {
+ fn jnz(&mut self, op1: &mut Label) {
+ self.encode_jmp_label(&[0x0f, 0x85], op1);
+ }
+}
diff --git a/src/insn/test.rs b/src/insn/test.rs
index 1319e3f..25f1680 100644
--- a/src/insn/test.rs
+++ b/src/insn/test.rs
@@ -5,3 +5,9 @@ impl Test<Reg64, Reg64> for Asm {
self.encode_rr(0x85, op1, op2);
}
}
+
+impl Test<Reg32, Reg32> for Asm {
+ fn test(&mut self, op1: Reg32, op2: Reg32) {
+ self.encode_rr(0x85, op1, op2);
+ }
+}
diff --git a/src/prelude.rs b/src/prelude.rs
index 29e7265..e1334ea 100644
--- a/src/prelude.rs
+++ b/src/prelude.rs
@@ -5,4 +5,4 @@ pub use crate::imm::{Imm16, Imm32, Imm64, Imm8};
pub use crate::label::Label;
pub use crate::reg::{Reg16, Reg32, Reg64, Reg8};
-pub use crate::insn::{Add, Dec, Jmp, Jz, Mov, Test};
+pub use crate::insn::{Add, Dec, Jmp, Jnz, Jz, Mov, Test};