diff --git a/.vscode/launch.json b/.vscode/launch.json index 655f330..a8d54f5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,5 +3,31 @@ // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов. // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", - "configurations": [] + "configurations": [ + { + "name": "Запустить", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/ntsys", + "args": ["--asm", "${workspaceFolder}/example.asm"], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": true, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Включить автоматическое форматирование для gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Задать для варианта приложения дизассемблирования значение Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + } + + ] } \ No newline at end of file diff --git a/.vscode/out.exe b/.vscode/out.exe new file mode 100644 index 0000000..e69de29 diff --git a/asm-savers.h b/asm-savers.h index 1c3c17b..eb7fc80 100644 --- a/asm-savers.h +++ b/asm-savers.h @@ -1,7 +1,8 @@ #if (!defined(NTSYS__S_ASSEMBLER_H___)) #define NTSYS__S_ASSEMBLER_H___ -#define create_ntsys_asm_parser(cache, fp, str, table) ((ntsys_argument_parser_t){(cache), (fp), (str), (table)}) +#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), (labels)}) #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)) @@ -83,7 +84,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { save->cache = &str[n_p + 1]; str[n_p] = '\0'; } - if (strlen(str) == 1 || strlen(str) == 0) { + if (strlen(str) == 0) { str = NULL; save->string = NULL; return NULL; @@ -126,17 +127,76 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { return str; } +typedef char** ntsys_labels_array_t; typedef struct { ntsys_asm_cache_t cache; FILE* fp; char* string; char** table; + size_t table_length; + char** labels; } ntsys_argument_parser_t; -int ntsys_run_asm_parser(ntsys_argument_parser_t parser) { - char* str = parser.string; - while (ntsys_asm_arg_new(str, parser.cache)) { - puts(str); +static void __input_datatype(ntsys_argument_parser_t* parser, byte_t* mode) { + +} + +static void __input_data(ntsys_argument_parser_t* parser, byte_t* mode) { + +} + +static int __arg_writer(char* str, ntsys_argument_parser_t* parser, byte_t mode) { + if (str[0] == ':') { + if (str[1] == 'T') { + __input_datatype(parser, &mode); + } else if (str[1] == 'D') { + __input_data(parser, &mode); + } + } else { + byte_t x = strtol(str, NULL, 16); + fputc((char)x, parser->fp); + } + return EXIT_SUCCESS; +} + +static int select_argument(char* str, ntsys_argument_parser_t* parser) { + size_t i = 0; + char buf[64]; + char** table = parser->table; + while (i < parser->table_length) { + size_t t = 0; + while (t < strlen(table[i])) { + if (table[i][t] == '=') break; + t ++; + } + strncpy(buf, table[i], t); + buf[t] = '\0'; + if (strcmp(str, buf) == 0) { + char* se = &table[i][t + 1]; + byte_t internal = 0x00; + while (strlen(se) > 1) { + char is[3]; + strncpy(is, se, 2); + is[2] = '\0'; + if (__arg_writer(is, parser, internal) == EXIT_FAILURE) { + ntsys_error("Internal program error!"); + return EXIT_FAILURE; + } + se += sizeof(char) * 2; + } + return EXIT_SUCCESS; + } + i ++; + } + ntsys_error("Undefined operator!"); + /* Обязательно заменить на EXIT_FAILURE! EXIT_SUCCESS нужен для отладки! */ + return EXIT_SUCCESS; +} + +int __ntsys_arg_function_loader(ntsys_argument_parser_t* parser) { + char* str = parser->string; + while (ntsys_asm_arg_new(str, parser->cache)) { + if (select_argument(str, parser) == EXIT_FAILURE) return EXIT_FAILURE; } return EXIT_SUCCESS; } diff --git a/ntsys b/ntsys index abfa6f6..56fdf2d 100755 Binary files a/ntsys and b/ntsys differ diff --git a/ntsys-assembler.h b/ntsys-assembler.h index 39ace16..e7ea542 100644 --- a/ntsys-assembler.h +++ b/ntsys-assembler.h @@ -5,15 +5,24 @@ #include "asm-savers.h" +/* + * :T - тип данных + * :D - данные + * XX - шестнадцатиричные данные + */ + +const size_t ntsys_command_count = 1; + char* ntsys_asm_table[] = { - "print" + "push=00:T:D" }; int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp) { + ntsys_labels_array_t labels = NULL; 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); - return ntsys_run_asm_parser(__parser); + ntsys_argument_parser_t parser = create_ntsys_asm_parser(__cache, fp, str, ntsys_asm_table, ntsys_command_count, labels); + return ntsys_run_asm_parser(parser); } int ntsys_compile_asm(char* filename, char* asm_out) {