#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