# 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 РАЗМЕР**