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