Суть Трассируйте небольшие программы в игрушечном наборе инструкций, предсказывайте состояние регистров и счётчика команд, декодируйте слово машинного кода и считайте такты.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min
Понять процессор — значит уметь прогонять его в голове. Каждый фрагмент ниже — это крошечная программа или одно слово машинного кода; прочитайте его, прошагайте цикл и предскажите состояние так, как его произвёл бы CPU.
Цель
Отработайте ключевой навык юнита: взять инструкции и начальное состояние, вручную прошагать цикл fetch-decode-execute и считать получившиеся значения регистров, значение счётчика команд (program counter), смысл машинного кода и число тактов.
Эти фрагменты используют игрушечный набор инструкций из юнита: каждая инструкция — 2 байта, счётчик команд сдвигается на 2 после каждой инструкции, кроме JUMP, а регистры — R0 и R1.
После выполнения всех четырёх инструкций какое значение хранится по адресу 202?
Heads-up STORE 202, R0 пишет значение из регистра R0, а не содержимое какого-то адреса памяти. К этому моменту R0 хранит сумму 13, а не 9.
Heads-up Единственная арифметическая инструкция здесь — ADD, которая складывает R0 и R1. Вычитания нет; 4 + 9 = 13.
Heads-up R0 загружается из mem[201] = 4 в первой инструкции, так что его начальный 0 перезаписан до ADD. Результат полностью определён: 13.
Фрагмент 2 — счётчик команд и переход
; Начальное состояние: PC = 0, R0 = 0; Каждая инструкция — 2 байта.0: LOAD R0, 2002: JUMP 64: ADD R0, R1 ; никогда не достигается6: STORE 202, R0
Викторина
Completed
Какая инструкция по адресу 4 НЕ выполнится, и каким будет значение счётчика команд сразу после выполнения JUMP по адресу 2?
Heads-up JUMP переопределяет обычный сдвиг на +2. Он записывает свою цель (6) в PC, поэтому адрес 4 перешагивается целиком.
Heads-up PC устанавливается в цель перехода 6, а не сдвигается дальше неё. Адрес 4 пропущен, и следующая выборка — по адресу 6.
Heads-up PC = 6 верно, но это значит, что выборка по адресу 6 (STORE) как раз выполнится. Перешагивается инструкция ADD по адресу 4.
Фрагмент 3 — декодирование слова машинного кода
; Кодировка 16-битной инструкции:; биты 15-12 (4 бита) = опкод; биты 11-8 (4 бита) = номер регистра-приёмника; биты 7-0 (8 бит) = непосредственное значение (immediate); опкод 0001 = LOAD-IMMEDIATE (положить константу в регистр)Слово в памяти: 0001 0011 00010010
Викторина
Completed
Декодируя это 16-битное слово, какую инструкцию оно представляет?
Heads-up Поле immediate — это 8-битное двоичное значение, а не шестнадцатеричное. Двоичное 00010010 = 16 + 2 = 18, а не 12.
Heads-up Опкод — это старшие 4 бита, 0001 (LOAD-IMMEDIATE). 0011 — это поле регистра-приёмника, которое называет регистр 3, а не опкод.
Heads-up То, инструкция ли байты, задаётся счётчиком команд, а не самими байтами. Раз PC указывает сюда, поля декодируются однозначно: LOAD-IMMEDIATE, регистр 3, значение 18.
Фрагмент 4 — подсчёт тактов
; Программа выполняет 6 инструкций в теле плотного цикла.; На этом CPU каждая инструкция занимает ровно 1 такт (clock cycle).; Тело цикла выполняется 100 раз. Тактовая частота CPU — 2 ГГц; (2 000 000 000 тактов в секунду).
Викторина
Completed
Сколько всего тактов потребляет тело цикла и сколько примерно времени это занимает на частоте 2 ГГц?
Heads-up Каждая итерация заново выполняет тело цикла, поэтому такты умножаются на число итераций: 6 x 100 = 600, а не 6.
Heads-up Число тактов верное, но время ошибочно в миллион раз. 600 тактов / 2e9 тактов в секунду = 3e-7 с = 300 наносекунд, а не миллисекунд.
Heads-up Каждая итерация выполняет все 6 инструкций, и каждая занимает 1 такт, так что итерация стоит 6 тактов. 100 итераций x 6 = 600.
Итог
На каждый вопрос здесь отвечали, прошагав один и тот же цикл: выбрать инструкцию, на которую указывает PC, декодировать опкод и операнды, исполнить (LOAD и STORE двигают данные между памятью и регистрами; ADD задействует ALU над значениями регистров; JUMP перезаписывает PC), затем сдвинуть PC на размер инструкции — если только JUMP не задал его напрямую. Машинный код декодируется разбиением слова на поля опкода и операнда. А время работы — это просто инструкции x итерации x такты-на-инструкцию, делённые на тактовую частоту. Прошагайте вручную — и процессор перестанет быть чёрным ящиком.