diff --git a/BINARY.md b/BINARY.md index a3237ce..69da4d4 100644 --- a/BINARY.md +++ b/BINARY.md @@ -1,5 +1,6 @@ # Структура файла Файл содержит заголовок, сигнатуру и исполняемый код. +Файл является 16-битным. В качестве порядка размещения байт используется **LITTLE-ENDIAN** в независимости от платформы. ## Заголовок Его структура следующая: diff --git a/BINCOM.md b/BINCOM.md index e201854..295c33b 100644 --- a/BINCOM.md +++ b/BINCOM.md @@ -26,6 +26,7 @@ void (*operations[])(void) = { }; ``` ## Справочник + ### Стек - **PUSH 0x00** - Запись данных на стек. Формат: **0x00 РАЗМЕР ДАННЫЕ_1 ... ДАННЫЕ_N** - **POP 0x01** - Удаление данных со стека. Формат: **0x01 РАЗМЕР** @@ -45,4 +46,53 @@ void (*operations[])(void) = { - **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 +- **MUL 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**): +> ```c +> 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 РАЗМЕР ДАННЫЕ_1 ... ДАННЫЕ_N** +- **MREAD 0x17** - Чтение **ARG**. Формат: **0x17 РАЗМЕР** +## Работа с указателем +- **GETSP 0x18** - Получить SP. Формат: **0x18** +- **SETSP 0x19** - Получить SP и записать. Формат: **0x19** +## Взаимодействие с пользователем +> [!NOTE] +> Формат следующий: +> - Вывод строки (Запись на стек строки и числа **0x00**) +> - Ввод символа (Запись на стек **0x01**) +> - Завершение со статусом (Запись на стек **WORD-статуса** и числа **0x02**) +- **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A** \ No newline at end of file