#ifndef _X86ENCODE_H #define _X86ENCODE_H #include // A general-purpose x86 register. // The specific register size (e.g. al/ax/eax/rax) depends on the instruction. // All registers are valid for all instructions; we will perform exchanges if necessary. typedef enum reg { AX = 0, // rax, eax, ax, al CX = 1, // rcx, ecx, cx, cl DX = 2, // rdx, edx, dx, dl BX = 3, // rbx, ebx, bx, bl SP = 4, // rsp, esp, sp, spl (we do not use ah) BP = 5, // rbp, ebp, bp, bpl (we do not use ch) SI = 6, // rsi, esi, si, sil (we do not use dh) DI = 7, // rdi, edi, di, dil (we do not use bh) R8 = 8, // r8, r8d, r8w, r8l R9 = 9, // r9, r9d, r9w, r9l R10 = 10, // r10, r10d, r10w, r10l R11 = 11, // r11, r11d, r11w, r11l R12 = 12, // r12, r12d, r12w, r12l R13 = 13, // r13, r13d, r13w, r13l R14 = 14, // r14, r14d, r14w, r14l R15 = 15, // r15, r15d, r15w, r15l } reg; void x86_inst_mov_r64_imm64(reg dest, uint64_t imm); void x86_inst_mov_r64_imm32(reg dest, uint32_t imm); void x86_inst_mov_r64_imm(reg dest, uint64_t imm); void x86_inst_mov_r64_r64(reg dest, reg src); void x86_inst_mov_r64_m64(reg dest, reg src); void x86_inst_mov_r64_m64_disp8(reg dest, reg src, int8_t disp); void x86_inst_mov_r64_m64_disp32(reg dest, reg src, int32_t disp); void x86_inst_mov_r64_m64_disp(reg dest, reg src, int32_t disp); void x86_inst_mov_m64_r64(reg dest, reg src); void x86_inst_mov_m64_r64_disp8(reg dest, reg src, int8_t disp); void x86_inst_mov_m64_r64_disp32(reg dest, reg src, int32_t disp); void x86_inst_mov_m64_r64_disp(reg dest, reg src, int32_t disp); void x86_inst_push_r64(reg reg); void x86_inst_pop_r64(reg reg); void x86_inst_test_r64_r64(reg r1, reg r2); #define X86_JMP_DISP8_SIZE 2 void x86_inst_jmp_disp8(int8_t disp); #define X86_JMP_DISP32_SIZE 5 void x86_inst_jmp_disp32(int32_t disp); void x86_inst_jmp_disp(int32_t disp); void x86_inst_jmp_disp32_op(void); #define X86_JNZ_DISP8_SIZE 2 void x86_inst_jnz_disp8(int8_t disp); #define X86_JNZ_DISP32_SIZE 6 void x86_inst_jnz_disp32(int32_t disp); void x86_inst_jnz_disp(int32_t disp); void x86_inst_jnz_disp32_op(void); #define X86_JZ_DISP8_SIZE 2 void x86_inst_jz_disp8(int8_t disp); #define X86_JZ_DISP32_SIZE 6 void x86_inst_jz_disp32(int32_t disp); void x86_inst_jz_disp(int32_t disp); void x86_inst_jz_disp32_op(void); void x86_inst_sub_r64_imm8(reg dest, int8_t imm); void x86_inst_sub_r64_imm32(reg dest, int32_t imm); void x86_inst_sub_r64_imm(reg dest, int32_t imm); void x86_inst_sub_r64_r64(reg dest, reg src); void x86_inst_add_r64_imm8(reg dest, int8_t imm); void x86_inst_add_r64_r64(reg dest, reg src); void x86_inst_syscall(void); #endif