summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2026-06-10 20:20:53 +0000
committeronelin <oscar@nelin.dk>2026-06-10 20:20:53 +0000
commit3c3158a79d208d1be32d3804140b2ff0b809cc1d (patch)
treeb37d72e1f9fcd55dec49ec32da7f6281801d3c81
parentbdab60d74d14eeea7a5e35a983e5e319686ae192 (diff)
Adding ModR/M byte macro ...
-rw-r--r--instructions.h18
1 files changed, 16 insertions, 2 deletions
diff --git a/instructions.h b/instructions.h
index 9727137..1623ff0 100644
--- a/instructions.h
+++ b/instructions.h
@@ -47,6 +47,20 @@
#define MOVABS(reg, imm) 0x48, MOVD(reg, imm)
#define MOVQ(reg, imm) 0x48, 89 c8
+#define MODRM(mod, reg, rm) (((mod & 3) << 6) | ((reg & 7) << 3) | (rm & 3))
+// MOD REG RM (r/m = register/memory)
+// 1 1 | 1 0 1 | 1 0 1
+// if mod == 0b11, then treat r/m as register,
+// (examples in OP SRC DST ordering (same as the reg-rm order)
+// gas/at&t ASM => op reg-idx reg-idx => MOD | REG | RM
+// --------------------+----------------------+---------------------
+// ie "xor %rcx, %rcx" => XOR 1 1 => 1 1 | 0 0 1 | 0 0 1
+// ie "xor %rsi, %rbp" => XOR 6 5 => 1 1 | 1 0 1 | 1 1 0
+//
+// Other combinations of MOD means RM specifies an addressing mode.
+// For 64bit systems:
+//
+
#define ADD
#define CALL
#define CMP
@@ -64,10 +78,10 @@
#define LEA
#define POP
#define PUSH
-#define RET
+#define RET 0xc3
#define RETN
#define SUB
-#define XOR
+#define XOR /*TODO*/
#define SYSCALL 0x0f, 0x05