diff options
| author | onelin <oscar@nelin.dk> | 2026-06-10 04:58:13 +0000 |
|---|---|---|
| committer | onelin <oscar@nelin.dk> | 2026-06-10 04:58:13 +0000 |
| commit | 7cc1a2e6ccc8f4a87e73c35672e7bb973e965470 (patch) | |
| tree | ce65f72b384f9d75d15cc68ed2f0225e2b21ae0b /instructions.h | |
Initial commit
Diffstat (limited to 'instructions.h')
| -rw-r--r-- | instructions.h | 76 |
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 |
