From baf232458814286e403e72b97f16353211bca37f Mon Sep 17 00:00:00 2001 From: german Date: Fri, 6 Mar 2026 21:10:46 +0400 Subject: [PATCH] The assembler compiler is implemented --- asm-savers.h | 41 ++++++++++++++++++++++++++++++++++++----- example.asm | 5 +---- ntsys | Bin 27336 -> 39872 bytes ntsys-assembler.h | 16 +++++++++++----- ntsys.h | 13 ++++++++++++- out.exe | Bin 25 -> 28 bytes 6 files changed, 60 insertions(+), 15 deletions(-) diff --git a/asm-savers.h b/asm-savers.h index 62e5d1f..64b8a0a 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, 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_parser(cache, fp, str, table, table_size, labels, labels_pos, labels_count, cyc, f_sz) ((ntsys_argument_parser_t){(cache), (fp), (str), (table), (table_size), (labels), (labels_pos), (labels_count), (cyc), (f_sz), NULL}) #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)) @@ -147,6 +147,8 @@ typedef struct { word_t* labels_positions; size_t* labels_count; byte_t is_rewrite; + dword_t* file_size; + word_t* memory_size; } ntsys_argument_parser_t; static void __input_datatype(ntsys_argument_parser_t* parser, byte_t* mode) { @@ -355,16 +357,45 @@ static int select_argument(ntsys_argument_parser_t* parser) { } i ++; } - ntsys_error("Undefined operator!"); - /* WARNING! Обязательно заменить на EXIT_FAILURE! EXIT_SUCCESS нужен для отладки! */ - puts(str); - return EXIT_SUCCESS; + printf("\033[1mntsys: \033[91mUndefined operator \"%s\"!\033[0m\n", str); + return EXIT_FAILURE; +} + +byte_t fGH6VSEzu7qNiGVE_hd_ew = 0; + +static void __write_header(ntsys_argument_parser_t* parser) { + if (fGH6VSEzu7qNiGVE_hd_ew == 1) return; + fGH6VSEzu7qNiGVE_hd_ew = 1; + fputc(0x4D, parser->fp); + fputc(0x5A, parser->fp); + parser->memory_size = &fGH6VSEzu7qNiGVE_mem_size; + *parser->file_size += 8; + int __i = 1; + if (!(*((char *)&__i) == 1)) { + /* BIG ENDIAN */ + size_t i = 0; + byte_t* ar = (byte_t*)parser->file_size; + while (i < (sizeof(dword_t))) { + byte_t s = ar[i]; + ar[i] = ar[(sizeof(dword_t)) - i - 1]; + ar[(sizeof(dword_t)) - i - 1] = s; + i ++; + } + ar = (byte_t*)parser->memory_size; + byte_t s = ar[0]; + ar[0] = ar[1]; + ar[1] = s; + } + fwrite(parser->file_size, 1, sizeof(dword_t), parser->fp); + fwrite(parser->memory_size, 1, sizeof(word_t), parser->fp); } int __ntsys_arg_function_loader(ntsys_argument_parser_t* parser) { + if (parser->is_rewrite) __write_header(parser); while (ntsys_asm_arg_new(parser->string, parser->cache)) { if (select_argument(parser) == EXIT_FAILURE) return EXIT_FAILURE; } + if (parser->is_rewrite == 0) *parser->file_size = ftell(parser->fp) + 1; return EXIT_SUCCESS; } diff --git a/example.asm b/example.asm index 654a0c5..cba1995 100644 --- a/example.asm +++ b/example.asm @@ -1,7 +1,4 @@ main: ; Метка main push.string "Hello, world!\n" ; Записываем строку push byte 0x00 ; Запись номера SYSCALL - syscall ; Системный вызов -load: ; Цикл, здесь программа "зависнет" - push db load ; Адрес как db - jmp ; Выполняем \ No newline at end of file + syscall ; Системный вызов \ No newline at end of file diff --git a/ntsys b/ntsys index 40f64f99030c80b33cf84f2638b859ed9846e0ab..0a028893a613ee1efb4c8dd68deabbc5e11d36f7 100755 GIT binary patch literal 39872 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 |#D++&>I{ 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