diff --git a/-d b/-d new file mode 100644 index 0000000..fb28eea --- /dev/null +++ b/-d @@ -0,0 +1,2 @@ +00000000: 4d5a 1d00 0000 8000 0248 656c 6c6f 2c20 MZ.......Hello,  +00000010: 776f 726c 6421 0a00 0001 001a      world!...... diff --git a/BINCOM.md b/BINCOM.md index f2df629..898795f 100644 --- a/BINCOM.md +++ b/BINCOM.md @@ -106,4 +106,9 @@ void (*operations[])(void) = { > Она принимает количество элементов в качестве параметра. > Элементы сдвигаются влево. - **SWAP 0x1B** - Swap (**ARG1 ARG2**). Формат: **0x1B РАЗМЕР** -- **COPY 0x1C** - Скопировать последний элемент (**ARG**). Формат: **0x1C РАЗМЕР** \ No newline at end of file +- **COPY 0x1C** - Скопировать последний элемент (**ARG**). Формат: **0x1C РАЗМЕР** +- **SET 0x1D** - Установить указатель виртуального стека (**ARG**). Формат: **0x1D** +- **MOV 0x1E** - Переключить стек (виртуальный/обычный). Формат: **0x1E** +## Функции +- **CALL 0x1F** - Аналогична инструкции **JMP**, но сохраняет стек вызовов (32 элемента). Формат: **0x1F** +- **RET 0x20** - Возврат из функции. Формат: **0x20** \ No newline at end of file diff --git a/EXAMPLES.md b/EXAMPLES.md index e198ca8..9a9d972 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -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 diff --git a/hello.asm b/hello.asm new file mode 100644 index 0000000..90c13cb --- /dev/null +++ b/hello.asm @@ -0,0 +1,4 @@ +main: ; Метка main + push.string "Hello, world!\n" ; Записываем строку + push byte, 0x00 ; Запись номера SYSCALL + syscall ; Системный вызов \ No newline at end of file diff --git a/hello.exe b/hello.exe new file mode 100644 index 0000000..65b9e18 Binary files /dev/null and b/hello.exe differ diff --git a/hello_world.hex b/hello_world.hex index ec18d32..eb5a966 100644 --- a/hello_world.hex +++ b/hello_world.hex @@ -1 +1,2 @@ -4d5a2400000020000248656c6c6f2c20776f726c64210a000001001a00022a00 +4d5a123456788000 +0248656c6c6f2c20776f726c64210a000001001a00022a00 diff --git a/ntfiles.h b/ntfiles.h index b8bf5da..70f1e46 100644 --- a/ntfiles.h +++ b/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 diff --git a/ntsys b/ntsys index 5cd015d..44c254a 100755 Binary files a/ntsys and b/ntsys differ diff --git a/ntsys-assembler.h b/ntsys-assembler.h index 1c09ffb..e5e88f4 100644 --- a/ntsys-assembler.h +++ b/ntsys-assembler.h @@ -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=" }; diff --git a/set_mov.asm b/set_mov.asm new file mode 100644 index 0000000..6e57d05 --- /dev/null +++ b/set_mov.asm @@ -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 + \ No newline at end of file diff --git a/set_mov.exe b/set_mov.exe new file mode 100644 index 0000000..fa405f6 Binary files /dev/null and b/set_mov.exe differ