From b7814401c8a9941fdc616f576b4a331b4caa3750 Mon Sep 17 00:00:00 2001 From: SpookyDervish <78246495+SpookyDervish@users.noreply.github.com> Date: Sun, 21 Dec 2025 16:26:26 +1100 Subject: [PATCH] i hate my life --- README.md | 2 +- fib.sasm | 9 ++++----- sasm | Bin 17208 -> 16848 bytes src/asm/assembler.c | 27 ++++++++++++++++----------- src/asm/assembler.h | 8 ++++++-- src/asm/instructions.c | 12 ++++++++++++ src/asm/instructions.h | 25 +++++++++++++++++++++---- src/asm/sasm.c | 10 ++++++---- src/asm/tokenize.c | 3 +++ src/asm/tokenize.h | 1 + 10 files changed, 70 insertions(+), 27 deletions(-) create mode 100644 src/asm/instructions.c diff --git a/README.md b/README.md index 0764826..c83c8c8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ But uhh that's the name of the VM itself, the name of the programming language I made is Sylt, named after the German island. To compile the VM for Linux: `gcc src/main.c src/vmbl.c src/exception.c src/file_utils.c -o vmbl -O3` -To compile SASM for Linux: `gcc src/asm/sasm.c src/asm/tokenize.c src/file_utils.c src/asm/assembler.c -o sasm -O3` +To compile SASM for Linux: `gcc src/asm/sasm.c src/asm/instructions.c src/file_utils.c src/asm/assembler.c -o sasm -O3` ## Syntax ### Example "Hello, World!" Program diff --git a/fib.sasm b/fib.sasm index e2f3af6..93b43e2 100644 --- a/fib.sasm +++ b/fib.sasm @@ -1,6 +1,5 @@ -push 0 -push 1 -dup 1 -dup 1 +push 10 +push 9 add -jump 2 \ No newline at end of file +halt +add \ No newline at end of file diff --git a/sasm b/sasm index 8a90e9f347f28b39cab5278b17b8fc0a7063c950..6426bcd1ecf8db8b4fca46fcaca7ccb67e62768e 100644 GIT binary patch delta 3936 zcmai1eQZNKI)~QUyjgwOv5`0TC-{rOiE0d!9UMZL#QLi)GK4&-%Vem)u^tD_g4<7_^nqi!S1AdFI_U9EFry`YqkyK zT=VB`@UA!qCX(F33b>i%GM+;NFLEhRW^fCyL9M|r#HmKutm(hwdf_=L?=>0VPEsmJ zMz>I(ozlT$Ulft+CS;GTVW zTuJ04lVcgwUL~Jm4QB8{%5OU}7RMGkvGIF2sFop7a(KLCNaRY5{ zAC6koaYq*VC1ivl+P|vVmu!M-DRab<0-E?jxw?n&wuj~)X+S)`5b*nWkY;B01Uct(!jQytrmqYyYBxJwnu%y27W zO<$W(lenQ=e*nRZIVptpDL>=b{vK_hZTAD{$nbO@u@Z8MjujYIh92muFruDNcd^B1 zjWLbqB`1EsnVWIu%HK5evx-y0i@3hWan(6@GyuV9(of;<~brnqpwB#Ff?b z&HdO~M+l3on#4D9e8j6nnb!~RtLoY6ahw?m;DoQsXR8$|AWks6M^UNPJD}Ux2dmeH z){KyWtl3{02Kud0!(ML?hP`Gu#3eBYOe`~wB44v3;A^o=?Id{Q28JqKQj{B%@dr{oD!>~K4Pb6*> zBdBxZe&kY}HqUi-nmYOT^q{T)bz7-!sa@JFhV1SgNwVD=H;6CU-66YFWj7D($^C;F z4>T@#_?vf>y2^amN0)b;i&j^ihv&glqf9fX$I&8p4#J34wJRO9V7(N2YAX1P@ zj|cA6+UcYoY6Gsxtxv`<-8ASi(NvcRdRVvL#suoEpa`O zf+^q>J!HDiEadg|mxFVG%UOqVvWTxoel4&O)7lQzWjWAZRskQB|aGfwPw8$$6 zxo~N5r8q7?MupGGGoE8Qtg7%kc@}cahyBR%+~wE^myqRo&T$w#OZ-lL8*mK6swLg# z32poFV((qzf*+PREs|4bByd)iy1h)|I6l?<*Oks>8edvr_$LD#sPtKR)E`fW^OZ}5 zOz;H#PM%~O*TAZvKe;Dccfj$u00)9T3;*{LhI7GE3;)Yf56)1jg=cXi)P_nYFTb!~ zcXR^whdPpZbVx-yYbG#Ol?CNh4Pw0!4pc3$yj`MeUVuwgrPf>Y-GC)SfU!lH{{aw? B`=1Fzi%5r*hS@X^!#W~R0O?0$`) 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 +#include +#include -void assemble(Tokenizer *tokenizer) { - Token token = getCurrentToken(tokenizer); - while (token.type != TOKEN_EOF) +VMBL_Instruction assembleLine(char *line) { + char *instName = strtok(line, " "); + printf("%s\n", instName); +} + +void assemble(char *sourceCode, VMBL_Instruction program[], size_t programCapacity) { + char *line = strtok(sourceCode, "\n"); + + int i = 0; + while (line != NULL) { - //printf("%s: %s - line %d\n", tokenTypeAsCStr(token.type), token.value, token.line); - - - //free(token.value); - token = getCurrentToken(tokenizer); - - + program[i++] = assembleLine(line); + line = strtok(NULL, "\n"); } - free(token.value); + } \ No newline at end of file diff --git a/src/asm/assembler.h b/src/asm/assembler.h index 8c0b172..9c2e2ae 100644 --- a/src/asm/assembler.h +++ b/src/asm/assembler.h @@ -1,8 +1,12 @@ #ifndef ASSEMBLER_H #define ASSEMBLER_H -#include "tokenize.h" +#include +#include "../vmbl.h" + + +VMBL_Instruction assembleLine(char *line); +void assemble(char *sourceCode, VMBL_Instruction program[], size_t programCapacity); -void assemble(Tokenizer *tokenizer); #endif // !ASSEMBLER_H diff --git a/src/asm/instructions.c b/src/asm/instructions.c new file mode 100644 index 0000000..6e9f708 --- /dev/null +++ b/src/asm/instructions.c @@ -0,0 +1,12 @@ +#include "instructions.h" +#include + +InstructionType instructionNameToType(char* instName) { + for (size_t i = 0; i < sizeof(instruction_table)/sizeof(instruction_table[0]); i++) { + + if (strcmp(instName, instruction_table[i].mnemonic) == 0) { + return (InstructionType)i; + } + + } +} \ No newline at end of file diff --git a/src/asm/instructions.h b/src/asm/instructions.h index b3f3729..4d40d3c 100644 --- a/src/asm/instructions.h +++ b/src/asm/instructions.h @@ -1,18 +1,35 @@ #ifndef INSTRUCTIONS_H #define INSTRUCTIONS_H +#include "../vmbl.h" + #define MAX_ARGS 3 typedef enum { + ARG_TYPE_NONE, ARG_TYPE_INT } ArgType; typedef struct { - char *mnemonic, - uint8_t argCount, - ArgType args[MAX_ARGS] + char *mnemonic; + uint8_t argCount; + ArgType args[MAX_ARGS]; } InstructionInfo; -#endif // !INSTRUCTIONS_H +static const InstructionInfo instruction_table[] = { + [INSTRUCTION_NOP] = { "nop", 0, { ARG_TYPE_NONE } }, + [INSTRUCTION_PUSH] = { "push", 1, { ARG_TYPE_INT } }, + [INSTRUCTION_DROP] = { "drop", 1, { ARG_TYPE_INT } }, + [INSTRUCTION_ADD] = { "add", 0, { ARG_TYPE_NONE } }, + [INSTRUCTION_SUB] = { "sub", 0, { ARG_TYPE_NONE } }, + [INSTRUCTION_MUL] = { "mul", 0, { ARG_TYPE_NONE } }, + [INSTRUCTION_DIV] = { "div", 0, { ARG_TYPE_NONE } }, + [INSTRUCTION_DUPLICATE] = { "dup", 1, { ARG_TYPE_INT } }, + [INSTRUCTION_HALT] = { "halt", 0, { ARG_TYPE_NONE } }, +}; + +InstructionType instructionNameToType(char* instName); + +#endif // !INSTRUCTIONS_H \ No newline at end of file diff --git a/src/asm/sasm.c b/src/asm/sasm.c index 6d72405..acc9d00 100644 --- a/src/asm/sasm.c +++ b/src/asm/sasm.c @@ -1,8 +1,8 @@ #include #include -#include "tokenize.h" #include "../file_utils.h" #include "assembler.h" +#include "../vmbl.h" int main(int argc, char *argv[]) { if (argc < 3) { @@ -13,14 +13,16 @@ int main(int argc, char *argv[]) { char *buffer = readStringFromFile(argv[1]); //printf("%s\n", buffer); - Tokenizer tokenizer = { + /*Tokenizer tokenizer = { .source = buffer, .column = 1, .line = 1, .pos = 0 - }; + };*/ - assemble(&tokenizer); + VMBL_Instruction program[VMBL_PROGRAM_SIZE]; + + assemble(buffer, program, VMBL_PROGRAM_SIZE); free(buffer); return 0; diff --git a/src/asm/tokenize.c b/src/asm/tokenize.c index 27040ce..aff5a13 100644 --- a/src/asm/tokenize.c +++ b/src/asm/tokenize.c @@ -125,6 +125,8 @@ Token getCurrentToken(Tokenizer *tokenizer) { default: if (isalpha(*tokenizer->source)) { + token.columnStart = tokenizer->column; + char *tokenValue = parseName(tokenizer); token.value = tokenValue; @@ -140,6 +142,7 @@ Token getCurrentToken(Tokenizer *tokenizer) { } } else if (isdigit(*tokenizer->source)) { + token.columnStart = token.columnStart; char *tokenValue = parseNumber(tokenizer); token.value = tokenValue; diff --git a/src/asm/tokenize.h b/src/asm/tokenize.h index 1b88c85..9c7063c 100644 --- a/src/asm/tokenize.h +++ b/src/asm/tokenize.h @@ -35,6 +35,7 @@ typedef struct TokenType type; char* value; unsigned int line; + unsigned int columnStart; } Token; typedef struct