Уровень 25: Проверка на минус

Открыть уровень →Где это в машине →

Задание

Цель: Изучите условный переход JN (Jump if Negative). Запустите тестовую программу и убедитесь, что переход работает.

JN (Jump if Negative) — условный переход, срабатывающий, когда бит 7 результата = 1 (отрицательное число в дополнительном коде — способ хранения отрицательных чисел, где старший бит играет роль знака: 1 — минус; подробнее — в статье о дополнительном коде).

Главная идея уровня: процессор умеет отвечать на вопрос «каким был результат»: бит 7 в дополнительном коде — это знак, и JN прыгает, когда результат отрицательный. Флаги превращают арифметику в решения.

Материалы по теме

Решение для самопроверки

Сначала попробуйте собрать схему сами. Решение ниже — способ свериться, если застряли или уже справились.

Что должно получиться: JN срабатывает и Acc = 99 — переход по отрицательному результату работает.

Как это работает аппаратно:

  1. Splitter извлекает бит 7 из выхода ALU (флаг Negative).
  2. Элемент AND комбинирует: Decoder.JumpCond AND Bit7.
  3. Элемент OR комбинирует: JumpUncond OR (JumpCond AND Bit7) → PC.Load.
  4. При PC.Load=1 счётчик команд загружает адрес перехода из операнда.

5 − 10 = 251 выглядит странно, но работает благодаря арифметике по модулю 256: переполнение просто отбрасывается, и 251 — это то же самое, что −5 в дополнительном коде. Бит 7 при этом равен 1 — признак отрицательного числа.

Программа-тест:

  • LDA 10 → Acc = 10
  • STA 10 → RAM[10] = 10
  • LDA 5 → Acc = 5
  • SUB 10 → Acc = 5 − RAM[10] = 5 − 10 = 251 (бит 7 = 1, отрицательное)
  • JN negative → переход (бит 7 = 1)
  • LDA 99 → Acc = 99
  • HLT

Если JN работает, Acc = 99. Если нет — Acc останется 251.

Нажмите «Выполнить», затем «Чекпойнт».

Проверь себя

Почему 5 − 10 даёт 251, и JN считает это отрицательным?

Арифметика по модулю 256: 251 — это −5 в дополнительном коде, бит 7 = 1 — признак отрицательного числа.