nooc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit 183f0c5a0e99fb5e66d4b5f0020e8f2130c3c54f
parent 68d7593ce6ac5febd7a54ccb3f24417fa59d6c7b
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Thu, 18 Nov 2021 21:08:12 -0600

pull x64 specific code out of main

Diffstat:
Mmain.c | 87++-----------------------------------------------------------------------------
Ax64.c | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ax64.h | 31+++++++++++++++++++++++++++++++
3 files changed, 95 insertions(+), 85 deletions(-)

diff --git a/main.c b/main.c @@ -10,6 +10,7 @@ #include <unistd.h> #include "array.h" +#include "x64.h" #define DATA_OFFSET 0x2000 @@ -468,92 +469,8 @@ parse(struct token *tok) return items; } -enum Register { - RAX, - RCX, - RDX, - RBX, - RSP, - RBP, - RSI, - RDI, - R8, - R9, - R10, - R11, - R12, - R13, - R14, - R15, -}; - -enum mod { - MOD_INDIRECT, - MOD_DISP8, - MOD_DISP32, - MOD_DIRECT -}; - -size_t -add_r_imm(char *buf, enum Register reg, uint64_t imm) -{ - uint8_t mov[] = {0x48, 0x81}; - uint8_t op1 = (MOD_DIRECT << 6) | reg; - if (buf) { - memcpy(buf, mov, 2); - buf += 2; - *(buf++) = op1; - *(buf++) = imm & 0xFF; - *(buf++) = (imm >> 8) & 0xFF; - *(buf++) = (imm >> 16) & 0xFF; - *(buf++) = (imm >> 24) & 0xFF; - } - - return 7; -} - -size_t -mov_r_imm(char *buf, enum Register reg, uint64_t imm) -{ - uint8_t mov[] = {0x48, 0xc7}; - uint8_t op1 = (MOD_DIRECT << 6) | reg; - if (buf) { - memcpy(buf, mov, 2); - buf += 2; - *(buf++) = op1; - *(buf++) = imm & 0xFF; - *(buf++) = (imm >> 8) & 0xFF; - *(buf++) = (imm >> 16) & 0xFF; - *(buf++) = (imm >> 24) & 0xFF; - } - - return 7; -} - -size_t -mov_r64_m64(char *buf, enum Register reg, uint64_t addr) -{ - uint8_t mov[] = {0x48, 0x8b}; - uint8_t op1 = (MOD_INDIRECT << 6) | (reg << 3) | 4; - uint8_t sib = 0x25; - if (buf) { - memcpy(buf, mov, 2); - buf += 2; - *(buf++) = op1; - *(buf++) = sib; - *(buf++) = addr & 0xFF; - *(buf++) = (addr >> 8) & 0xFF; - *(buf++) = (addr >> 16) & 0xFF; - *(buf++) = (addr >> 24) & 0xFF; - } - - return 8; -} - -char abi_arg[] = {RAX, RDI, RSI, RDX, R10, R8, R9}; - size_t -genexpr(char *buf, size_t idx, int reg) +genexpr(char *buf, size_t idx, enum reg reg) { // FIXME: this doesn't work for binary expressions size_t len = 0; diff --git a/x64.c b/x64.c @@ -0,0 +1,62 @@ +#include <stddef.h> +#include <stdint.h> +#include <string.h> +#include "x64.h" + +char abi_arg[] = {RAX, RDI, RSI, RDX, R10, R8, R9}; + +size_t +add_r_imm(char *buf, enum reg reg, uint64_t imm) +{ + uint8_t mov[] = {0x48, 0x81}; + uint8_t op1 = (MOD_DIRECT << 6) | reg; + if (buf) { + memcpy(buf, mov, 2); + buf += 2; + *(buf++) = op1; + *(buf++) = imm & 0xFF; + *(buf++) = (imm >> 8) & 0xFF; + *(buf++) = (imm >> 16) & 0xFF; + *(buf++) = (imm >> 24) & 0xFF; + } + + return 7; +} + +size_t +mov_r_imm(char *buf, enum reg reg, uint64_t imm) +{ + uint8_t mov[] = {0x48, 0xc7}; + uint8_t op1 = (MOD_DIRECT << 6) | reg; + if (buf) { + memcpy(buf, mov, 2); + buf += 2; + *(buf++) = op1; + *(buf++) = imm & 0xFF; + *(buf++) = (imm >> 8) & 0xFF; + *(buf++) = (imm >> 16) & 0xFF; + *(buf++) = (imm >> 24) & 0xFF; + } + + return 7; +} + +size_t +mov_r64_m64(char *buf, enum reg reg, uint64_t addr) +{ + uint8_t mov[] = {0x48, 0x8b}; + uint8_t op1 = (MOD_INDIRECT << 6) | (reg << 3) | 4; + uint8_t sib = 0x25; + if (buf) { + memcpy(buf, mov, 2); + buf += 2; + *(buf++) = op1; + *(buf++) = sib; + *(buf++) = addr & 0xFF; + *(buf++) = (addr >> 8) & 0xFF; + *(buf++) = (addr >> 16) & 0xFF; + *(buf++) = (addr >> 24) & 0xFF; + } + + return 8; +} diff --git a/x64.h b/x64.h @@ -0,0 +1,31 @@ +enum reg { + RAX, + RCX, + RDX, + RBX, + RSP, + RBP, + RSI, + RDI, + R8, + R9, + R10, + R11, + R12, + R13, + R14, + R15, +}; + +enum mod { + MOD_INDIRECT, + MOD_DISP8, + MOD_DISP32, + MOD_DIRECT +}; + +extern char abi_arg[]; + +size_t add_r_imm(char *buf, enum reg reg, uint64_t imm); +size_t mov_r_imm(char *buf, enum reg reg, uint64_t imm); +size_t mov_r64_m64(char *buf, enum reg reg, uint64_t addr);