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:
M | main.c | | | 87 | ++----------------------------------------------------------------------------- |
A | x64.c | | | 62 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | x64.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);