summaryrefslogtreecommitdiff
path: root/instructions.h
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2026-06-10 04:58:13 +0000
committeronelin <oscar@nelin.dk>2026-06-10 04:58:13 +0000
commit7cc1a2e6ccc8f4a87e73c35672e7bb973e965470 (patch)
treece65f72b384f9d75d15cc68ed2f0225e2b21ae0b /instructions.h
Initial commit
Diffstat (limited to 'instructions.h')
-rw-r--r--instructions.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/instructions.h b/instructions.h
new file mode 100644
index 0000000..9727137
--- /dev/null
+++ b/instructions.h
@@ -0,0 +1,76 @@
+#ifndef INSTRUCTIONS_H
+#define INSTRUCTIONS_H
+
+// Prefixes
+// Prefix groups are mutually exclusive
+
+// Prefix group 1
+#define PREFIX_LOCK 0xf0
+#define PREFIX_REPNE 0xf2
+#define PREFIX_REPNZ PREFIX_REPNE
+#define PREFIX_REP 0xf3
+#define PREFIX_REPE PREFIX_REP
+#define PREFIX_REPZ PREFIX_REP
+
+// Prefix group 2
+#define PREFIX_OVERRIDE_SEGMENT_CS 0x2e
+#define PREFIX_OVERRIDE_SEGMENT_SS 0x36
+#define PREFIX_OVERRIDE_SEGMENT_DS 0x3e
+#define PREFIX_OVERRIDE_SEGMENT_ES 0x26
+#define PREFIX_OVERRIDE_SEGMENT_FS 0x64
+#define PREFIX_OVERRIDE_SEGMENT_GS 0x65
+#define PREFIX_BRANCH_NOT_TAKEN PREFIX_OVERRIDE_SEGMENT_CS
+#define PREFIX_BRANCH_TAKEN PREFIX_OVERRIDE_SEGMENT_DS
+
+// Prefix group 3
+#define PREFIX_OVERRIDE_OPSIZE 0x66
+
+// Prefix group 4
+#define PREFIX_OVERRIDE_ADDRESSSIZE 0x67
+
+// Instructions
+// Move double-word immediate
+#define MOVBI(reg, imm) (0xb0 + reg), (imm & 0xff)
+#define MOVWI(reg, imm) \
+ (0xb8 + reg), (imm & 0xff), ((imm >> 8) & 0xff), ((imm >> 16) & 0xff)
+#define MOVDI(reg, imm) \
+ (0xb8 + reg), (imm & 0xff), ((imm >> 8) & 0xff), ((imm >> 16) & 0xff), \
+ ((imm >> 24) & 0xff)
+// TODO replace 0x48 with encoding,
+// | 0 1 0 0 | W R X B |
+//
+// 0 1 0 0 -- fixed pattern
+// W -- Set to use 64-bit operands,
+// R -- extension to MODRM.reg field, registers
+// X -- extension to SIB.index field, 64-bit addressing
+// B -- extension to MODRM.rm or SIB.base field, 64-bit addressing
+#define MOVABS(reg, imm) 0x48, MOVD(reg, imm)
+#define MOVQ(reg, imm) 0x48, 89 c8
+
+#define ADD
+#define CALL
+#define CMP
+#define DEC
+#define DIV
+#define HLT
+#define IDIV
+#define IMUL
+#define INC
+#define INT
+#define INTO
+#define IRET
+#define JNZ
+#define JMP
+#define LEA
+#define POP
+#define PUSH
+#define RET
+#define RETN
+#define SUB
+#define XOR
+
+#define SYSCALL 0x0f, 0x05
+
+#define REX(mode) (0b01000000 | mode)
+
+#endif