From bd8f8893d6a6b1185b4659f9fd3270c95a6e33a3 Mon Sep 17 00:00:00 2001 From: german Date: Fri, 6 Mar 2026 19:33:31 +0400 Subject: [PATCH] Assembly write (no table) --- .vscode/launch.json | 1 + asm-savers.h | 73 ++++++++++++++++++++++++++++++++++++-------- example.asm | 11 ++++--- ntsys | Bin 27160 -> 27336 bytes ntsys-assembler.h | 66 +++++++++++++++++++++++++++++++++------ out.exe | Bin 7 -> 7 bytes 6 files changed, 125 insertions(+), 26 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index a8d54f5..946ca46 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,7 @@ // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { "name": "Запустить", "type": "cppdbg", diff --git a/asm-savers.h b/asm-savers.h index 901cc1b..d7a71bf 100644 --- a/asm-savers.h +++ b/asm-savers.h @@ -3,7 +3,7 @@ #define ntsys_exit_if_error(parser) if (!ntsys_asm_arg_new((parser)->string, (parser)->cache)) #define ntsys_run_asm_parser(ss) __ntsys_arg_function_loader(&(ss)) -#define create_ntsys_asm_parser(cache, fp, str, table, table_size, labels) ((ntsys_argument_parser_t){(cache), (fp), (str), (table), (table_size), (labels), NULL, 0, 0}) +#define create_ntsys_asm_parser(cache, fp, str, table, table_size, labels, labels_pos, labels_count, cyc) ((ntsys_argument_parser_t){(cache), (fp), (str), (table), (table_size), (labels), (labels_pos), (labels_count), (cyc)}) #define create_ntsys_asm_save(ss) ((ntsys_asm_save_t){(ss), (ss)}) #define create_ntsys_asm_cache(ss) ((ntsys_asm_cache_t)&(ss)) #define ntsys_asm_arg_new(str, __cache) ((ntsys_get_arg((__cache))) && ((str) = __cache->string)) @@ -32,7 +32,7 @@ char* ntsys_get_str(char* ptr, FILE* fp) { fseek(fp, save_ptr, SEEK_SET); } if (len == 0) return NULL; - ptr = malloc(len); + ptr = malloc(len + 1); if (ptr == NULL) { ntsys_error("Out of memory!"); return NULL; @@ -43,6 +43,13 @@ char* ntsys_get_str(char* ptr, FILE* fp) { len ++; } ptr[len] = '\0'; + size_t i = 0; + __e_byte_t isStr = 0; + while (i < strlen(ptr)) { + if (ptr[i] == '"' && ptr[((i == 0) ? 1 : i) - 1] != '\\') {isStr = !isStr;} + if ((ptr[i] == ';' || ptr[i] == '#') && isStr == 0) ptr[i] = '\0'; + i ++; + } return ptr; } @@ -76,7 +83,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { size_t n_p = 0; __e_byte_t isStr = 0; while (1) { - if (str[n_p] == '"' && str[((n_p == 0) ? 1 : 0) - 1] != '\\') {isStr = !isStr;} + if (str[n_p] == '"' && str[((n_p == 0) ? 1 : n_p) - 1] != '\\') {isStr = !isStr;} if ((is_space(str[n_p]) && isStr == 0) || str[n_p] == '\0') { break; } @@ -85,6 +92,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { save->cache = &str[n_p + 1]; str[n_p] = '\0'; } + if (str[strlen(str) - 1] == '\n' || str[strlen(str) - 1] == '\r') str[strlen(str) - 1] = '\0'; if (strlen(str) == 0) { str = NULL; save->string = NULL; @@ -137,7 +145,7 @@ typedef struct { size_t table_length; char** labels; word_t* labels_positions; - size_t labels_count; + size_t* labels_count; byte_t is_rewrite; } ntsys_argument_parser_t; @@ -165,12 +173,12 @@ static void __input_datatype(ntsys_argument_parser_t* parser, byte_t* mode) { } else if (strcmp(str, "sqword") == 0) { data_type = 0xF8; } else if (strcmp(str, "db") == 0) { - data_type = 0xBC; + data_type = 0xB2; } else { ntsys_error("Incorrect datatype!"); return; } - if (data_type == 0xBC) fputc((__e_byte_t)0x02, parser->fp); + if (data_type == 0xB2) fputc((__e_byte_t)0x02, parser->fp); else fputc((__e_byte_t)data_type, parser->fp); *mode = data_type; } @@ -182,13 +190,25 @@ static void __write_label(ntsys_argument_parser_t* parser) { return; } size_t i = 0; - while (i < parser->labels_count) { + /* printf("Count: 0x%04lX\n", *(parser->labels_count)); */ + while (i < *(parser->labels_count)) { + /* printf("Label: \"%s\" to \"%s\"\n", parser->string, parser->labels[i]); */ if (strcmp(parser->string, parser->labels[i]) == 0) { - fwrite(&(parser->labels_positions[i]), 1, sizeof(word_t), parser->fp); + word_t cnt = parser->labels_positions[i]; + int __i = 1; + if (!(*((char *)&__i) == 1)) { + /* BIG ENDIAN */ + byte_t* ar = (byte_t*)&cnt; + byte_t s = ar[0]; + ar[0] = ar[1]; + ar[1] = s; + } + fwrite(&cnt, 1, sizeof(word_t), parser->fp); return; } i ++; } + } static void __input_data(ntsys_argument_parser_t* parser, byte_t* mode) { @@ -213,6 +233,20 @@ static void __input_data(ntsys_argument_parser_t* parser, byte_t* mode) { } long cnt = strtol(str, NULL, count_system); FILE* fp = parser->fp; + int __i = 1; + if (!(*((char *)&__i) == 1)) { + /* BIG ENDIAN */ + if ((data_type & 0x0F) != 0x01) { + size_t i = 0; + byte_t* ar = (byte_t*)&cnt; + while (i < (data_type & 0x0F)) { + byte_t s = ar[i]; + ar[i] = ar[(data_type & 0x0F) - i - 1]; + ar[(data_type & 0x0F) - i - 1] = s; + i ++; + } + } + } switch (data_type) { case 0x01: fwrite((__e_byte_t*)((byte_t*)&cnt), 1, sizeof(byte_t), fp); break; @@ -232,7 +266,7 @@ static void __input_data(ntsys_argument_parser_t* parser, byte_t* mode) { break; } } else { - if (data_type != 0xBC) { + if (data_type != 0xB2) { ntsys_error("Incorrect datatype! For jump to label please use db type!"); return; } @@ -251,17 +285,32 @@ static int __arg_writer(char* str, ntsys_argument_parser_t* parser, byte_t* mode } else { byte_t x = strtol(str, NULL, 16); fputc((char)x, parser->fp); + /* printf("Input: 0x%04X\n", x); */ } return EXIT_SUCCESS; } +int __load_label(ntsys_argument_parser_t* parser) { + char* str = parser->string; + str[strlen(str) - 1] = '\0'; + parser->labels[*(parser->labels_count)] = malloc(strlen(str) + 1); + if (parser->labels[*(parser->labels_count)] == NULL) { + ntsys_error("Out of memory!"); + return EXIT_FAILURE; + } + strcpy(parser->labels[*(parser->labels_count)], str); + parser->labels_positions[*(parser->labels_count)] = (word_t)(ftell(parser->fp)); + /* printf("Label: \"%s\" on 0x%08X\n", str, parser->labels_positions[*(parser->labels_count)]); */ + *parser->labels_count += 1; + return EXIT_SUCCESS; +} + static int select_argument(ntsys_argument_parser_t* parser) { size_t i = 0; byte_t internal = 0x00; char* str = parser->string; - if (str[strlen(str) - 1] == ':' && !parser->is_rewrite) { - /* TODO: Добавить метки */ - return EXIT_SUCCESS; + if (str[strlen(str) - 1] == ':' && parser->is_rewrite == 0) { + return __load_label(parser); } char buf[64]; char** table = parser->table; diff --git a/example.asm b/example.asm index c80d446..654a0c5 100644 --- a/example.asm +++ b/example.asm @@ -1,6 +1,7 @@ -main: +main: ; Метка main push.string "Hello, world!\n" ; Записываем строку - push byte 0x00 - syscall - push db main - jmp \ No newline at end of file + push byte 0x00 ; Запись номера SYSCALL + syscall ; Системный вызов +load: ; Цикл, здесь программа "зависнет" + push db load ; Адрес как db + jmp ; Выполняем \ No newline at end of file diff --git a/ntsys b/ntsys index 40fcbbfcce6eff646fc472476d41aa6322b00505..69edfffc59640db975d97e6f0691300fb4647b40 100755 GIT binary patch literal 27336 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 E8<4`5A^-pY diff --git a/ntsys-assembler.h b/ntsys-assembler.h index e7ea542..e464661 100644 --- a/ntsys-assembler.h +++ b/ntsys-assembler.h @@ -17,11 +17,10 @@ char* ntsys_asm_table[] = { "push=00:T:D" }; -int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp) { - ntsys_labels_array_t labels = NULL; +int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp, byte_t cycle, ntsys_labels_array_t labels, word_t* labels_pos, size_t* labels_count) { ntsys_asm_save_t __save = create_ntsys_asm_save(str); ntsys_asm_cache_t __cache = create_ntsys_asm_cache(__save); - ntsys_argument_parser_t parser = create_ntsys_asm_parser(__cache, fp, str, ntsys_asm_table, ntsys_command_count, labels); + ntsys_argument_parser_t parser = create_ntsys_asm_parser(__cache, fp, str, ntsys_asm_table, ntsys_command_count, labels, labels_pos, labels_count, cycle); return ntsys_run_asm_parser(parser); } @@ -32,32 +31,81 @@ int ntsys_compile_asm(char* filename, char* asm_out) { return EXIT_FAILURE; } FILE* fw = fopen(asm_out, "wb"); - if (fw == NULL) { + FILE* tmp = tmpfile(); + if (fw == NULL || tmp == 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 == ':') { + size_t lb_size = 0; + while ((st = ntsys_get_str(st, fp)) != NULL) { + char* cp = st; + ntsys_asm_save_t __save = create_ntsys_asm_save(cp); + ntsys_asm_cache_t sv = create_ntsys_asm_cache(__save); + char* str = ntsys_get_arg(sv); + if (str[strlen(str) - 1] == ':') { lb_size ++; } } + free(st); + char** labels = malloc(sizeof(char*) * lb_size); + word_t* labels_pos = malloc(sizeof(word_t) * lb_size); + size_t u = 0; + while (u < lb_size) { + labels[u] = NULL; + u ++; + } rewind(fp); + FILE* ff = tmp; + size_t labels_count = 0; while ((st = ntsys_get_str(st, fp)) != NULL) { - if (ntsys_asm_from_string(&mem_pos, st, fw) != EXIT_SUCCESS) { + if (ntsys_asm_from_string(&mem_pos, st, tmp, 0, labels, labels_pos, &labels_count) != EXIT_SUCCESS) { free(st); fclose(fp); + fclose(tmp); fclose(fw); + size_t i = 0; + while (i < lb_size) { + if (labels[i] != NULL) free(labels[i]); + i ++; + } + free(labels); + free(labels_pos); return EXIT_FAILURE; } } + ff = fw; + free(st); + rewind(fp); + while ((st = ntsys_get_str(st, fp)) != NULL) { + if (ntsys_asm_from_string(&mem_pos, st, ff, 1, labels, labels_pos, &labels_count) != EXIT_SUCCESS) { + free(st); + fclose(fp); + fclose(tmp); + fclose(fw); + size_t i = 0; + while (i < lb_size) { + if (labels[i] != NULL) free(labels[i]); + i ++; + } + free(labels); + free(labels_pos); + return EXIT_FAILURE; + } + } + fclose(tmp); free(st); fclose(fp); fclose(fw); + size_t i = 0; + while (i < lb_size) { + if (labels[i] != NULL) free(labels[i]); + i ++; + } + free(labels); + free(labels_pos); return EXIT_SUCCESS; } diff --git a/out.exe b/out.exe index b5bde7bbdf887e0168f37cdcb0cb787da7c3ec59..4fed40a49e5bfc87abae208c21251f4acab7a6e1 100644 GIT binary patch literal 7 OcmZQzWME)oW&i*H82|?W literal 7 OcmZQzWME)&bprqZ;{cBU