Инструкции загрузки и сохранения
Инструкции по загрузке и сохранению довольно просты. Они перемещают байты между ОЗУ и регистрами. Они очень похожи друг на друга, поэтому мы рассмотрим их в одной главе.
Для начала, как в случае с АЛУ, нам нужно что-то, что указывало бы в регистре инструкции IR на то, что это инструкции загрузки или сохранения. На инструкции для АЛУ нам указывал включенный 0-й бит IR. Для инструкций другого типа этот бит должен быть выключен. Поэтому мы можем подключить вентиль НЕ в 0-му биту IR, и включение выхода этого вентиля будет сообщать о том, что у нас другой тип инструкции. В нашем компьютере есть восемь типов инструкций, которые не являются инструкциями АЛУ. Для указания конкретного типа инструкции мы будем использовать так же три следующие бита регистра IR. Эти три бита так же будут поступать на 3х8 дешифратор в контрольной секции. Чтобы во время инструкций для АЛУ из этого дешифратора не выходили сигналы, мы подключим каждый выход дешифратора ко входам вентилей И. Вторые входы вентилей соединим вместе и подключим к выходу выше упомянутого вентиля НЕ. Таким образом, инструкции загрузки и сохранения будут работать только при условии, что 0-й бит IR выключен.
Эта глава посвящена инструкциям, использующим первые два выхода декодера, которые включаются, когда IR начинается с 0000 или 0001. Первая инструкция перемещает байт из ОЗУ в регистр и называется она инструкция «загрузки» (Load Instruction). Вторая перемещает байт из регистра в ОЗУ и называется инструкцией «сохранения» (Store Instruction).
Шаг 4 одинаков для обеих инструкций: указанный 4 и 5 битами IR регистр подключается к шине и устанавливается в MAR, таким образом выбирается адрес в ОЗУ. На пятом шаге биты 6 и 7 IR Выбирают регистр процессора. При инструкции загрузки (0000), RAM включается на шину и устанавливается Reg B. При инструкции сохранения (0001) Reg B включается на шину и устанавливается RAM. Во время шага 6 ничего не происходит.
Код инструкции загрузки – 0000, а код инструкции сохранения – 0001. Оставшиеся четыре бита, как и в инструкции АЛУ, определяют два регистра. Разница в том, что один из регистров будет указывать на адрес в ОЗУ, а второй будет копируемым или сохраняемым регистром. Теперь в нашем языке появилось два новых слова:
Инструкции Данных
Инструкция Data – довольно интересная инструкция. Ода просто перемещает байт из ОЗУ в регистр процессора, как и инструкция Load. Но отличие в том, что в регистр загружается байт, идущий сразу за байтом инструкции. Таким образом, эта инструкция состоит из двух байт. Первый байт – это сама инструкция, а второй – данные, которые будут перемещены в регистр. Процессору легко найти эти данные, так как на момент появления инструкции в IR, IAR уже был обновлен (увеличен на единицу) и теперь указывает адрес следующего байта. Ниже приведен код инструкции Data. Биты 0, 1, 2 и 3 – 0010. Биты 4 и 5 не содержатся во втором байте.
С помощью этой инструкции, байт из IAR копируется в MAR, а на шаге 5 из ОЗУ скопировать байт в нужный регистр ЦП. Так как следующий байт это данные, нам нужно как-то его «перешагнуть». Для этого нам необходимо еще раз прибавить 1 к IAR. Делается это так же, как на шагах 1 и 3. На шаге 4, когда мы отправляем IAR в MAR, мы воспользуемся тем, что АЛУ, на самом деле, всегда что-то складывает (а именно то, что находится на шине и TMP либо 1, если активен Bus1). Поэтому на шаге 4, мы еще включим Bus1 и ‘s’ ACC. Так АЛУ возьмет значение IAR из шины, прибавит к нему единицу и сохранит результат в Аккумулятор (ACC). На шаге 5 данные перемещаются в регистр, и на шаге 6 активируется ACC на шину и устанавливается IAR. Степпер сбрасывается и процессор «перепрыгивает» байт с данными.
А вот и новые слова:
Второе "Великое изобретение"
Первое великое изобретение заключалось в хранении в ОЗУ инструкций и поочередном их исполнении процессором. Но тактовый генератор работает очень быстро, а объем памяти ограничен. Таким образом, наша программа закончится очень быстро и все перестанет работать. Но нам повезло, ведь решение этой проблемы уже изобретено! Решение крайне простое, но очень важное. Это инструкция Jump. Эта инструкция просто изменяет содержимое регистра IAR, чтобы процессор переходил не к следующему адресу ОЗУ, а к любому другому. Полное название этой инструкции «Инструкция Регистра перехода» (Jump Register Instruction). Фактически цель этой инструкции – переместить содержимое Reg B в IAR. Это код инструкции:
Компьютер выполняет инструкции из ОЗУ, одну за другой. И вдруг одна из инструкций изменяет содержимое IAR. Что произойдет дальше? Далее компьютер выполнит не следующую за предыдущей инструкцию, а ту, адрес которой записан в IAR, а потом он выполнит следующую за ней инструкцию, за ней следующую, и так далее, пока не появится следующая инструкция с «прыжком». Для осуществления прыжка нам понадобится всего один шаг. На шаге 4, выбранный регистр устанавливается в IAR и на этом все.
И, конечно же, новое слово:
Другой прыжок
Рассмотрим еще один тип прыжка. Он похож на инструкцию Data, тем, что тоже использует два байта.
Обратите внимание: США делают ставку на квантовые компьютеры.
Это код инструкции:Биты 4, 5, 6 и 7 в данной инструкции не используются. Называется эта инструкция просто «Jump». Используется в случае, когда вы знаете адрес в ОЗУ, куда нужно перейти. А вот инструкция Jump Register используется в случае, если адрес, на который надо перейти, вычисляется.
С помощью инструкции Jump можно создавать цикл инструкций, которые будут выполняться снова и снова. Например, ваша программа может состоять из всего 50 инструкций в ОЗУ, а последняя Jump возвращает компьютер к первой инструкции.
Как и в случае с инструкцией Data, IAR уже содержит необходимый нам байт. Но в отличие от инструкции Data, нам не нужно прибавлять 1 к IAR во второй раз, так как мы все равно собираемся его заменить. Так что нам понадобится всего два шага. На шаге 4, мы отправляем IAR в MAR. На шаге 5, мы перемещаем выбранный байт ОЗУ в IAR. На шаге 6 никаких действий не выполняется. Вот как это устроено:
И еще одно новое слово:
Третье "Великое изобретение"
Наконец пришло время для третьего изобретения, которое делает компьютер компьютером. Это похоже на инструкцию Jump, но прыжки здесь совершаются не всегда. Конечно, прыгать или нет – это всего два варианта, но за то, чтобы определить, что произойдет, нужен всего один бит. В этой главе мы поговорим о том, откуда взялась эта часть процессора. Помните, откуда выходит бит переноса, который потом возвращается в АЛУ? Он выходит из Сумматора или из одного из Сдвигателей (Шифтеров). Если сумма превышает 255, включается бит переноса. Если в Левом Шифтере левый бит включен или в Правом Шифтере правый бит включен, то бит переноса АЛУ так же включится.
Еще есть бит, который сообщает о равенстве двух входящих в АЛУ байтов. А еще есть бит, который говорит о том, АЛУ получило результат, равный нулю.
Эти биты – единственное, что, пока, не нашло свое применение в процессоре. Называются они «Флагами» и используются для создания инструкции «Перейти, если». С помощью флагов, принимается решение, перейти к следующей инструкции или «прыгнуть» на какой-то другой адрес.
Любые вычисления АЛУ готовы на 5 шаге, соответственно состояние флагов актуально именно на этом шаге. И теперь нам нужно как-то сохранить их состояние именно на момент 5 шага.
Сохранять состояние этих битов мы будем в отдельный регистр, который так и назовем «FLAG». Мы будем использовать только 4 его бита. Биты флагов АЛУ будут подключены к входу регистра Flag, а устанавливаться он будет во время 5 шага (Мы не рисовали это соединение ранее, так как не были знакомы с регистром флагов. В полной схеме контрольной секции, мы отобразим это соединение). Соответственно, байт будет храниться в регистре Flag в неизменном виде вплоть до следующего 5 шага. Комбинация битов флага и инструкция перехода IF (Если) – есть то самое третье и последнее великое изобретение, которое делает компьютеры именно такими, какими мы их видим сегодня. Рассмотрим код инструкции «Перейти, если». Вторые четыре бита указывают, какой из флагов нужно проверить. Если указанный флаг включен, то скачку быть. Второй байт инструкции сообщает адрес, на который нужно перепрыгнуть.
Теперь рассмотрим схему данной инструкции.
Шаг 4 отправляет IAR в MAR и теперь мы готовы прыгнуть по адресу, находящемуся в ОЗУ сразу за инструкцией. Но ведь прыжок может и не понадобиться. АЛУ не получает инструкцию, поэтому выполняет сложение шины и TMP/Bus1. Шаг 4 включает Bus1 и устанавливает ACC, поэтому АЛУ прибавляет к IAR единицу, а результат отправляется в Аккумулятор.
Шаг 5 отправляет байт из Аккумулятора в IAR. Теперь, если прыжок не понадобится процессор перейдет не на следующий байт в ОЗУ (где хранится адрес для прыжка), а перепрыгнет «его», перейдя к следующей инструкции.
Шаг 6 включает один из входов вентиля 3И. Еще один вход этого вентиля включен инструкцией. Третий же вход вентиля 3И включится только в том случае, если включен именно тот флаг, который указан в инструкции (для этого флаги и последние 4 бита инструкции подключены к вентилям И). Если флаг окажется включен, вентиль ИЛИ включит свой выход и байт из ОЗУ переместится в IAR и прыжок будет осуществлен.
Теперь пополним копилку слов для нашего компьютерного языка:
Так же можно проверять сразу несколько флагов за один раз. Фактически можно придумать целых 16 комбинаций:
Инструкция очистки флагов
Флаги – отличная штука, но у них есть один побочный эффект. Если вы выполните сложение или сдвиг, может включиться флаг переноса. Это можно использовать для инструкции Jump If. Так же этот флаг используется как входной бит переноса для операций суммы или сдвига. Благодаря этому флагу, мы можем складывать числа больше 255 и производить сдвиг битов из одного регистра в другой.
Но проблема возникнет, когда вы попытаетесь сложить два однобайтовых числа, а флаг переноса остался от предыдущей операции. В таком случае, вы рискуете при сложении 2+2 получить 5! Так давайте же создадим инструкцию, которую будем использовать перед сложением или сдвигом во избежание ложного переноса. Биты 4, 5, 6 и7 в данной инструкции не используются.
Схема соединений этой инструкции одновременно и простая и сложная. Мы ничего не выдаем на шину, поэтому на первом входе АЛУ будет 0000 0000. Еще мы включим Bus 1, поэтому на втором входе АЛУ окажется 0000 0001. Эта инструкция начинается с 0, поэтому на входе инструкции АЛУ 000, а это значит, что АЛУ будет выполнять сложение 0 и 1. Так как бит переноса мог быть активирован предыдущими инструкциями, то результатом сложения может быть как 0000 0001, так и 0000 0010. Но в обоих случаях флаг переноса будет выключен, как и флаги «ноль», «а больше» и «равенство». Таким образом, мы устанавливаем значение 0000 в регистр флагов.
Пришло время записать еще одно новое слово:
#компьютеры #наука и техника #образование #начинающим радиолюбителям #электроника начинающим #процессоры
Часть 8 - Назад Далее - Часть 10
Еще по теме здесь: Новости науки и техники.
Источник: Как устроен компьютер? Часть 9 (Инструкции Jump).