From 07f94ba9d8e6a6802f101c33ad476ba3344f725a Mon Sep 17 00:00:00 2001 From: german Date: Mon, 9 Mar 2026 17:34:30 +0400 Subject: [PATCH] Examples --- ASM.md | 2 +- BINCOM.md | 5 ++++- EXAMPLES.md | 51 +++++++++++++++++++++++++++++++++++----------- asm-savers.h | 26 +++++++++++++++++++++-- dump.bin | Bin 128 -> 128 bytes input.asm | 10 ++------- input.exe | Bin 59 -> 44 bytes ntfiles.h | 13 +++++++++++- ntsys | Bin 39960 -> 40024 bytes ntsys-assembler.h | 7 ++++--- random.exe | Bin 0 -> 90 bytes wait.asm | 27 ++++++++++++++++++++++++ wait.exe | Bin 0 -> 90 bytes 13 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 random.exe create mode 100644 wait.asm create mode 100644 wait.exe diff --git a/ASM.md b/ASM.md index 2f3bb4e..177976f 100644 --- a/ASM.md +++ b/ASM.md @@ -41,4 +41,4 @@ main: ``` push.string "Строка" ``` -Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \"```. +Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \", \'```. diff --git a/BINCOM.md b/BINCOM.md index 421a185..6e41fa9 100644 --- a/BINCOM.md +++ b/BINCOM.md @@ -83,7 +83,7 @@ void (*operations[])(void) = { - **DOWNE 0x15** - Не меньше (больше или равно) **ARG1 >= ARG2** - сначала берётся **ARG1**. Формат: **0x15 РАЗМЕР** ### Работа с памятью > [!NOTE] -> Комманда для записи в память получает аддрес в **ARG1**, а размер - в **ARG2**. +> Комманда для записи в память получает адрес в **ARG1**, а данные - в **ARG2**. - **MWRT 0x16** - Запись **ARG1 ARG2** - сначала берётся **ARG1**. Формат: **0x16 РАЗМЕР** - **MREAD 0x17** - Чтение **ARG**. Формат: **0x17 РАЗМЕР** ## Работа с указателем @@ -95,4 +95,7 @@ void (*operations[])(void) = { > - Вывод строки (Запись на стек строки и числа **0x00**) > - Ввод символа (Запись на стек **0x01**) > - Завершение со статусом (Запись на стек **WORD-статуса** и числа **0x02**) +> - Вызов BASH (Запись на стек строки и числа **0x03**) +> - Запрос к RANDOM (Запись на стек числа **0x04**) +> - Установка SEED (Запись на стек **WORD-SEED** и числа **0x05**) - **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A** \ No newline at end of file diff --git a/EXAMPLES.md b/EXAMPLES.md index 74239ff..02162ec 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -1,5 +1,8 @@ # Примеры на ассемблере NTSYS -Это небольшой набор примеров для ассемблера NTSYS. +Это небольшой набор примеров для ассемблера NTSYS. Для их компиляции используйте: +```bash +ntsys --asm имя_файла.asm --out имя_файла.exe --mem 128 +``` ## Hello, world! ```asm main: ; Метка main @@ -7,16 +10,40 @@ main: ; Метка main 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 +main: ; Метка main + push.string "echo \"Ваше имя: $USER\"\n" ; Запрос к системе + push byte, 0x03 ; Код + syscall ; Вызов +``` +## Пример программной задержки +```asm +main: ; Метка main + push.string "This is example of wait!\n" ; Строка + push byte, 0x00 ; Номер + syscall ; Системный вызов + +mload: ; Функция mload + push word, 0x00 ; Данные для записи + push word, 0x00 ; Адрес в VRAM + mwrt word ; Комманда записи + +lwait: ; Цикл задержки + push db, lwait ; Его адрес + push word, 0x01 ; Увеличивать счетчик на 1 + push word, 0x00 ; Счетчик по адресу 0x00 + mread word ; Читаем + add word ; Складываем + push word, 0x00 ; Адрес для записи + mwrt word ; Записываем обратно + push word, 0x00 ; Адрес + mread word ; Читаем + push word, 0xFFFF ; Значение для сравнения + neq word ; Если не равно - повторить цикл + +mloop: ; Главный цикл + pop byte ; Убираем оставщийся байт + push db, main ; Адрес main + jmp ; Повторяем цикл ``` \ No newline at end of file diff --git a/asm-savers.h b/asm-savers.h index b6d4af9..cc1ad81 100644 --- a/asm-savers.h +++ b/asm-savers.h @@ -18,6 +18,15 @@ #define __READ_FILE_WITH_EOF_OR_LN ((c = getc(fp)) != EOF && c != '\n' && c != '\r') #define is_space(c) (c >= 0 && c <= 32) +static byte_t is_spaces(char* str) { + size_t pos = 0; + while (pos < strlen(str)) { + if (!is_space(str[pos])) return 0; + pos ++; + } + return 1; +} + char* ntsys_get_str(char* ptr, FILE* fp) { if (ptr != NULL) { free(ptr); @@ -26,12 +35,19 @@ char* ntsys_get_str(char* ptr, FILE* fp) { int c; { unsigned long save_ptr = ftell(fp); + __e_byte_t tr = 0; while (__READ_FILE_WITH_EOF_OR_LN) { + if (!is_space(c)) tr = 1; len ++; } + if (tr == 0) len = 0; + if (len == 0 && c == EOF) return NULL; + if (len == 0) { + ptr = malloc(5 * sizeof(char)); + return strcpy(ptr, "pass"); + } fseek(fp, save_ptr, SEEK_SET); } - if (len == 0) return NULL; ptr = malloc(len + 1); if (ptr == NULL) { ntsys_error("Out of memory!"); @@ -51,6 +67,11 @@ char* ntsys_get_str(char* ptr, FILE* fp) { if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' '; i ++; } + if (strlen(ptr) == 0 || is_spaces(ptr)) { + free(ptr); + ptr = malloc(5 * sizeof(char)); + return strcpy(ptr, "pass"); + } return ptr; } @@ -123,6 +144,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { case 'v': str[i] = '\v'; break; case 'f': str[i] = '\f'; break; case 'r': str[i] = '\r'; break; + case '"': str[i] = '"'; break; default: ntsys_error("Unknown ident!"); str = NULL; @@ -197,7 +219,7 @@ static void __write_label(ntsys_argument_parser_t* parser) { size_t i = 0; /* printf("Count: 0x%04lX\n", *(parser->labels_count)); */ while (i < *(parser->labels_count)) { - /* printf("Label: \"%s\" to \"%s\"\n", parser->string, parser->labels[i]); */ + /* printf("Label: \"%s\" to \"%s\" at 0x%08X\n", parser->string, parser->labels[i], parser->labels_positions[i]); */ if (strcmp(parser->string, parser->labels[i]) == 0) { word_t cnt = parser->labels_positions[i]; int __i = 1; diff --git a/dump.bin b/dump.bin index a7693cf51c7cbec857de2d2a66ccd4ea9f50c3ec..d701445a2a43da8ff0601f2d715f5da6860e0688 100644 GIT binary patch literal 128 jcmZQzpa%%a$ShU>qST7S+=84`h5R&y^2E#%MJ@&aei{gt literal 128 pcmZQzpfR{G>B6Q9TQ6+6u;XIWg{=xe&W4K}AjXahdoK1{0RUen6&wHn diff --git a/input.asm b/input.asm index 695c8a4..b92e4cd 100644 --- a/input.asm +++ b/input.asm @@ -1,10 +1,4 @@ main: - push.string "Введите ваше имя: " ; Строка - push byte, 0x00 + push.string "echo \"Ваше имя: $USER\"\n" + push byte, 0x03 syscall -getch: - push db, getch - push byte, 0x01 - syscall - push byte, 0x0A - neq byte diff --git a/input.exe b/input.exe index a157004d617bbc2b39e6a5829d18f7cdbc415814..9bf70cd52bf1b413a6fbe4fe1d5125e9916270d2 100644 GIT binary patch literal 44 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 delta 12293 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 diff --git a/ntsys-assembler.h b/ntsys-assembler.h index af66c67..5340d87 100644 --- a/ntsys-assembler.h +++ b/ntsys-assembler.h @@ -12,7 +12,7 @@ * XX - шестнадцатиричные данные */ -const size_t ntsys_command_count = 0x1B; +const size_t ntsys_command_count = 0x1C; char* ntsys_asm_table[] = { "push=00:T:D", @@ -48,14 +48,15 @@ char* ntsys_asm_table[] = { "getsp=18", "setsp=19", - "syscall=1A" + "syscall=1A", + + "pass=" }; 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, dword_t* fsz) { 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, labels_pos, labels_count, cycle, fsz); - /*puts(str);*/ return ntsys_run_asm_parser(parser); } diff --git a/random.exe b/random.exe new file mode 100644 index 0000000000000000000000000000000000000000..6ac43f553e351ddde6f1051d68d9dfa43bf7fb4e GIT binary patch literal 90 zcmeZ`ie_M7XkcIp$;d2L0HV~2#N2|MRE7LBh4RGA5=AZs21W)c1}2~?AQod{VA2G# c7{NSoCT1WXBFexZ4rKrTFU-Wu2omE300{34`~Uy| literal 0 HcmV?d00001 diff --git a/wait.asm b/wait.asm new file mode 100644 index 0000000..77e95bc --- /dev/null +++ b/wait.asm @@ -0,0 +1,27 @@ +main: ; Метка main + push.string "This is example of wait!\n" ; Строка + push byte, 0x00 ; Номер + syscall ; Системный вызов + +mload: ; Функция mload + push word, 0x00 ; Данные для записи + push word, 0x00 ; Адрес в VRAM + mwrt word ; Комманда записи + +lwait: ; Цикл задержки + push db, lwait ; Его адрес + push word, 0x01 ; Увеличивать счетчик на 1 + push word, 0x00 ; Счетчик по адресу 0x00 + mread word ; Читаем + add word ; Складываем + push word, 0x00 ; Адрес для записи + mwrt word ; Записываем обратно + push word, 0x00 ; Адрес + mread word ; Читаем + push word, 0xFFFF ; Значение для сравнения + neq word ; Если не равно - повторить цикл + +mloop: ; Главный цикл + pop byte ; Убираем оставщийся байт + push db, main ; Адрес main + jmp ; Повторяем цикл \ No newline at end of file diff --git a/wait.exe b/wait.exe new file mode 100644 index 0000000000000000000000000000000000000000..4bb17bf47919a82b8f093141c2deb915af4f6736 GIT binary patch literal 90 zcmeZ`ie_M7XkcIp$;d2L0HV~2#N2|MRE7LBh4RGA5=AZs21W)c1}2~?AQod{VA2G# c7{NSoCT1WXBFexZ4rKrTFU-Wq2omE300`j>`Tzg` literal 0 HcmV?d00001