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 "Строка"
```
Поддерживаются следующие управляющие символы: ```\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 РАЗМЕР**
### Работа с памятью
> [!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**

View File

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

View File

@ -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;

BIN
dump.bin

Binary file not shown.

View File

@ -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

BIN
input.exe

Binary file not shown.

View File

@ -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;
}
}

BIN
ntsys

Binary file not shown.

View File

@ -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);
}

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.