From 1f28c3c733ea3ae4234bff91e1c55e61b1ee3e96 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 31 Jul 2019 01:25:05 +0200 Subject: Starting on asm, implementing extern function call so progress is visible --- include/asm/x86_64.h | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 include/asm/x86_64.h (limited to 'include/asm') diff --git a/include/asm/x86_64.h b/include/asm/x86_64.h new file mode 100644 index 0000000..92de96b --- /dev/null +++ b/include/asm/x86_64.h @@ -0,0 +1,136 @@ +#ifndef AMAL_ASM_X86_64_H +#define AMAL_ASM_X86_64_H + +#include "../std/misc.h" +#include "../std/types.h" + +typedef struct { + void *code; + u8 *code_it; + usize size; +} Asm; + +typedef enum { + EAX, + ECX, + EDX, + EBX, + ESP, + EBP, + ESI, + EDI +} Reg32; + +typedef enum { + RAX, + RCX, + RDX, + RBX, + RSP, + RBP, + RSI, + RDI +} Reg64; + +typedef struct { + Reg64 base; + Reg64 index; + i32 disp; + u8 scale; +} AsmPtr; + +void asm_ptr_init(AsmPtr *self, Reg64 base); +void asm_ptr_init_index(AsmPtr *self, Reg64 base, Reg64 index); +void asm_ptr_init_disp(AsmPtr *self, Reg64 base, i32 disp); +void asm_ptr_init_index_disp(AsmPtr *self, Reg64 base, Reg64 index, i32 disp); + +CHECK_RESULT int asm_init(Asm *self); +void asm_deinit(Asm *self); + +CHECK_RESULT int asm_execute(Asm *self); + +CHECK_RESULT int asm_nop(Asm *self); + + + + + + + + + +CHECK_RESULT int asm_mov_mi(Asm *self, AsmPtr *dst, i32 immediate); +CHECK_RESULT int asm_mov_mr(Asm *self, AsmPtr *dst, Reg64 src); +CHECK_RESULT int asm_mov_rm(Asm *self, Reg64 dst, AsmPtr *src); +CHECK_RESULT int asm_mov_ri(Asm *self, Reg64 dst, i64 immediate); +CHECK_RESULT int asm_mov_rr(Asm *self, Reg64 dst, Reg64 src); + +CHECK_RESULT int asm_add_rr(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_sub_rr(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_imul_rr(Asm *self, Reg64 dst, Reg64 src); + +CHECK_RESULT int asm_pushr(Asm *self, Reg64 reg); +CHECK_RESULT int asm_popr(Asm *self, Reg64 reg); + + + + + + + + + + + + + + +CHECK_RESULT int asm_mov_rm32(Asm *self, Reg32 dst, Reg32 src); +CHECK_RESULT int asm_add_rm32(Asm *self, Reg32 dst, Reg32 src); +CHECK_RESULT int asm_sub_rm32(Asm *self, Reg32 dst, Reg32 src); +CHECK_RESULT int asm_and_rm32(Asm *self, Reg32 dst, Reg32 src); +CHECK_RESULT int asm_or_rm32(Asm *self, Reg32 dst, Reg32 src); +CHECK_RESULT int asm_xor_rm32(Asm *self, Reg32 dst, Reg32 src); +CHECK_RESULT int asm_cmp_rm32(Asm *self, Reg32 dst, Reg32 src); +CHECK_RESULT int asm_add_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_or_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_adc_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_sbb_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_and_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_sub_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_xor_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_cmp_rm32_imm(Asm *self, Reg32 reg, i32 immediate); +CHECK_RESULT int asm_rol_rm32_imm(Asm *self, Reg32 reg, i8 immediate); +CHECK_RESULT int asm_ror_rm32_imm(Asm *self, Reg32 reg, i8 immediate); +CHECK_RESULT int asm_rcl_rm32_imm(Asm *self, Reg32 reg, i8 immediate); +CHECK_RESULT int asm_rcr_rm32_imm(Asm *self, Reg32 reg, i8 immediate); +CHECK_RESULT int asm_shl_rm32_imm(Asm *self, Reg32 reg, i8 immediate); +CHECK_RESULT int asm_shr_rm32_imm(Asm *self, Reg32 reg, i8 immediate); +CHECK_RESULT int asm_sar_rm32_imm(Asm *self, Reg32 reg, i8 immediate); + +CHECK_RESULT int asm_mov_rm64(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_add_rm64(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_sub_rm64(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_and_rm64(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_or_rm64(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_xor_rm64(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_cmp_rm64(Asm *self, Reg64 dst, Reg64 src); +CHECK_RESULT int asm_add_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_or_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_adc_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_sbb_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_and_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_sub_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_xor_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_cmp_rm64_imm(Asm *self, Reg64 reg, i32 immediate); +CHECK_RESULT int asm_rol_rm64_imm(Asm *self, Reg64 reg, i8 immediate); +CHECK_RESULT int asm_ror_rm64_imm(Asm *self, Reg64 reg, i8 immediate); +CHECK_RESULT int asm_rcl_rm64_imm(Asm *self, Reg64 reg, i8 immediate); +CHECK_RESULT int asm_rcr_rm64_imm(Asm *self, Reg64 reg, i8 immediate); +CHECK_RESULT int asm_shl_rm64_imm(Asm *self, Reg64 reg, i8 immediate); +CHECK_RESULT int asm_shr_rm64_imm(Asm *self, Reg64 reg, i8 immediate); +CHECK_RESULT int asm_sar_rm64_imm(Asm *self, Reg64 reg, i8 immediate); + +CHECK_RESULT int asm_ret(Asm *self, u16 bytes); + +#endif -- cgit v1.2.3