32. Система команд
32. Система команд (ISA)
🎯 Цель урока
Разработать полный набор инструкций для нашего 8-битного процессора.
🧠 Фаза 2: Теория (15 мин)
Что такое ISA?
ISA (Instruction Set Architecture) — это “контракт” между программистом и процессором:
- Какие инструкции понимает процессор
- Какой формат у инструкций
- Какие регистры доступны
- Как работает адресация
Классы ISA
| Класс | Примеры | Особенности |
|---|
| CISC | x86, x64 | Много сложных инструкций |
| RISC | ARM, RISC-V | Простые инструкции, много регистров |
| Stack | JVM | Операнды на стеке |
Наш процессор: простой CISC (для обучения).
📋 Наша ISA: SAP-1 (Simple As Possible)
Регистры
| Регистр | Бит | Описание |
|---|
| A | 8 | Аккумулятор (результат ALU) |
| B | 8 | Второй операнд |
| IR | 8 | Регистр инструкций |
| PC | 4 | Программный счётчик (16 адресов) |
| OUT | 8 | Выходной регистр |
| FLAGS | 2 | Z (Zero), C (Carry) |
Формат инструкции
7 6 5 4 │ 3 2 1 0
┌──────────┼───────────┐
│ OPCODE │ OPERAND │
└──────────┼───────────┘
4 бита 4 бита
(16 команд) (0-15 / адрес)
Полный набор инструкций
| Opcode | Hex | Мнемоника | Операция | Флаги |
|---|
| 0000 | 0 | NOP | Нет операции | - |
| 0001 | 1 | LDA addr | A = RAM[addr] | Z |
| 0010 | 2 | ADD addr | A = A + RAM[addr] | Z, C |
| 0011 | 3 | SUB addr | A = A - RAM[addr] | Z, C |
| 0100 | 4 | STA addr | RAM[addr] = A | - |
| 0101 | 5 | LDI n | A = n (immediate) | Z |
| 0110 | 6 | JMP addr | PC = addr | - |
| 0111 | 7 | JC addr | if C: PC = addr | - |
| 1000 | 8 | JZ addr | if Z: PC = addr | - |
| 1001 | 9 | AND addr | A = A & RAM[addr] | Z |
| 1010 | A | OR addr | A = A | RAM[addr] | Z |
| 1011 | B | XOR addr | A = A ^ RAM[addr] | Z |
| 1100 | C | NOT | A = ~A | Z |
| 1101 | D | OUT | OUTPUT = A | - |
| 1110 | E | INP | A = INPUT | Z |
| 1111 | F | HLT | Остановить CPU | - |
📝 Примеры программ
Программа 1: Сложение двух чисел
; Сложить 5 + 3 и вывести результат
Addr Code Мнемоника Комментарий
────────────────────────────────────────
0 5F LDI 15 ; A = 15? Нет, смотри ниже
Правильно:
0 1E LDA 14 ; A = RAM[14] (число 5)
1 2F ADD 15 ; A = A + RAM[15] (+ 3)
2 D0 OUT ; Вывести A
3 F0 HLT ; Стоп
...
14 05 (data) 5 ; Первое число
15 03 (data) 3 ; Второе число
Результат: OUTPUT = 8
Программа 2: Счётчик 0-9
; Считать от 0 до 9, выводить каждое число
Addr Code Мнемоника Комментарий
────────────────────────────────────────
0 50 LDI 0 ; A = 0
1 D0 OUT ; Вывести A
2 2F ADD 15 ; A = A + 1
3 3E SUB 14 ; A - 10 (для проверки)
4 80 JZ 0 ; Если A=10, перейти к 0?
; (сброс, но A уже испорчен!)
Улучшенная версия (с сохранением):
0 1F LDA 15 ; A = счётчик
1 D0 OUT ; Вывести
2 2E ADD 14 ; +1
3 4F STA 15 ; Сохранить
4 3D SUB 13 ; -10 для сравнения
5 86 JZ 6 ; Если =10, конец
6 60 JMP 0 ; Иначе повтор
7 F0 HLT ; Стоп
...
13 0A (data) 10 ; Лимит
14 01 (data) 1 ; Шаг
15 00 (data) 0 ; Счётчик (переменная!)
Программа 3: Чётность числа
; Проверить чётность: вывести 1 если чётное, 0 если нечётное
Addr Code Мнемоника Комментарий
────────────────────────────────────────
0 1F LDA 15 ; Загрузить число
1 9E AND 14 ; AND с 1 (маска младшего бита)
2 86 JZ 6 ; Если 0 → чётное
3 51 LDI 1 ; A = 1 (нечётное)
4 D0 OUT
5 F0 HLT
6 50 LDI 0 ; A = 0 (чётное)
7 D0 OUT
8 F0 HLT
...
14 01 (data) 1 ; Маска
15 07 (data) 7 ; Проверяемое число
🔧 Ассемблер (упрощённый)
Синтаксис
; Комментарий
label: ; Метка
LDA addr ; Инструкция
.data 5 ; Данные
Ручная трансляция
Исходный код:
start:
LDI 0
loop:
OUT
ADD one
JMP loop
one:
.data 1
Трансляция:
Адрес Метка Код
0 start 50 ; LDI 0
1 loop D0 ; OUT
2 25 ; ADD 5 (адрес 'one')
3 61 ; JMP 1 (адрес 'loop')
4 F0 ; HLT (защита)
5 one 01 ; данные: 1
💡 Режимы адресации
| Режим | Пример | Описание |
|---|
| Immediate | LDI 5 | Операнд в самой инструкции |
| Direct | LDA 10 | Операнд по адресу в памяти |
| Implied | HLT | Нет операнда |
Наш процессор поддерживает только эти три (для простоты).
📝 Мини-задания
✅ Чеклист
➡️ Следующий урок
33. Программирование →