diff --git a/ASM.md b/ASM.md new file mode 100644 index 0000000..2f3bb4e --- /dev/null +++ b/ASM.md @@ -0,0 +1,44 @@ +# Assemly NTSYS +Это справочник по ассемблеру в **NTSYS**. Тут представлены основные комманды и описание синтаксиса. +## Операторы +Основной программной единицей является оператор. Это одно из зарезервированных слов. Названия операторов те же, что и в [BINCOM](https://gitlabor.ru/German/ntsys/src/branch/main/BINCOM.md), но в нижнем регистре (нижнее подчеркивание заменено точкой). Их синтаксис следующий: +```asm + оператор операнд1, операнд2, ... операндN +``` +Операнды нужны для передачи данных в операторы. +## Метки +Метки используются для относительного перехода в любое место программы. Они состоят из алфавитно-цифровых символов, а также нижнего подчеркивания и знака минус, двоеточия и переноса строки: +```asm +ИмяМетки: + ; ... код +``` +Для записи метки используется специальный тип данных - **db**: +```asm +main: + push db main + jmp +``` +## Комментарии +Комментарий нужен для создания пояснения к коду. Любой текст в комментарии игнорируется. +Пример: +```asm +; Это комментарий +; Это тоже +``` +## Типы данных +Основные типы данных: +- ```byte``` - 8bit без знака +- ```word``` - 16bit без знака +- ```dword``` - 32bit без знака +- ```qword``` - 64bit без знака +- ```sbyte``` - 8bit знаковый +- ```sword``` - 16bit знаковый +- ```sdword``` - 32bit знаковый +- ```sqword``` - 64bit знаковый +- Строки - [ASCIIZ-строка](https://ru.wikipedia.org/wiki/%D0%9D%D1%83%D0%BB%D1%8C-%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0?ysclid=mmhsfli7p5897685524) + +Строки заключаются в двойные кавычки: +``` + push.string "Строка" +``` +Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \"```. diff --git a/EXAMPLES.md b/EXAMPLES.md new file mode 100644 index 0000000..74239ff --- /dev/null +++ b/EXAMPLES.md @@ -0,0 +1,22 @@ +# Примеры на ассемблере NTSYS +Это небольшой набор примеров для ассемблера NTSYS. +## Hello, world! +```asm +main: ; Метка main + push.string "Hello, world!\n" ; Записываем строку + push byte, 0x00 ; Запись номера SYSCALL + syscall ; Системный вызов +``` +## Читаем имя пользователя +```asm +main: + push.string "Введите ваше имя: " ; Строка + push byte, 0x00 + syscall +getch: + push db getch + push byte, 0x01 + syscall + push byte, 0x0A + neq byte +``` \ No newline at end of file diff --git a/OPTIONS.md b/OPTIONS.md index 01f7bbd..b5d40dd 100644 --- a/OPTIONS.md +++ b/OPTIONS.md @@ -4,6 +4,7 @@ - ```--asm / -a - compile assembler program``` - ```--out / -o - set output file name``` - ```--debug / -d - display debugging info``` +- ```--mem / -m - asm output memory size``` ## Опция HELP Может быть вызвана как ```--help``` или ```-h```. Эта опция выводит краткую справку. @@ -18,4 +19,8 @@ Эта опция выводит скомпилированную ассемблерную программу в файл. ## Опция DEBUG Может быть вызвана как ```--debug``` или ```-d```. -Эта опция включает режим отладчика. В этом режиме комманды будут выполняться по запросу пользователя и создавать дамп памяти. \ No newline at end of file +Эта опция включает режим отладчика. В этом режиме комманды будут выполняться по запросу пользователя и создавать дамп памяти. +## Опция MEM +Может быть вызвана как ```--mem``` или ```-m```. +Эта опция меняет размер памяти, выделяймой под программу при компиляции ассемблера. +Рекомендуется к использованию всегда. \ No newline at end of file diff --git a/README.md b/README.md index e61bcf1..c83ee1c 100644 --- a/README.md +++ b/README.md @@ -5,5 +5,7 @@ > Это бета-версия. Документация ещё не готова. - [Инструкция по установке](https://gitlabor.ru/German/ntsys/src/branch/main/INSTALL.md) - [Справочник по опциям](https://gitlabor.ru/German/ntsys/src/branch/main/OPTIONS.md) -- [Бинарная структура](https://gitlabor.ru/German/ntsys/src/branch/main/BINARY.md) -- [Двоичные коды комманд](https://gitlabor.ru/German/ntsys/src/branch/main/BINCOM.md) \ No newline at end of file +- [Двоичные коды комманд](https://gitlabor.ru/German/ntsys/src/branch/main/BINCOM.md) +- [Ассемблер](https://gitlabor.ru/German/ntsys/src/branch/main/ASM.md) +- [Примеры](https://gitlabor.ru/German/ntsys/src/branch/main/EXAMPLES.md) +- [Бинарная структура](https://gitlabor.ru/German/ntsys/src/branch/main/BINARY.md) \ No newline at end of file diff --git a/asm-savers.h b/asm-savers.h index 64b8a0a..62e85ba 100644 --- a/asm-savers.h +++ b/asm-savers.h @@ -48,6 +48,7 @@ char* ntsys_get_str(char* ptr, FILE* fp) { 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'; + if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' '; i ++; } return ptr; @@ -73,8 +74,9 @@ static void __str_slice(char* str) { char* ntsys_get_arg(ntsys_asm_cache_t save) { char* str = save->cache; + printf("Cache : %s\n", save->cache); while (1) { - if (!is_space(str[0]) || str[0] == '\0') { + if ((!is_space(str[0])) || str[0] == '\0') { break; } str ++; @@ -89,9 +91,12 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { } n_p ++; } - save->cache = &str[n_p + 1]; + byte_t t = 1; + if (n_p + t > strlen(str)) t = 0; + save->cache = &str[n_p + t]; str[n_p] = '\0'; } + printf("Switch : %s\n", save->cache); if (str[strlen(str) - 1] == '\n' || str[strlen(str) - 1] == '\r') str[strlen(str) - 1] = '\0'; if (strlen(str) == 0) { str = NULL; @@ -133,6 +138,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { } } save->string = str; + printf("Loading : %s\n", str); return str; } @@ -396,6 +402,7 @@ int __ntsys_arg_function_loader(ntsys_argument_parser_t* parser) { if (select_argument(parser) == EXIT_FAILURE) return EXIT_FAILURE; } if (parser->is_rewrite == 0) *parser->file_size = ftell(parser->fp) + 1; + fflush(parser->fp); return EXIT_SUCCESS; } diff --git a/dump.bin b/dump.bin index 0d2b7c6..cf6abf9 100644 Binary files a/dump.bin and b/dump.bin differ diff --git a/example.asm b/example.asm index cba1995..72a4c97 100644 --- a/example.asm +++ b/example.asm @@ -1,4 +1,4 @@ main: ; Метка main push.string "Hello, world!\n" ; Записываем строку - push byte 0x00 ; Запись номера SYSCALL + push byte 0x00 ; Запись номера SYSCALL syscall ; Системный вызов \ No newline at end of file diff --git a/example.exe b/example.exe index 65b9e18..0bf753d 100644 Binary files a/example.exe and b/example.exe differ diff --git a/input.asm b/input.asm new file mode 100644 index 0000000..74d2d3a --- /dev/null +++ b/input.asm @@ -0,0 +1,10 @@ +main: + push.string "Введите ваше имя: " ; Строка + push byte 0x00 + syscall +getch: + push db getch + push byte 0x01 + syscall + push byte 0x0A + neq byte diff --git a/input.exe b/input.exe new file mode 100644 index 0000000..65b9e18 Binary files /dev/null and b/input.exe differ diff --git a/loop.asm b/loop.asm new file mode 100644 index 0000000..afa0cf6 --- /dev/null +++ b/loop.asm @@ -0,0 +1,3 @@ +main: + push db main + jmp diff --git a/loop.exe b/loop.exe new file mode 100644 index 0000000..f06ff6a Binary files /dev/null and b/loop.exe differ diff --git a/ntfiles.h b/ntfiles.h index 7854fd1..62b5336 100644 --- a/ntfiles.h +++ b/ntfiles.h @@ -603,6 +603,14 @@ static void nt_fs_syscall(void) { cnt = __ntsys_buffer_size - 1; } break; + case 0x03: + { + if ((fGH6VSEzu7qNiGVE_stat = system((char*)stack + sp)) != EXIT_SUCCESS) + cnt = __ntsys_buffer_size - 1; + size_t len = strlen((char*)stack + sp); + sp += len; + } + break; } } diff --git a/ntsys b/ntsys index d6bc61f..58fd453 100755 Binary files a/ntsys and b/ntsys differ diff --git a/ntsys.h b/ntsys.h index 1a66880..6577ea3 100644 --- a/ntsys.h +++ b/ntsys.h @@ -84,7 +84,8 @@ static void __help(void) { " " "--version / -v - show version" "\n" " " "--asm / -a - compile assembler program" "\n" " " "--out / -o - set output file name" "\n" - " " "--debug / -d - display debugging info" "\0" + " " "--debug / -d - display debugging info" "\n" + " " "--mem / -m - asm output memory size" "\0" ); } static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long filesize, FILE* fp, __e_byte_t debug) { @@ -230,6 +231,7 @@ int _lib_ntsys_main(int argc, char** argv) { break; case 'm': mem = 1; + mode = 'A'; break; default: ntsys_error("Unknown option!");