Virual stack

This commit is contained in:
german 2026-03-11 18:30:46 +04:00
parent 7ac9319871
commit f2773b1608
11 changed files with 91 additions and 11 deletions

2
-d Normal file
View File

@ -0,0 +1,2 @@
00000000: 4d5a 1d00 0000 8000 0248 656c 6c6f 2c20 MZ.......Hello, 
00000010: 776f 726c 6421 0a00 0001 001a      world!......

View File

@ -106,4 +106,9 @@ void (*operations[])(void) = {
> Она принимает количество элементов в качестве параметра.
> Элементы сдвигаются влево.
- **SWAP 0x1B** - Swap (**ARG1 ARG2**). Формат: **0x1B РАЗМЕР**
- **COPY 0x1C** - Скопировать последний элемент (**ARG**). Формат: **0x1C РАЗМЕР**
- **COPY 0x1C** - Скопировать последний элемент (**ARG**). Формат: **0x1C РАЗМЕР**
- **SET 0x1D** - Установить указатель виртуального стека (**ARG**). Формат: **0x1D**
- **MOV 0x1E** - Переключить стек (виртуальный/обычный). Формат: **0x1E**
## Функции
- **CALL 0x1F** - Аналогична инструкции **JMP**, но сохраняет стек вызовов (32 элемента). Формат: **0x1F**
- **RET 0x20** - Возврат из функции. Формат: **0x20**

View File

@ -5,10 +5,10 @@ ntsys --asm имя_файла.asm --out имя_файла.exe --mem 128
```
## Hello, world!
```asm
main: ; Метка main
push.string "Hello, world!\n" ; Записываем строку
push byte, 0x00 ; Запись номера SYSCALL
syscall ; Системный вызов
main: ; Метка main
push.string "Hello, world!\n" ; Записываем строку
push byte, 0x00 ; Запись номера SYSCALL
syscall ; Системный вызов
```
## Выводим имя пользователя
```asm

4
hello.asm Normal file
View File

@ -0,0 +1,4 @@
main: ; Метка main
push.string "Hello, world!\n" ; Записываем строку
push byte, 0x00 ; Запись номера SYSCALL
syscall ; Системный вызов

BIN
hello.exe Normal file

Binary file not shown.

View File

@ -1 +1,2 @@
4d5a2400000020000248656c6c6f2c20776f726c64210a000001001a00022a00
4d5a123456788000
0248656c6c6f2c20776f726c64210a000001001a00022a00

View File

@ -625,7 +625,7 @@ static void nt_fs_syscall(void) {
}
}
void stack_swap(void) {
static void stack_swap(void) {
size_t size = buf[cnt++];
pop_arg(1, arg1);
pop_arg(size, arg2);
@ -643,7 +643,7 @@ void stack_swap(void) {
}
}
void stack_copy(void) {
static void stack_copy(void) {
size_t size = buf[cnt++];
sp -= size;
size_t i = 0;
@ -653,6 +653,49 @@ void stack_copy(void) {
}
}
word_t fGH6VSEzu7qNiGVE_sp_save = 0;
word_t fGH6VSEzu7qNiGVE_sp_std = 0;
__e_byte_t fGH6VSEzu7qNiGVE_flag = 0;
static void stack_spawn_set(void) {
pop_arg(2, arg1);
fGH6VSEzu7qNiGVE_sp_std = *(word_t*)arg1;
}
static void stack_spawn_mov(void) {
if (fGH6VSEzu7qNiGVE_flag == 0) {
fGH6VSEzu7qNiGVE_sp_save = sp;
sp = fGH6VSEzu7qNiGVE_sp_std;
} else {
sp = fGH6VSEzu7qNiGVE_sp_save;
}
fGH6VSEzu7qNiGVE_flag = !fGH6VSEzu7qNiGVE_flag;
}
#define NTSYS_CALL_BUFFER_LENGTH (32)
word_t fGH6VSEzu7qNiGVE_call_buf[NTSYS_CALL_BUFFER_LENGTH];
word_t fGH6VSEzu7qNiGVE_d_ptr = NTSYS_CALL_BUFFER_LENGTH - 1;
#define call_buf fGH6VSEzu7qNiGVE_call_buf
#define call_sp fGH6VSEzu7qNiGVE_d_ptr
static void f_call(void) {
call_sp -= 1;
call_buf[call_sp] = cnt;
nt_goto();
}
static void f_ret(void) {
if (call_sp < NTSYS_CALL_BUFFER_LENGTH) {
cnt = call_buf[call_sp];
call_sp += 1;
}
}
#undef call_buf
#undef call_sp
void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
/* Операции со стеком (0 - 2) */
push, pop, push_str,
@ -674,8 +717,11 @@ void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
get_sp, set_sp,
/* Системные вызовы (26) */
nt_fs_syscall,
/* Управление положение на стеке (27 - 28) */
stack_swap, stack_copy
/* Управление положение на стеке (27 - 30) */
stack_swap, stack_copy,
stack_spawn_set, stack_spawn_mov,
/* Функции (31 - 32) */
f_call, f_ret
};
#undef stack

BIN
ntsys

Binary file not shown.

View File

@ -12,7 +12,7 @@
* XX - шестнадцатиричные данные
*/
const size_t ntsys_command_count = 0x1E;
const size_t ntsys_command_count = 0x22;
char* ntsys_asm_table[] = {
"push=00:T:D",
@ -53,6 +53,12 @@ char* ntsys_asm_table[] = {
"swap=1B:T",
"dup=1C:T",
"set=1D",
"mov=1E",
"call=1F",
"ret=20",
"pass="
};

16
set_mov.asm Normal file
View File

@ -0,0 +1,16 @@
start:
push db main
jmp
log:
push byte 0x00
syscall
ret
main:
push dw 0x20
set
push.string "Hello, world!\n"
push db log
call

BIN
set_mov.exe Normal file

Binary file not shown.