Virual stack
This commit is contained in:
parent
7ac9319871
commit
f2773b1608
2
-d
Normal file
2
-d
Normal file
@ -0,0 +1,2 @@
|
||||
00000000: [1;32m4d[0m[1;32m5a[0m [1;31m1d[0m[1;37m00[0m [1;37m00[0m[1;37m00[0m [1;31m80[0m[1;37m00[0m [1;31m02[0m[1;32m48[0m [1;32m65[0m[1;32m6c[0m [1;32m6c[0m[1;32m6f[0m [1;32m2c[0m[1;32m20[0m [1;32mM[0m[1;32mZ[0m[1;31m.[0m[1;37m.[0m[1;37m.[0m[1;37m.[0m[1;31m.[0m[1;37m.[0m[1;31m.[0m[1;32mH[0m[1;32me[0m[1;32ml[0m[1;32ml[0m[1;32mo[0m[1;32m,[0m[1;32m [0m
|
||||
00000010: [1;32m77[0m[1;32m6f[0m [1;32m72[0m[1;32m6c[0m [1;32m64[0m[1;32m21[0m [1;33m0a[0m[1;37m00[0m [1;37m00[0m[1;31m01[0m [1;37m00[0m[1;31m1a[0m [1;31m [0m[1;31m [0m[1;31m [0m[1;31m [0m [1;32mw[0m[1;32mo[0m[1;32mr[0m[1;32ml[0m[1;32md[0m[1;32m![0m[1;33m.[0m[1;37m.[0m[1;37m.[0m[1;31m.[0m[1;37m.[0m[1;31m.[0m
|
||||
@ -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**
|
||||
@ -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
4
hello.asm
Normal file
@ -0,0 +1,4 @@
|
||||
main: ; Метка main
|
||||
push.string "Hello, world!\n" ; Записываем строку
|
||||
push byte, 0x00 ; Запись номера SYSCALL
|
||||
syscall ; Системный вызов
|
||||
@ -1 +1,2 @@
|
||||
4d5a2400000020000248656c6c6f2c20776f726c64210a000001001a00022a00
|
||||
4d5a123456788000
|
||||
0248656c6c6f2c20776f726c64210a000001001a00022a00
|
||||
|
||||
54
ntfiles.h
54
ntfiles.h
@ -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
|
||||
|
||||
@ -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
16
set_mov.asm
Normal 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
BIN
set_mov.exe
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user