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 знаковый
|
||||
- ```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)
|
||||
|
||||
Строки заключаются в двойные кавычки:
|
||||
|
||||
14
BINCOM.md
14
BINCOM.md
@ -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 РАЗМЕР**
|
||||
12
EXAMPLES.md
12
EXAMPLES.md
@ -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 ; Системный вызов
|
||||
```
|
||||
@ -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;
|
||||
}
|
||||
|
||||
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) = {
|
||||
/* Операции со стеком (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
|
||||
|
||||
@ -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="
|
||||
};
|
||||
|
||||
|
||||
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