diff --git a/BINCOM.md b/BINCOM.md new file mode 100644 index 0000000..e201854 --- /dev/null +++ b/BINCOM.md @@ -0,0 +1,48 @@ +# BINCOM - справочник по коммандам NTSYS +Эта страница посвящена коммандам в NTSYS. +## Кратко +```c +void (*operations[])(void) = { + /* Операции со стеком (0 - 2) */ + push, pop, push_str, + /* Арифметические операции (3 - 6) */ + add, sub, mul, div_r, + /* Логические операции (7 - 12) */ + nt_not, nt_shr, nt_shl, nt_or, + nt_and, nt_xor, + /* Переход (13) */ + nt_goto, + /* Условия (14 - 21) */ + bnez, bez, + up, down, + eq, neq, + upne, downe, + /* Работа с памятью (22 - 23) */ + mwrt, mrd, + /* Адресация на стеке (24 - 25) */ + get_sp, set_sp, + /* Системные вызовы (26) */ + nt_fs_syscall +}; +``` +## Справочник +### Стек +- **PUSH 0x00** - Запись данных на стек. Формат: **0x00 РАЗМЕР ДАННЫЕ_1 ... ДАННЫЕ_N** +- **POP 0x01** - Удаление данных со стека. Формат: **0x01 РАЗМЕР** +- **PUSH_STRING 0x02** - Запись строки на стек. Формат: **0x02 СИМВОЛ_1 ... СИМВОЛ_N 0x00** +### Арифметика +> [!WARNING] +> По умолчанию все арифметические операторы работают с **UNSIGNED**. +> Для **SIGNED** нужно добавить **0xF0**. Например (**SIGNED DWORD**): +> ```c +> unsigned char Y[2] = {0x03, 0x00}; +> unsigned char X = 4; +> X = X | 0xF0; +> Y[1] = X; +> fwrite(Y, 1, sizeof(Y), my_program); +> ... +> ``` +- **ADD 0x03** - Сложение **ARG1 + ARG2** - сначала берётся **ARG1**. Формат: **0x03 РАЗМЕР** +- **SUB 0x04** - Вычитание **ARG1 - ARG2** - сначала берётся **ARG1**. Формат: **0x04 РАЗМЕР** +- **MUL 0x05** - Умножение **ARG1 * ARG2** - сначала берётся **ARG1**. Формат: **0x05 РАЗМЕР** +- **MUL 0x06** - Деление **ARG1 / ARG2** - сначала берётся **ARG1**. Формат: **0x06 РАЗМЕР** \ No newline at end of file