From 2362a0037187c8c21ec3321478edc1d4a5f361b5 Mon Sep 17 00:00:00 2001 From: german Date: Sat, 28 Feb 2026 20:54:09 +0400 Subject: [PATCH] Assembly --- example.asm | 2 +- ntsys | Bin 22320 -> 27024 bytes ntsys-assembler.h | 308 ++++++++++++++++++++++++++++++++++++++++++++++ ntsys.h | 11 +- out.exe | Bin 0 -> 19 bytes 5 files changed, 313 insertions(+), 8 deletions(-) create mode 100644 ntsys-assembler.h create mode 100644 out.exe diff --git a/example.asm b/example.asm index 7f06c72..6f40e40 100644 --- a/example.asm +++ b/example.asm @@ -1,4 +1,4 @@ main: - push "Hello, world!\n" + push.string "Hello, world!\n" # Записываем строку push byte 0x00 syscall \ No newline at end of file diff --git a/ntsys b/ntsys index c4b0bb98661d99b3b73753b6d6e704fab8eff15a..803a5bc503e38fd0d0c3c652fa6348393ebf764a 100755 GIT binary patch literal 27024 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 SI}LBYdKuT4U@|a?%6|t|M)!dL diff --git a/ntsys-assembler.h b/ntsys-assembler.h new file mode 100644 index 0000000..93a89b1 --- /dev/null +++ b/ntsys-assembler.h @@ -0,0 +1,308 @@ +#if (!defined(NTSYS_ASSEMBLER_H___)) +#define NTSYS_ASSEMBLER_H___ + +#define __READ_FILE_WITH_EOF_OR_LN ((c = getc(fp)) != EOF && c != '\n' && c != '\r') +#define is_space(c) (c >= 0 && c <= 32) +#define __SPACE_SHIFT while (is_space(st[pos])) { pos ++; } +#define __NEXT_ARG {__e_byte_t isStr = 0;while (!is_space(st[save]) || isStr == 1) { if (st[save] == '"' && st[save - 1] != '\\') {isStr = !isStr;}save ++; }}while (is_space(st[save])) { save ++; }{size_t n_p = save;__e_byte_t isStr = 0;while (!is_space(st[n_p]) || isStr == 1) { if (st[n_p] == '"' && st[n_p - 1] != '\\') {isStr = !isStr;}n_p ++; }st[n_p] = '\0';} +#define get_mem_pos() *mem_pos = ftell(fp) == 0 ? 0 : ftell(fp) - 1; + +static char* get_str(char* ptr, FILE* fp) { + if (ptr != NULL) { + free(ptr); + } + unsigned long len = 0; + int c; + { + unsigned long save_ptr = ftell(fp); + while (__READ_FILE_WITH_EOF_OR_LN) { + len ++; + } + fseek(fp, save_ptr, SEEK_SET); + } + if (len == 0) return NULL; + ptr = malloc(len); + if (ptr == NULL) { + ntsys_error("Out of memory!"); + return NULL; + } + len = 0; + while (__READ_FILE_WITH_EOF_OR_LN) { + ptr[len] = c; + len ++; + } + return ptr; +} + +/* + * XX - шестнадцатиричное число + * :S - тип данных + * :D - сами данные + * :O - метка перехода + * + * ------------------ Формат ------------------- + * + * имя_комманды=описание + * + */ + +char __fun_names_ntsys[][20] = { + "push=00:S:D", + "pop=01:S", + "push.string=02:D" +}; + +static size_t __index_of(char* arr, char c) { + size_t i = 0; + while (i < strlen(arr)) { + if (arr[i] == c) break; + i ++; + } + return i; +} + +word_t* shfdiyde_labels = NULL; +char** shdgsjgdsjjgds_names = NULL; +size_t sfdfshgshgfs_lb_pos = 0; +#define labels_names shdgsjgdsjjgds_names +#define labels shfdiyde_labels +#define lb_pos sfdfshgshgfs_lb_pos + +int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { + if (st == NULL) { + ntsys_error("Null Pointer Exception!"); + return EXIT_FAILURE; + } + size_t len = strlen(st); + size_t pos = 0; + __e_byte_t isStr = 0; + while (pos < len) { + size_t sP = pos; + if (pos == 0) sP = 1; + if (st[pos] == '"' && st[sP - 1] != '\\') { + isStr = !isStr; + } + if (st[pos] == '#' && isStr == 0) { + st[pos] = '\0'; + break; + } + pos ++; + } + if (isStr == 1) { + ntsys_error("Find no close string!"); + return EXIT_FAILURE; + } + isStr = 0; + len = strlen(st); + pos = 0; + { + __SPACE_SHIFT; + size_t save = pos; + while (!is_space(st[pos])) { pos ++; } + st[pos] = '\0'; + size_t arr_len = sizeof(__fun_names_ntsys) / sizeof(__fun_names_ntsys[0]); + size_t i = 0; + while (i < arr_len) { + char eq[20]; + strcpy(eq, __fun_names_ntsys[i]); + size_t par_pos = 0; + { + size_t u = 0; + size_t d = strlen(__fun_names_ntsys[i]); + while (u < d) { + eq[u] = __fun_names_ntsys[i][u]; + if (eq[u] == '=') { + eq[u] = '\0'; + par_pos = u + 1; + break; + } + u ++; + } + } + char* h = (st + save); + if (h[strlen(st + save)] == ':') { + get_mem_pos(); + h[strlen(h - 1)] = '\0'; + labels_names[lb_pos] = h; + labels[lb_pos++] = ((word_t)*mem_pos + 1); + break; + }; + if (strcmp((st + save), eq) == 0) { + size_t d = strlen(__fun_names_ntsys[i] + par_pos); + size_t p = 0; + puts(st + save); + __e_byte_t data_type = 1; + while (p < d) { + char* str = &__fun_names_ntsys[i][par_pos]; + if (str[p] == ':') { + p ++; + switch (str[p]) { + case 'D': + { + __NEXT_ARG; + __e_byte_t sys_cnt = 10; + __e_byte_t is_str = 0; + if (st[save] == '"') { + is_str = 1; + size_t f = 0; + save ++; + while (1) { + if (st[save + f] == '"' && st[save + f - 1] != '\\') { + putc('\0', fp); + break; + } + if (st[save + f] == '\\' && st[save + f - 1] != '\\') { f ++; continue; } + if (st[save + f - 1] == '\\') { + switch (st[save + f]) { + case '0': + putc('\0', fp); break; + case 'a': + putc('\a', fp); break; + case 'b': + putc('\b', fp); break; + case 't': + putc('\t', fp); break; + case 'n': + putc('\n', fp); break; + case 'v': + putc('\v', fp); break; + case 'f': + putc('\f', fp); break; + case 'r': + putc('\r', fp); break; + case '\\': + putc('\\', fp); break; + default: + ntsys_error("Unknown ident!"); + return EXIT_FAILURE; + } + } else { + putc(st[save + f], fp); + } + f ++; + } + } else if (st[save + 1] == 'x') { + sys_cnt = 16; + } else if (st[save + 1] == 'b') { + sys_cnt = 2; + } + if (is_str == 0) { + if (sys_cnt != 10) { + save += 2; + } + char* arr = NULL; + long cnt = strtol(&st[save], &arr, sys_cnt); + switch (data_type) { + case 0x01: fwrite((__e_byte_t*)((byte_t*)&cnt), 1, sizeof(byte_t), fp); + break; + case 0x02: fwrite((__e_byte_t*)((word_t*)&cnt), 1, sizeof(word_t), fp); + break; + case 0x04: fwrite((__e_byte_t*)((dword_t*)&cnt), 1, sizeof(dword_t), fp); + break; + case 0x08: fwrite((__e_byte_t*)((qword_t*)&cnt), 1, sizeof(qword_t), fp); + break; + case 0xF1: fwrite((__e_byte_t*)((sbyte_t*)&cnt), 1, sizeof(sbyte_t), fp); + break; + case 0xF2: fwrite((__e_byte_t*)((sword_t*)&cnt), 1, sizeof(sword_t), fp); + break; + case 0xF4: fwrite((__e_byte_t*)((sdword_t*)&cnt), 1, sizeof(sdword_t), fp); + break; + case 0xF8: fwrite((__e_byte_t*)((sqword_t*)&cnt), 1, sizeof(sqword_t), fp); + break; + } + } + } + break; + case 'S': + { + __NEXT_ARG; + if (strcmp(&st[save], "byte") == 0) { + data_type = 0x01; + } else if (strcmp(&st[save], "word") == 0) { + data_type = 0x02; + } else if (strcmp(&st[save], "dword") == 0) { + data_type = 0x04; + } else if (strcmp(&st[save], "qword") == 0) { + data_type = 0x08; + } else if (strcmp(&st[save], "sbyte") == 0) { + data_type = 0xF1; + } else if (strcmp(&st[save], "sword") == 0) { + data_type = 0xF2; + } else if (strcmp(&st[save], "sdword") == 0) { + data_type = 0xF4; + } else if (strcmp(&st[save], "sqword") == 0) { + data_type = 0xF8; + } else { + ntsys_error("Incorrect datatype!"); + return EXIT_FAILURE; + } + fwrite((__e_byte_t*)&data_type, 1, sizeof(__e_byte_t), fp); + } + break; + case 'O': + { + + } + break; + } + } else { + char* hx = "0123456789ABCDEF"; + __e_byte_t hex = (__index_of(hx, str[p + 1])) | (__index_of(hx, str[p]) << 4); + fputc(hex, fp); + p ++; + } + p ++; + } + break; + } + i ++; + } + } + get_mem_pos(); + printf("Memory position: %zu\n", *mem_pos); + return EXIT_SUCCESS; +} + +int ntsys_compile_asm(char* filename, char* asm_out) { + FILE* fp = fopen(filename, "r"); + if (fp == NULL) { + ntsys_error("Cannot open assembler file!"); + return EXIT_FAILURE; + } + FILE* fw = fopen(asm_out, "wb"); + if (fw == NULL) { + ntsys_error("Cannot create or rewrite output file!"); + fclose(fp); + return EXIT_FAILURE; + } + char* st = NULL; + size_t mem_pos = 0; + size_t lb_size = 1; + int c; + while ((c = getc(fp)) != EOF) { + if (c == ':') { + lb_size ++; + } + } + rewind(fp); + labels = malloc(sizeof(word_t) * lb_size); + labels_names = (char**)malloc(sizeof(char*) * lb_size); + while ((st = get_str(st, fp)) != NULL) { + if (ntsys_asm_from_string(&mem_pos, st, fw) != EXIT_SUCCESS) return EXIT_FAILURE; + } + free(st); + fclose(fp); + fclose(fw); + return EXIT_SUCCESS; +} + +#undef __READ_FILE_WITH_EOF_OR_LN +#undef __SPACE_SHIFTsize_t lb_size = 1; +#undef is_space +#undef __NEXT_ARG +#undef get_mem_pos +#undef labels +#undef labels_names +#undef lb_pos + +#endif /* NTSYS_ASSEMBLER_H___ */ \ No newline at end of file diff --git a/ntsys.h b/ntsys.h index 5ed74c2..89303d2 100644 --- a/ntsys.h +++ b/ntsys.h @@ -58,12 +58,13 @@ unsigned int __ntsys_buffer_ptr = 0; int fGH6VSEzu7qNiGVE_stat = EXIT_SUCCESS; -#include "ntfiles.h" - -static void ntsys_error(char* _err) { +void ntsys_error(char* _err) { printf("\033[1mntsys: \033[91m%s\033[0m\n", _err); } +#include "ntfiles.h" +#include "ntsys-assembler.h" + static void __help(void) { puts ( "BINARY Emulator - LICENSE GPL V3" "\n" @@ -193,10 +194,6 @@ int ntsys_api_call(char* filename, unsigned char debug) { return stat; } -int ntsys_compile_asm(char* in_file, char* out_file) { - return EXIT_SUCCESS; -} - int _lib_ntsys_main(int argc, char** argv) { unsigned int t = 1; char* filename = NULL; diff --git a/out.exe b/out.exe new file mode 100644 index 0000000000000000000000000000000000000000..e89f83d4d145088b7fdd1e110a441ca751366ded GIT binary patch literal 19 acmZSbNX^N~*HI|XFUm<#p+YXp}7 literal 0 HcmV?d00001