Swap and copy commands
This commit is contained in:
parent
e837724512
commit
b58820c0f3
2
ASM.md
2
ASM.md
@ -35,6 +35,8 @@ main:
|
|||||||
- ```sword``` - 16bit знаковый
|
- ```sword``` - 16bit знаковый
|
||||||
- ```sdword``` - 32bit знаковый
|
- ```sdword``` - 32bit знаковый
|
||||||
- ```sqword``` - 64bit знаковый
|
- ```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)
|
- Строки - [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)
|
||||||
|
|
||||||
Строки заключаются в двойные кавычки:
|
Строки заключаются в двойные кавычки:
|
||||||
|
|||||||
12
BINCOM.md
12
BINCOM.md
@ -1,5 +1,5 @@
|
|||||||
# BINCOM - справочник по коммандам NTSYS
|
# BINCOM - справочник по командам NTSYS
|
||||||
Эта страница посвящена коммандам в NTSYS.
|
Эта страница посвящена командам в NTSYS.
|
||||||
## Кратко
|
## Кратко
|
||||||
```c
|
```c
|
||||||
void (*operations[])(void) = {
|
void (*operations[])(void) = {
|
||||||
@ -99,3 +99,11 @@ void (*operations[])(void) = {
|
|||||||
> - Запрос к RANDOM (Запись на стек числа **0x04**)
|
> - Запрос к RANDOM (Запись на стек числа **0x04**)
|
||||||
> - Установка SEED (Запись на стек **WORD-SEED** и числа **0x05**)
|
> - Установка 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 РАЗМЕР**
|
||||||
12
EXAMPLES.md
12
EXAMPLES.md
@ -46,3 +46,15 @@ mloop: ; Главный цикл
|
|||||||
push db, main ; Адрес main
|
push db, main ; Адрес main
|
||||||
jmp ; Повторяем цикл
|
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 ; Системный вызов
|
||||||
|
```
|
||||||
@ -187,6 +187,8 @@ static void __input_datatype(ntsys_argument_parser_t* parser, byte_t* mode) {
|
|||||||
data_type = 0x01;
|
data_type = 0x01;
|
||||||
} else if (strcmp(str, "word") == 0) {
|
} else if (strcmp(str, "word") == 0) {
|
||||||
data_type = 0x02;
|
data_type = 0x02;
|
||||||
|
} else if (strcmp(str, "dw") == 0) {
|
||||||
|
data_type = 0x02;
|
||||||
} else if (strcmp(str, "dword") == 0) {
|
} else if (strcmp(str, "dword") == 0) {
|
||||||
data_type = 0x04;
|
data_type = 0x04;
|
||||||
} else if (strcmp(str, "qword") == 0) {
|
} 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;
|
count_system = 16;
|
||||||
} else if (str[1] == 'b') {
|
} else if (str[1] == 'b') {
|
||||||
count_system = 2;
|
count_system = 2;
|
||||||
} else {
|
} else if ((str[1] < '0' || str[1] > '9') && !is_space(str[1])) {
|
||||||
ntsys_error("Unknown number system!");
|
ntsys_error("Unknown number system!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
32
ntfiles.h
32
ntfiles.h
@ -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) = {
|
void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
|
||||||
/* Операции со стеком (0 - 2) */
|
/* Операции со стеком (0 - 2) */
|
||||||
push, pop, push_str,
|
push, pop, push_str,
|
||||||
@ -645,7 +673,9 @@ void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
|
|||||||
/* Адресация на стеке (24 - 25) */
|
/* Адресация на стеке (24 - 25) */
|
||||||
get_sp, set_sp,
|
get_sp, set_sp,
|
||||||
/* Системные вызовы (26) */
|
/* Системные вызовы (26) */
|
||||||
nt_fs_syscall
|
nt_fs_syscall,
|
||||||
|
/* Управление положение на стеке (27 - 28) */
|
||||||
|
stack_swap, stack_copy
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef stack
|
#undef stack
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
* XX - шестнадцатиричные данные
|
* XX - шестнадцатиричные данные
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const size_t ntsys_command_count = 0x1C;
|
const size_t ntsys_command_count = 0x1E;
|
||||||
|
|
||||||
char* ntsys_asm_table[] = {
|
char* ntsys_asm_table[] = {
|
||||||
"push=00:T:D",
|
"push=00:T:D",
|
||||||
@ -50,6 +50,9 @@ char* ntsys_asm_table[] = {
|
|||||||
|
|
||||||
"syscall=1A",
|
"syscall=1A",
|
||||||
|
|
||||||
|
"swap=1B:T",
|
||||||
|
"dup=1C:T",
|
||||||
|
|
||||||
"pass="
|
"pass="
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
9
swap.asm
Normal file
9
swap.asm
Normal 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 ; Системный вызов
|
||||||
Loading…
x
Reference in New Issue
Block a user