awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

Процессор: постройте симулятор CPU

Суть Постройте работающий программный симулятор игрушечного CPU — регистры, счётчик команд, память и цикл fetch-decode-execute — и прогоните через него настоящую программу в машинном коде.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 220 min

Вы трассировали игрушечный CPU вручную. Теперь сделайте машину настоящей: напишите программу, которая И ЕСТЬ CPU. Когда ваш цикл fetch-decode-execute прогонит кусок машинного кода и положит нужное число в нужную ячейку памяти, процессор перестанет быть абстракцией и станет тем, что вы построили.

Цель

Превратите ментальную модель юнита в работающий код. Вы реализуете состояние игрушечного CPU (регистры, счётчик команд, память), его набор инструкций и цикл fetch-decode-execute, затем подадите ему программу в машинном коде как байты и увидите, как он вычисляет верный ответ — доказав, что понимаете цикл, заставив его исполняться.

Проект
0 из 6
Цель

Реализуйте программный симулятор игрушечного CPU из юнита на любом языке. Он должен держать собственное состояние, декодировать сырые байты машинного кода, выполнять цикл fetch-decode-execute до остановки и выдавать верное итоговое состояние памяти и регистров для заданной программы.

Требования
Критерии приёмки
  • Программа-пример со сложением печатает трассировку из четырёх циклов, заканчивающуюся mem[202] = 42 и PC = 8, в точности как разобранный пример из урока.
  • Декодирование выполняется из сырых байтов/битов (опкод и регистр извлекаются из байта 0), а не из заранее разобранных объектов инструкций — подача других байтов запускает другую программу без изменения кода.
  • Программа с JUMP в трассировке наглядно пропускает инструкцию, через которую перепрыгивает, а значение PC после JUMP равно цели перехода, а не PC + 2.
  • Короткая заметка (несколько предложений), объясняющая своими словами, где в вашем коде живут шаги Fetch, Decode и Execute и как счётчик команд движет цикл.
Senior-стретч
  • Добавьте условное ветвление: опкод JUMP-IF-ZERO плюс однобитный флаг нуля, устанавливаемый ADD, затем напишите программу, которая через него реализует цикл обратного отсчёта (декремент R0, пока он не достигнет нуля) — доказав, что циклы — это просто условные переходы.
  • Добавьте счётчик тактов (1 такт на инструкцию) и сообщайте общее число тактов и смоделированное время работы при принятой тактовой частоте (например, 2 ГГц), связав трассировку с реальным временем.
  • Соберите вручную чуть большую программу (например, сумму четырёх чисел по адресам 200-203 в 204 через цикл) в байты машинного кода сами, затем прогоните её — отрабатывая работу компилятора по переводу замысла в набор инструкций.
  • Напишите крошечный ассемблер: пусть он принимает текст вроде 'LOAD R0, 200' и выдаёт верную 2-байтную кодировку, чтобы писать программы в мнемониках, а не в сырых байтах.
Итог

Построение симулятора заставляет каждую идею юнита стать конкретной: регистры и счётчик команд — это просто переменные, память — это просто массив, машинный код — это просто загружаемые байты, а цикл fetch-decode-execute — это буквальный цикл, читающий байты, на которые указывает PC. Когда ваша трассировка совпадёт с уроком цикл за циклом, а JUMP наглядно перенаправит PC, вы докажете, что процессор — не магия, а цикл, который вы можете написать сами за вечер.

Продолжить восхождение ↑Идея ассемблера
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.