Инструкции управления потоком: Загрузка, Сохранение, Данные и Условные переходы в процессоре

Инструкции загрузки и сохранения: обмен с памятью

Инструкции загрузки (Load) и сохранения (Store) выполняют одну из базовых функций процессора — перемещение данных между оперативной памятью (ОЗУ) и внутренними регистрами. Их принцип работы интуитивно понятен: одна копирует данные из памяти в регистр, а другая — из регистра в память. Из-за схожести их логики удобно рассматривать их вместе.

Для их идентификации, как и в случае с инструкциями АЛУ, используется регистр инструкций (IR). Если младший (0-й) бит IR равен 0, это сигнализирует, что инструкция не является арифметико-логической. Конкретный тип из восьми возможных определяется следующими тремя битами IR. Эти биты подаются на 3х8 дешифратор в управляющем блоке. Чтобы сигналы с дешифратора активировались только для не-АЛУ инструкций, каждый его выход пропускается через логический элемент И, второй вход которого соединён с инвертированным 0-м битом IR. Таким образом, цепь сработает только когда 0-й бит выключен.

В этой части рассматриваются первые два типа: загрузка (код 0000) и сохранение (код 0001). Оставшиеся четыре бита в инструкции определяют два регистра: один указывает адрес в ОЗУ, а второй — регистр-источник или регистр-приёмник данных.

Алгоритм выполнения для обеих инструкций включает общие шаги. На шаге 4 регистр, указанный битами 4-5 IR, помещается в регистр адреса памяти (MAR), выбирая ячейку ОЗУ. На шаге 5 биты 6-7 выбирают регистр процессора (Reg B). Ключевое различие: при загрузке (0000) данные из ОЗУ передаются на шину и записываются в Reg B, а при сохранении (0001) данные из Reg B передаются на шину и записываются в ОЗУ. Шаг 6 является холостым.

В ассемблерный язык нашего процессора добавляются две новые мнемоники: LOAD и STORE.

Инструкция Data: загрузка непосредственного значения

Инструкция Data представляет собой особый тип загрузки. Её особенность в том, что загружаемое значение находится не по какому-то адресу, а следует непосредственно за кодом самой инструкции в памяти. Таким образом, эта инструкция занимает два байта: первый — код операции (0010), второй — само значение (данные). Процессору легко найти эти данные, так как к моменту декодирования инструкции счётчик команд (IAR) уже увеличен и указывает как раз на этот второй байт.

Выполнение инструкции Data требует аккуратной работы со счётчиком команд. На шаге 4 значение IAR отправляется в MAR для чтения байта данных. Одновременно, используя АЛУ, к значению IAR прибавляется единица (активируется сигнал Bus1), и результат сохраняется в аккумулятор (ACC). Это подготовка к «перепрыгиванию» байта данных. На шаге 5 данные из ОЗУ перемещаются в целевой регистр процессора. Наконец, на шаге 6 значение из ACC (IAR+1) записывается обратно в IAR, эффективно сдвигая указатель за пределы загруженных данных, и цикл выполнения инструкций продолжается.

Для этой инструкции в язык вводится мнемоника DATA.

Второе фундаментальное изобретение: безусловный переход

Первым великим изобретением была архитектура с хранимой программой. Однако простого последовательного выполнения команд из памяти недостаточно. Тактовая частота высока, а объём памяти конечен, поэтому программа быстро завершится. Решением стала инструкция безусловного перехода (Jump). Её суть — изменить содержимое счётчика команд (IAR), заставив процессор начать выполнение не следующей инструкции, а команды по совершенно другому адресу. Это открывает возможность создания циклов и сложной логики потока выполнения.

Существует два типа инструкций перехода. Первая — Jump Register — перемещает содержимое указанного регистра (Reg B) напрямую в IAR. Выполняется она всего за один шаг (шаг 4). Это полезно, когда адрес перехода вычисляется в ходе работы программы.

Для неё вводится мнемоника JUMPR.

Прямой переход по адресу

Вторая разновидность — инструкция Jump — похожа на Data тем, что также является двухбайтовой. Второй байт содержит конкретный адрес, на который нужно перейти. Она используется, когда адрес перехода известен на этапе написания программы (например, для организации цикла).

Обратите внимание: США делают ставку на квантовые компьютеры.

Код этой инструкции — 0011.

Её выполнение требует двух шагов. На шаге 4 IAR (указывающий на байт с адресом) отправляется в MAR. На шаге 5 значение, прочитанное из этой ячейки ОЗУ (нужный адрес), записывается непосредственно в IAR, осуществляя переход. Шаг 6 не активен.

Мнемоника для этой инструкции — JUMP.

Третье великое изобретение: условный переход

Настоящую мощь и гибкость компьютерам приносит третье изобретение — условный переход. Это логическое развитие инструкции Jump: переход происходит не всегда, а только при выполнении определённого условия. Для проверки условий используются специальные биты состояния — флаги, которые выставляет арифметико-логическое устройство (АЛУ) после выполнения операций. Основные флаги: перенос (Carry), нулевой результат (Zero), равенство (Equal) и «больше» (Greater).

Состояние этих флагов актуально на 5-м шаге выполнения инструкции АЛУ. Чтобы сохранить их для последующей проверки, в процессор добавляется специальный регистр FLAG, куда биты флагов записываются именно на этом шаге.

Инструкция условного перехода (Jump If) имеет код 0100. Младшие четыре бита указывают, какой именно флаг нужно проверить. Как и обычный Jump, она двухбайтовая: второй байт содержит адрес перехода на случай, если условие истинно.

Логика работы хитрее. На шаге 4 IAR отправляется в MAR для чтения адреса перехода, и одновременно АЛУ прибавляет к IAR единицу, сохраняя результат (IAR+1) в аккумулятор. На шаге 5 это значение (IAR+1) записывается обратно в IAR. Теперь, если переход не понадобится, процессор просто продолжит выполнение со следующей за адресом инструкции, «перепрыгнув» блок с адресом.

Ключевое решение принимается на шаге 6. Схема проверяет, совпадает ли состояние указанного в инструкции флага с его фактическим значением в регистре FLAG. Если да, то включается цепь, которая перезаписывает IAR значением, прочитанным из ОЗУ на шаге 4 (тем самым адресом перехода). Если условие ложно, IAR остаётся равным IAR+1, и переход не происходит. Комбинируя проверки нескольких флагов, можно реализовать до 16 различных условий (например, «перейти, если больше или равно»).

В язык добавляется мнемоника JUMPI (Jump If).

Таблица возможных комбинаций проверяемых флагов:

Инструкция сброса флагов

Флаги — мощный инструмент, но они требуют аккуратного обращения. Например, флаг переноса (Carry) используется не только для условных переходов, но и как вход для операций сложения и сдвига, позволяя работать с много-байтовыми числами. Проблема возникает, если флаг переноса остался включённым от предыдущей операции. Тогда при сложении 2+2 можно получить 5 из-за учёта «лишнего» переноса.

Для предотвращения таких ошибок вводится инструкция сброса флагов (код 0101). Её выполнение заставляет АЛУ сложить 0 (на шине) и 1 (сигнал Bus1) с учётом текущего, возможно включённого, флага переноса. Результат (1 или 2) не важен; ключевое в том, что эта операция гарантированно устанавливает все биты в регистре FLAG в нулевое состояние, подготавливая чистую среду для последующих вычислений.

Мнемоника для этой инструкции — CLF (Clear Flags).

#компьютеры #наука и техника #образование #начинающим радиолюбителям #электроника начинающим #процессоры

Часть 8 - Назад Далее - Часть 10

Еще по теме здесь: Новости науки и техники.

Источник: Как устроен компьютер? Часть 9 (Инструкции Jump).