Swap and copy commands

This commit is contained in:
german 2026-03-10 16:50:29 +04:00
parent e837724512
commit b58820c0f3
10 changed files with 4263 additions and 6 deletions

2
ASM.md
View File

@ -35,6 +35,8 @@ main:
- ```sword``` - 16bit знаковый
- ```sdword``` - 32bit знаковый
- ```sqword``` - 64bit знаковый
- ```db``` - метка
- ```dw``` - указатель (size_t)
- Строки - [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)
Строки заключаются в двойные кавычки:

View File

@ -1,5 +1,5 @@
# BINCOM - справочник по коммандам NTSYS
Эта страница посвящена коммандам в NTSYS.
# BINCOM - справочник по командам NTSYS
Эта страница посвящена командам в NTSYS.
## Кратко
```c
void (*operations[])(void) = {
@ -98,4 +98,12 @@ void (*operations[])(void) = {
> - Вызов BASH (Запись на стек строки и числа **0x03**)
> - Запрос к RANDOM (Запись на стек числа **0x04**)
> - Установка SEED (Запись на стек **WORD-SEED** и числа **0x05**)
- **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A**
- **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A**
## Управление стеком
> [!NOTE]
> Как работает **SWAP**?
> Команда **SWAP** меняет местами два элемента на стеке, сдвигая другие.
> Она принимает количество элементов в качестве параметра.
> Элементы сдвигаются влево.
- **SWAP 0x1B** - Swap (**ARG1 ARG2**). Формат: **0x1B РАЗМЕР**
- **COPY 0x1C** - Скопировать последний элемент (**ARG**). Формат: **0x1C РАЗМЕР**

View File

@ -45,4 +45,16 @@ lwait: ; Цикл задержки
mloop: ; Главный цикл
push db, main ; Адрес main
jmp ; Повторяем цикл
```
## Пример инструкции SWAP
```asm
main: ; Метка main
push.string "Hello, world!\n" ; Строка
push byte 0x00 ; Дескриптор
syscall ; Системный вызов
push.string "Hello, world!\n" ; Строка
push byte 3 ; Кол-во блоков
swap word ; Блок размером в 2 байта
push byte 0x00 ; Дескриптор
syscall ; Системный вызов
```

View File

@ -187,6 +187,8 @@ static void __input_datatype(ntsys_argument_parser_t* parser, byte_t* mode) {
data_type = 0x01;
} else if (strcmp(str, "word") == 0) {
data_type = 0x02;
} else if (strcmp(str, "dw") == 0) {
data_type = 0x02;
} else if (strcmp(str, "dword") == 0) {
data_type = 0x04;
} else if (strcmp(str, "qword") == 0) {
@ -251,7 +253,7 @@ static void __input_data(ntsys_argument_parser_t* parser, byte_t* mode) {
count_system = 16;
} else if (str[1] == 'b') {
count_system = 2;
} else {
} else if ((str[1] < '0' || str[1] > '9') && !is_space(str[1])) {
ntsys_error("Unknown number system!");
return;
}

View File

@ -625,6 +625,34 @@ static void nt_fs_syscall(void) {
}
}
void stack_swap(void) {
size_t size = buf[cnt++];
pop_arg(1, arg1);
pop_arg(size, arg2);
sp -= size;
size_t i = 0;
while (i < ((size_t)(*(byte_t*)arg1) * size)) {
stack[sp + i] = stack[sp + (i) + size];
i ++;
}
i = 0;
byte_t r = ((*(byte_t*)arg1) - 1) * size;
while (i < size) {
stack[sp + r + i] = arg2[i];
i ++;
}
}
void stack_copy(void) {
size_t size = buf[cnt++];
sp -= size;
size_t i = 0;
while (i < size) {
stack[sp + i] = stack[sp + (i) + size];
i ++;
}
}
void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
/* Операции со стеком (0 - 2) */
push, pop, push_str,
@ -645,7 +673,9 @@ void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
/* Адресация на стеке (24 - 25) */
get_sp, set_sp,
/* Системные вызовы (26) */
nt_fs_syscall
nt_fs_syscall,
/* Управление положение на стеке (27 - 28) */
stack_swap, stack_copy
};
#undef stack

BIN
ntsys

Binary file not shown.

View File

@ -12,7 +12,7 @@
* XX - шестнадцатиричные данные
*/
const size_t ntsys_command_count = 0x1C;
const size_t ntsys_command_count = 0x1E;
char* ntsys_asm_table[] = {
"push=00:T:D",
@ -50,6 +50,9 @@ char* ntsys_asm_table[] = {
"syscall=1A",
"swap=1B:T",
"dup=1C:T",
"pass="
};

4191
ntsys.s Normal file

File diff suppressed because it is too large Load Diff

9
swap.asm Normal file
View File

@ -0,0 +1,9 @@
main: ; Метка main
push.string "Hello, world!\n" ; Строка
push byte 0x00 ; Дескриптор
syscall ; Системный вызов
push.string "Hello, world!\n" ; Строка
push byte 3 ; Кол-во блоков
swap word ; Блок размером в 2 байта
push byte 0x00 ; Дескриптор
syscall ; Системный вызов

BIN
swap.exe Normal file

Binary file not shown.