Деление двух значений, хранящихся в памяти

Шаг 1. Загрузить в регистр значение из памяти.

Шаг 2. Загрузить в другой регистр другое значение из памяти.

Шаг 3. Если второе значение равно нулю, перейти к шагу 6.

Шаг 4. Разделить содержание первого регистра на содержание второго регистра и поместить результат в третий регистр.

Шаг 5. Сохранить содержание третьего регистра в памяти.

Шаг 6. Стоп.

Пример машинного языка

Рассмотрим, как закодированы команды в типичной машине, описанной в приложении В и представленной на рис. 2.2. Она имеет 16 регистров общего назначения и 256 ячеек памяти, каждая емкостью восемь битов. Мы маркировали регистры значениями от 0 до 15, а ячейкам памяти присвоили адреса со значениями от О до 255. Затем мы представили эти метки и адреса в двоичной системе счисления и сжали получившийся код при помощи шестнадцатеричного представления. Следовательно, в нашей машине регистры маркированы значениями от 0 до F, а адреса ячеек памяти имеют значения от 00 до FF.

Закодированная машинная команда состоит обычно из двух частей: поля кода операции (op-code field) и поля операнда (operand field). Набор битов, расположенный в поле кода операции, обозначает, какая из элементарных операций, таких как операции сохранения, сдвига, XOR или перехода, запрашивается командой. Набор битов, находящийся в поле операнда, содержит подробные сведения об объектах, участвующих в операции, определенной кодом операции. Например, в случае команды сохранения в поле операнда содержится информация о том, в каком регистре находятся данные, которые нужно сохранить, и какая ячейка памяти должна получить эти данные.

Весь язык нашей машины (приложение В) состоит из 12 основных команд, каждая из которых представлена 16-битовым кодом, записанным четырьмя шест-надцатеричными цифрами (рис. 2.3). Код операции каждой команды состоит из первых четырех битов или, что то же самое, из первой шестнадцатеричной цифры. Обратите внимание (см. ыприложение В) на то, что коды операций представлены шестнадцатеричными цифрами от 1 до С. В частности, как можно увидеть в таблице приложения, команда, начинающаяся с цифры 3, является командой сохранения, команда, начинающаяся с шестнадцатеричной цифры А, является командой циклического сдвига.

Поле операнда каждой команды в нашей машине состоит из трех шестнадца-теричных цифр (12 битов) и в каждом случае (кроме команды останова, которая

не нуждается в дальнейшем уточнении) поясняет команду, представленную кодом операции. Например (рис. 2.4), если первая шестнадцатеричная цифра команды — 3 (код операции сохранения), то следующая за ней цифра обозначает, какой регистр нужно сохранить, а две другие — какая ячейка памяти должна получить данные. Следовательно, команда 35А7 содержит следующие инструкции: «сохранить двоичный код, находящийся в регистре 5, в ячейке памяти с адресом А7».

Рассмотрим другой пример. Код операции 7 говорит о том, что нужно выполнить операцию OR над двумя регистрами (мы рассмотрим, что означает операция OR над двумя регистрами, в разделе 2.4; сейчас нас интересует, как закодированы команды). В этом случае следующая шестнадцатеричная цифра указывает, куда нужно поместить результат, а остальные две цифры в поле операнда означают, над какими двумя регистрами нужно выполнить операцию OR. Значит, команда 70С5 содержит такие инструкции: «выполнить операцию ИЛИ над содержанием регистра С и регистра 5 и сохранить результат в регистре О».

Существует тонкое различие между двумя командами загрузки. Код операции 1 относится к команде, которая загружает в регистр содержимое ячейки памяти, а код операции 2 относится к команде, загружающей в регистр некоторое значение. Различие состоит в том, что поле операнда первой команды содержит адрес ячейки памяти, в то время как поле операнда второй команды содержит двоичный код, который нужно загрузить.

Обратите внимание на то, что в машине находятся две команды сложения: одна для сложения чисел в двоичном дополнительном коде, а вторая для сложения чисел в представлении с плавающей точкой. Это различие является следствием того, что сложение чисел в двоичном дополнительном коде и с плавающей точкой требуют различных действий арифметико-логического устройства.

В завершение мы приводим закодированный вариант команд (табл. 2.1) алгоритма сложения. При этом мы предполагакм, что складываемые значения хранятся в виде двоичного дополнительного кода в ячейках памяти с адресами 6С и 6D, а сумму следует поместить в ячейку с адресом 6Е.

Таблица 2.1. Алгоритм сложения двух чисел, хранящихся в оперативной памяти, закодированный командами типичной машины, описанной в приложении В
Команда Описание команды
156С Загрузить в регистр 5 двоичный код, находящийся в ячейке памяти с адресом 6С.
166D Загрузить в регистр 6 двоичный код, находящийся в ячейке памяти с адресом 6D.
  Сложить содержимое регистров 5 и 6 как двоичные дополнительные коды и сохранить результат в регистре 0.
306Е Сохранить содержимое регистра 0 в ячейке памяти с адресом 6Е.
СООО Останов.

Выполнение программы

Компьютер выполняет программу, хранящуюся в памяти, считывая команды из памяти в устройство управления. Как только команда попадает в устройство управления, она расшифровывается и выполняется. Порядок, в котором команды выбираются из памяти, соответствует порядку их хранения в памяти, если другой порядок не определен командой перехода.

Для того чтобы понять, как проходит процесс выполнения программы, рассмотрим более детально устройство управления центрального процессора. Это устройство содержит специальные регистры двух видов: счетчик команд (program counter) и регистр команд (instruction register) (см. рис. 2.2). В счетчике команд содержится адрес следующей команды, которую нужно выполнить. Поэтому он представляет собой средство, с помощью которого машина отслеживает, на какой стадии выполнения программы она находится. Регистр команд используется для хранения команды, которая в данный момент выполняется.

Устройство управления непрерывно повторяет алгоритм, который состоит из трех шагов и называется машинным циклом (machine cycle). Эти три шага таковы: выбрать, расшифровать и выполнить (рис. 2.5). Во время выбора устройство управления запрашивает в оперативной памяти команду, хранящуюся по адресу, указанному счетчиком команд. Поскольку длина каждой команды в нашей машине равна двум байтам, процесс выбора состоит в извлечении содержания двух соседних ячеек памяти. Устройство управления помещает полученную команду в регистр команд и прибавляет к значению счетчика команд два, так чтобы он содержал адрес следующей команды. Таким образом, счетчик команд готов для использования его во время следующего выбора.

Затем устройство управления выполняет команду, активируя схему, необходимую для выполнения требуемого действия. Например, если команда предписывает загрузить значение из памяти, то устройство управления осуществляет эту операцию, если команда предписывает выполнить какую-либо арифметическую операцию, устройство управления активирует схему в арифметико-логическом устройстве, которая имеет на входе соответствующие регистры.

После выполнения команды, находящейся в регистре команд, устройство управления снова начинает машинный цикл с шага выбора. Обратите внимание на то, что счетчику команд было дано приращение в конце предыдущего выбора, поэтому он содержит верный адрес команды.

Выполнение команды перехода является особым случаем. Рассмотрим, например, команду В258 (рис. 2.6), которая означает «перейти к команде с адресом 58, если содержимое регистра 2 равно содержимому регистра О». В этом случае шаг выполнения в машинном цикле начинается со сравнения регистров 2 и 0. Если они содержат разные коды, шаг выполнения завершается и начинается следующий машинный цикл. Однако если содержимое этих двух ячеек совпадает, машина помещает значение 58 в счетчик команд. В этом случае при следующем шаге выбора в счетчике команд будет находиться значение 58, поэтому команда, находящаяся по этому адресу, является следующей командой, которую нужно извлечь и выполнить.

Обратите внимание на то, что если бы команда имела вид В058, то тогда решение об изменении счетчика команд зависело бы от того, равно ли содержимое регистра 0 содержимому регистра 0. А так как это один и тот же регистр, он должен иметь одно содержание. Поэтому любая команда, имеющая вид BOXY, вызовет переход к ячейке памяти XY.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: