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 a7693cf..d701445 100644 Binary files a/dump.bin and b/dump.bin differ 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 a157004..9bf70cd 100644 Binary files a/input.exe and b/input.exe differ diff --git a/ntfiles.h b/ntfiles.h index 62b5336..bdecd46 100644 --- a/ntfiles.h +++ b/ntfiles.h @@ -594,7 +594,7 @@ static void nt_fs_syscall(void) { case 0x01: { char ch = getchar(); - pop_arg(1, (__e_byte_t*)&ch); + push_arg(1, (__e_byte_t*)&ch); } break; case 0x02: @@ -611,6 +611,17 @@ static void nt_fs_syscall(void) { sp += len; } break; + case 0x04: + { + __e_byte_t ch = rand() % 255; + push_arg(1, (__e_byte_t*)&ch); + } + break; + case 0x05: + { + srand(get_pop_sp_word()); + } + break; } } diff --git a/ntsys b/ntsys index 7d447f1..52b15c9 100755 Binary files a/ntsys and b/ntsys differ 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 0000000..6ac43f5 Binary files /dev/null and b/random.exe differ 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 0000000..4bb17bf Binary files /dev/null and b/wait.exe differ