Skip to main content

32. Система команд

32. Система команд (ISA)

🎯 Цель урока
Разработать полный набор инструкций для нашего 8-битного процессора.

🧠 Фаза 2: Теория (15 мин)

Что такое ISA?

ISA (Instruction Set Architecture) — это “контракт” между программистом и процессором:

  • Какие инструкции понимает процессор
  • Какой формат у инструкций
  • Какие регистры доступны
  • Как работает адресация

Классы ISA

КлассПримерыОсобенности
CISCx86, x64Много сложных инструкций
RISCARM, RISC-VПростые инструкции, много регистров
StackJVMОперанды на стеке

Наш процессор: простой CISC (для обучения).


📋 Наша ISA: SAP-1 (Simple As Possible)

Регистры

РегистрБитОписание
A8Аккумулятор (результат ALU)
B8Второй операнд
IR8Регистр инструкций
PC4Программный счётчик (16 адресов)
OUT8Выходной регистр
FLAGS2Z (Zero), C (Carry)

Формат инструкции

    7  6  5  4 │ 3  2  1  0
   ┌──────────┼───────────┐
   │  OPCODE  │  OPERAND  │
   └──────────┼───────────┘
       4 бита     4 бита
    (16 команд) (0-15 / адрес)

Полный набор инструкций

OpcodeHexМнемоникаОперацияФлаги
00000NOPНет операции-
00011LDA addrA = RAM[addr]Z
00102ADD addrA = A + RAM[addr]Z, C
00113SUB addrA = A - RAM[addr]Z, C
01004STA addrRAM[addr] = A-
01015LDI nA = n (immediate)Z
01106JMP addrPC = addr-
01117JC addrif C: PC = addr-
10008JZ addrif Z: PC = addr-
10019AND addrA = A & RAM[addr]Z
1010AOR addrA = A | RAM[addr]Z
1011BXOR addrA = A ^ RAM[addr]Z
1100CNOTA = ~AZ
1101DOUTOUTPUT = A-
1110EINPA = INPUTZ
1111FHLTОстановить 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

💡 Режимы адресации

РежимПримерОписание
ImmediateLDI 5Операнд в самой инструкции
DirectLDA 10Операнд по адресу в памяти
ImpliedHLTНет операнда

Наш процессор поддерживает только эти три (для простоты).


📝 Мини-задания

Напиши код инструкции “LDA 7” в hex.

Ответ: 0x17 (opcode 0001, operand 0111)

Что делает программа: 50, 2F, D0, 60?

Ответ:

  • 50: LDI 0 (A=0)
  • 2F: ADD 15 (A += RAM[15])
  • D0: OUT (вывести A)
  • 60: JMP 0 (вернуться к началу) Бесконечный цикл прибавления RAM[15] и вывода!

Как реализовать умножение на 2?

Ответ: ADD с тем же адресом: A = A + A Или сдвиг влево (если есть инструкция SHL)


✅ Чеклист

  • Знаю формат инструкции
  • Понимаю все 16 команд
  • Могу написать простую программу
  • Умею транслировать в машинный код

➡️ Следующий урок

33. Программирование →