This commit is contained in:
german 2026-03-09 17:34:30 +04:00
parent 68612c69b0
commit 07f94ba9d8
13 changed files with 113 additions and 28 deletions

2
ASM.md
View File

@ -41,4 +41,4 @@ main:
``` ```
push.string "Строка" push.string "Строка"
``` ```
Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \"```. Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \", \'```.

View File

@ -83,7 +83,7 @@ void (*operations[])(void) = {
- **DOWNE 0x15** - Не меньше (больше или равно) **ARG1 >= ARG2** - сначала берётся **ARG1**. Формат: **0x15 РАЗМЕР** - **DOWNE 0x15** - Не меньше (больше или равно) **ARG1 >= ARG2** - сначала берётся **ARG1**. Формат: **0x15 РАЗМЕР**
### Работа с памятью ### Работа с памятью
> [!NOTE] > [!NOTE]
> Комманда для записи в память получает аддрес в **ARG1**, а размер - в **ARG2**. > Комманда для записи в память получает адрес в **ARG1**, а данные - в **ARG2**.
- **MWRT 0x16** - Запись **ARG1 ARG2** - сначала берётся **ARG1**. Формат: **0x16 РАЗМЕР** - **MWRT 0x16** - Запись **ARG1 ARG2** - сначала берётся **ARG1**. Формат: **0x16 РАЗМЕР**
- **MREAD 0x17** - Чтение **ARG**. Формат: **0x17 РАЗМЕР** - **MREAD 0x17** - Чтение **ARG**. Формат: **0x17 РАЗМЕР**
## Работа с указателем ## Работа с указателем
@ -95,4 +95,7 @@ void (*operations[])(void) = {
> - Вывод строки (Запись на стек строки и числа **0x00**) > - Вывод строки (Запись на стек строки и числа **0x00**)
> - Ввод символа (Запись на стек **0x01**) > - Ввод символа (Запись на стек **0x01**)
> - Завершение со статусом (Запись на стек **WORD-статуса** и числа **0x02**) > - Завершение со статусом (Запись на стек **WORD-статуса** и числа **0x02**)
> - Вызов BASH (Запись на стек строки и числа **0x03**)
> - Запрос к RANDOM (Запись на стек числа **0x04**)
> - Установка SEED (Запись на стек **WORD-SEED** и числа **0x05**)
- **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A** - **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A**

View File

@ -1,5 +1,8 @@
# Примеры на ассемблере NTSYS # Примеры на ассемблере NTSYS
Это небольшой набор примеров для ассемблера NTSYS. Это небольшой набор примеров для ассемблера NTSYS. Для их компиляции используйте:
```bash
ntsys --asm имя_файла.asm --out имя_файла.exe --mem 128
```
## Hello, world! ## Hello, world!
```asm ```asm
main: ; Метка main main: ; Метка main
@ -7,16 +10,40 @@ main: ; Метка main
push byte, 0x00 ; Запись номера SYSCALL push byte, 0x00 ; Запись номера SYSCALL
syscall ; Системный вызов syscall ; Системный вызов
``` ```
## Читаем имя пользователя ## Выводим имя пользователя
```asm ```asm
main: main: ; Метка main
push.string "Введите ваше имя: " ; Строка push.string "echo \"Ваше имя: $USER\"\n" ; Запрос к системе
push byte, 0x00 push byte, 0x03 ; Код
syscall syscall ; Вызов
getch: ```
push db getch ## Пример программной задержки
push byte, 0x01 ```asm
syscall main: ; Метка main
push byte, 0x0A push.string "This is example of wait!\n" ; Строка
neq byte 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 ; Повторяем цикл
``` ```

View File

@ -18,6 +18,15 @@
#define __READ_FILE_WITH_EOF_OR_LN ((c = getc(fp)) != EOF && c != '\n' && c != '\r') #define __READ_FILE_WITH_EOF_OR_LN ((c = getc(fp)) != EOF && c != '\n' && c != '\r')
#define is_space(c) (c >= 0 && c <= 32) #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) { char* ntsys_get_str(char* ptr, FILE* fp) {
if (ptr != NULL) { if (ptr != NULL) {
free(ptr); free(ptr);
@ -26,12 +35,19 @@ char* ntsys_get_str(char* ptr, FILE* fp) {
int c; int c;
{ {
unsigned long save_ptr = ftell(fp); unsigned long save_ptr = ftell(fp);
__e_byte_t tr = 0;
while (__READ_FILE_WITH_EOF_OR_LN) { while (__READ_FILE_WITH_EOF_OR_LN) {
if (!is_space(c)) tr = 1;
len ++; 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); fseek(fp, save_ptr, SEEK_SET);
} }
if (len == 0) return NULL;
ptr = malloc(len + 1); ptr = malloc(len + 1);
if (ptr == NULL) { if (ptr == NULL) {
ntsys_error("Out of memory!"); ntsys_error("Out of memory!");
@ -51,6 +67,11 @@ char* ntsys_get_str(char* ptr, FILE* fp) {
if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' '; if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' ';
i ++; i ++;
} }
if (strlen(ptr) == 0 || is_spaces(ptr)) {
free(ptr);
ptr = malloc(5 * sizeof(char));
return strcpy(ptr, "pass");
}
return ptr; return ptr;
} }
@ -123,6 +144,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) {
case 'v': str[i] = '\v'; break; case 'v': str[i] = '\v'; break;
case 'f': str[i] = '\f'; break; case 'f': str[i] = '\f'; break;
case 'r': str[i] = '\r'; break; case 'r': str[i] = '\r'; break;
case '"': str[i] = '"'; break;
default: default:
ntsys_error("Unknown ident!"); ntsys_error("Unknown ident!");
str = NULL; str = NULL;
@ -197,7 +219,7 @@ static void __write_label(ntsys_argument_parser_t* parser) {
size_t i = 0; size_t i = 0;
/* printf("Count: 0x%04lX\n", *(parser->labels_count)); */ /* printf("Count: 0x%04lX\n", *(parser->labels_count)); */
while (i < *(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) { if (strcmp(parser->string, parser->labels[i]) == 0) {
word_t cnt = parser->labels_positions[i]; word_t cnt = parser->labels_positions[i];
int __i = 1; int __i = 1;

BIN
dump.bin

Binary file not shown.

View File

@ -1,10 +1,4 @@
main: main:
push.string "Введите ваше имя: " ; Строка push.string "echo \"Ваше имя: $USER\"\n"
push byte, 0x00 push byte, 0x03
syscall syscall
getch:
push db, getch
push byte, 0x01
syscall
push byte, 0x0A
neq byte

BIN
input.exe

Binary file not shown.

View File

@ -594,7 +594,7 @@ static void nt_fs_syscall(void) {
case 0x01: case 0x01:
{ {
char ch = getchar(); char ch = getchar();
pop_arg(1, (__e_byte_t*)&ch); push_arg(1, (__e_byte_t*)&ch);
} }
break; break;
case 0x02: case 0x02:
@ -611,6 +611,17 @@ static void nt_fs_syscall(void) {
sp += len; sp += len;
} }
break; 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;
} }
} }

BIN
ntsys

Binary file not shown.

View File

@ -12,7 +12,7 @@
* XX - шестнадцатиричные данные * XX - шестнадцатиричные данные
*/ */
const size_t ntsys_command_count = 0x1B; const size_t ntsys_command_count = 0x1C;
char* ntsys_asm_table[] = { char* ntsys_asm_table[] = {
"push=00:T:D", "push=00:T:D",
@ -48,14 +48,15 @@ char* ntsys_asm_table[] = {
"getsp=18", "getsp=18",
"setsp=19", "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) { 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_save_t __save = create_ntsys_asm_save(str);
ntsys_asm_cache_t __cache = create_ntsys_asm_cache(__save); 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); 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); return ntsys_run_asm_parser(parser);
} }

BIN
random.exe Normal file

Binary file not shown.

27
wait.asm Normal file
View File

@ -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 ; Повторяем цикл

BIN
wait.exe Normal file

Binary file not shown.