ntsys/BINCOM.md

6.9 KiB
Raw Permalink Blame History

BINCOM - справочник по командам NTSYS

Эта страница посвящена командам в NTSYS.

Справочник

Стек

  • PUSH 0x00 - Запись данных на стек. Формат: 0x00 РАЗМЕР ДАННЫЕ_1 ... ДАННЫЕ_N
  • POP 0x01 - Удаление данных со стека. Формат: 0x01 РАЗМЕР
  • PUSH_STRING 0x02 - Запись строки на стек. Формат: 0x02 СИМВОЛ_1 ... СИМВОЛ_N 0x00

Арифметика

Warning

По умолчанию все арифметические операторы работают с UNSIGNED. Для SIGNED нужно добавить 0xF0. Например (SIGNED DWORD):

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 РАЗМЕР
  • DIV 0x06 - Деление ARG1 / ARG2 - сначала берётся ARG1. Формат: 0x06 РАЗМЕР

Логика

  • NOT 0x07 - Инвертирование NOT ARG. Формат: 0x07 РАЗМЕР
  • SHR 0x08 - Сдвиг вправо ARG1 >> ARG2 - сначала берётся ARG1. Формат: 0x08 РАЗМЕР
  • SHL 0x09 - Сдвиг влево ARG1 << ARG2 - сначала берётся ARG1. Формат: 0x09 РАЗМЕР
  • OR 0x0A - Или ARG1 | ARG2 - сначала берётся ARG1. Формат: 0x0A РАЗМЕР
  • AND 0x0B - И ARG1 & ARG2 - сначала берётся ARG1. Формат: 0x0B РАЗМЕР
  • XOR 0x0C - Исключающее ИЛИ ARG1 & ARG2 - сначала берётся ARG1. Формат: 0x0C РАЗМЕР

Переход

  • JMP 0x0D - Переход по аддресу. Формат: 0x0D

Условия

Warning

По умолчанию все условные операторы работают с UNSIGNED. Для SIGNED нужно добавить 0xF0. Например (SIGNED DWORD):

unsigned char Y[2] = {0x0E, 0x00};
unsigned char X = 4;
X = X | 0xF0;
Y[1] = X;
fwrite(Y, 1, sizeof(Y), my_program);
...

Note

Эти операторы сначала считывают ARG1, затем - ARG2, а потом - аддрес. Аддрес считывается всегда.

  • BNEZ 0x0E - Не равно нулю ARG != 0 - сначала берётся ARG. Формат: 0x0E РАЗМЕР
  • BEZ 0x0F - Равно нулю ARG == 0 - сначала берётся ARG. Формат: 0x0F РАЗМЕР
  • UP 0x10 - Больше ARG1 > ARG2 - сначала берётся ARG1. Формат: 0x10 РАЗМЕР
  • DOWN 0x11 - Меньше ARG1 < ARG2 - сначала берётся ARG1. Формат: 0x11 РАЗМЕР
  • EQ 0x12 - Равно ARG1 == ARG2 - сначала берётся ARG1. Формат: 0x12 РАЗМЕР
  • NEQ 0x13 - Не равно ARG1 != ARG2 - сначала берётся ARG1. Формат: 0x13 РАЗМЕР
  • UPNE 0x14 - Не больше (меньше или равно) ARG1 <= ARG2 - сначала берётся ARG1. Формат: 0x14 РАЗМЕР
  • DOWNE 0x15 - Не меньше (больше или равно) ARG1 >= ARG2 - сначала берётся ARG1. Формат: 0x15 РАЗМЕР

Работа с памятью

Note

Комманда для записи в память получает адрес в ARG1, а данные - в ARG2.

  • MWRT 0x16 - Запись ARG1 ARG2 - сначала берётся ARG1. Формат: 0x16 РАЗМЕР
  • MREAD 0x17 - Чтение ARG. Формат: 0x17 РАЗМЕР

Работа с указателем

  • GETSP 0x18 - Получить SP. Формат: 0x18
  • SETSP 0x19 - Получить SP и записать. Формат: 0x19

Взаимодействие с пользователем

Note

Формат следующий:

  • Вывод строки (Запись на стек строки и числа 0x00)
  • Ввод символа (Запись на стек 0x01)
  • Завершение со статусом (Запись на стек WORD-статуса и числа 0x02)
  • Вызов BASH (Запись на стек строки и числа 0x03)
  • Запрос к RANDOM (Запись на стек числа 0x04)
  • Установка SEED (Запись на стек WORD-SEED и числа 0x05)
  • SYSCALL 0x1A - Выполнить вызов к ядру (ARG). Формат: 0x1A

Управление стеком

Note

Как работает SWAP? Команда SWAP меняет местами два элемента на стеке, сдвигая другие. Она принимает количество элементов в качестве параметра. Элементы сдвигаются влево.

  • SWAP 0x1B - Swap (ARG1 ARG2). Формат: 0x1B РАЗМЕР
  • COPY 0x1C - Скопировать последний элемент (ARG). Формат: 0x1C РАЗМЕР
  • SET 0x1D - Установить указатель виртуального стека (ARG). Формат: 0x1D
  • MOV 0x1E - Переключить стек (виртуальный/обычный). Формат: 0x1E

Функции

  • CALL 0x1F - Аналогична инструкции JMP, но сохраняет стек вызовов (32 элемента). Формат: 0x1F
  • RET 0x20 - Возврат из функции. Формат: 0x20

Символы

Note

Инструкция GLOBAL нужна для обозначения точки входа. Это комбинация инструкций PUSH и JMP. Пример:

global db main
      ; Код, не исполняемый при старте
main:
      ; Точка входа
  • GLOBAL - Ассемблерная инструкция, означает метку для старта.
  • EXIT - Ассемблерная инструкция, означает немедленное завершение программы.
  • RCALL - Ассемблерная инструкция, означает вызов функции (rcall тип имя).