Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Проблема начальной загрузки программы





Теперь осталось определить условие начала работы программы. Прежде всего, программа каким-то образом должна оказаться в памяти нашей ЭВМ. Вообще говоря, исходя из принципа неразличимости команд и данных, нашу программу можно, например, представить в виде массива целых чисел и ввести в память, используя команду ввода (например, с кодом операции 16, см. таблицу 1). Заметим, однако, что для начального ввода программы в память мы не можем использовать команды ввода из языка машины, так как для этого в памяти уже должна находиться хотя бы одна команда. Чтобы разорвать этот замкнутый круг, в современных ЭВМ обычно часть памяти отводят для постоянного хранения специальной небольшой программы, которая называется программой начальной загрузки. Эта программа начинает автоматически выполняться при включении ЭВМ[2]. Память, занимаемая программой начальной загрузки, недоступна для записи, такую память, обычно обозначают английской аббревиатурой ROM – Read Only Memory. Ясно, что наличие программы начальной загрузки нарушает принцип Фон Неймана однородности памяти.

В учебной ЭВМ пойти по этому пути загрузки программы нельзя по двум причинам. Во-первых, память и так очень маленькая, и отводить часть её для постоянного хранения программы начальной загрузки нерационально, а, во-вторых, мы не хотим отступать от принципа Фон Неймана однородности памяти. В УМ-3 первичной загрузкой программы в память и формированием начальных значений регистров в устройстве управления занимается устройство ввода. Для этого на устройстве ввода имеется специальная кнопка ПУСК. При нажатии этой кнопки устройство ввода самостоятельно (без сигналов со стороны устройства управления, которое ещё не функционирует) выполняет следующую последовательность действий:

1. Производит ввод расположенного на устройстве ввода массива машинных слов в память, начиная с первой ячейки; этот массив машинных слов заканчивается специальным признаком конца ввода[3].

2. РА:= 1; первой будет выполняться команда из ячейки с номером один.

3. w:= 0; начальное значение признака результата нулевое.

4. Err:= 0; признак ошибки сбрасывается (устанавливается равным false).

Как видно, при нажатии кнопки ПУСК устройство ввода выполняет функции упомянутой выше программы начальной загрузки современных ЭВМ. Вот теперь всё готово для автоматической работы центрального процессора по загруженной в память программе, и за дело принимается устройство управления.

Таким образом, полностью определены условия начала и конца работы этой учебной машины как алгоритмической системы. Здесь по аналогии хорошо вспомнить, как условия начала работы определялись, скажем, для машины Тьюринга: на ленте расположено входное слово, головка установлена у первого слева символа этого слова и машина находится в первом состоянии.

Заметим, что по своей архитектуре эта учебная машина очень похожа на первые ЭВМ, построенные в соответствии с принципами Фон Неймана, например, на отечественную ЭВМ Стрела, выпускавшуюся в средине прошлого века.

Пример программы для учебной машины

Составим программу, которая вводит целое число x и реализует арифметический оператор присваивания языка Паскаль:

y:= (x+1)2 mod (2*x)

На языке Паскаль эта программа может выглядеть, например, так:

Program First(input,output);

Var x,y: integer;

Begin

Read(x);

y:=sqr(x+1) mod (2*x);

Writeln(y)

end.

В качестве примера в таблице 1 запишем только операции с целыми числами.

Таблица 1. Команды учебной машины УМ-3
КОП Смысл операции и её мнемоническое обозначение
  СЛЦ – сложение целых чисел
  ВЧЦ – вычитание целых чисел
  УМЦ – умножение целых чисел
  ДЕЦ – деление целых чисел (то же, что и divв Паскале)
  МОД – остаток от деления (то же, что и modв Паскале)
  ПЕР – пересылка: <A1>:=<A3>
  СТОП – остановка выполнения программы
  ВВЦ – ввод A2 целых чисел в память, начиная с адреса A1 fori:=1 toА2 doReadln(<А1+i-1>)
  ВЫЦ – вывод A2 целых чисел, начиная с адреса A1 fori:=1 toА2 doWriteln(<А1+i-1>)

 

Текст первой программы с комментариями (напомним, что все числа – десятичные):

Команда Комментарий
          Read(x)
        008 r1:= (x+1)
          r1:= sqr(x+1)
          r2:= (x+x)=2*x
          y:= r1 modr2
          Write(y)
          Стоп (ОСТ)
          Целая константа 1

Подробно прокомментируем процесс написания машинной программы. Как Вы уже знаете, команды программы после начального ввода при нажатии кнопки ПУСК будут располагаться в памяти, начиная с первой ячейки. Теперь необходимо решить, в каких ячейках памяти будут располагаться переменные x и y. Эта работа называется распределением памяти под хранение переменных. При программировании на Паскале эту работу выполняла за нас Паскаль-машина, когда видела описания переменных:

Var x, y: integer;

Теперь придётся распределять память под хранения переменных самим. Сделаем сначала естественное предположение, что наша программа будет занимать не более 100 ячеек памяти. Поэтому, начиная со 101 ячейки, память будет свободна. Пусть тогда для хранения значения переменной x мы выделим 101 ячейку, а переменной y – 102 ячейку памяти. Остальные переменные при необходимости будем размещать в последующих ячейках памяти. Для реализации этой программы нам понадобятся дополнительные (как говорят, рабочие) переменные r1 и r2, которые мы разместим в ячейках 103 и 104 соответственно.

Поймём теперь, что при программировании на машинном языке, в отличие от Паскаля, у нас не будут существовать константы. Действительно, в какой бы ячейке не хранилось значение константы, по принципу Фон Неймана однородности памяти ничто не помешает записать в эту ячейку новое значение. Поэтому будем называть константами такие переменные, которые имеют начальные значения, и которые не планируется изменять в ходе выполнения программы.

Важно понять, что в начале работы программы имеют значения только те ячейки памяти, в которые произведён ввод данных по кнопке ПУСК[4]. Отсюда следует, что константы, как и переменные с начальным значением, следует располагать в тексте программы ("маскируя" их под команды) и загружать в память вместе с программой при нажатии кнопки ПУСК. Разумеется, такие константы, и переменные с начальными значениями следует располагать в таком месте программы, чтобы устройство управления не начало бы выполнять их как команды. Чтобы избежать этой неприятности, мы будем размещать их в конце программы, после команды с кодом операции (СТОП).

Далее, используя принцип неразличимости команд и чисел, целочисленная константа 1 представлена в виде команды 00 000 000 001. Этот приём позволил ввести эту константу, "замаскировав" её в виде команды (обычно так и поступали программисты первых ЭВМ).

Следует обратить внимание и на тот факт, что изначально программист не знает, сколько ячеек в памяти будет занимать команды его программы. Поэтому адреса программы, ссылающиеся на переменные с начальным значением, до завершения написания программы командой СТОП остаются неизвестными (незаполненными), и уже потом, разместив эти переменные в памяти сразу же вслед за командами программы, следует указать их адреса в тексте программы. В примерах те адреса программы, которые заполняются программистом в последнюю очередь, будут выделяться подчёркиванием.

Как видно из приведенного примера, для программиста запись программы состоит из строк, каждая строка снабжается номером (адресом) той ячейки, куда будет помещаться это машинной слово (команда, константа или переменная с начальным значением) при загрузке программы. Вслед за номером задаются все поля команды, затем программист может указать комментарий (разумеется, номера машинных слов и комментарии не вводятся в память ЭВМ, для них нет места в машинном слове). Кроме того, так как числа в памяти неотличимы от команд, то, как уже говорилось, они записываются в программе тоже в виде команд.

Для ввода программы в ЭВМ первые программисты кодировали все машинные слова в двоичном виде и переносили их на какой-нибудь носитель данных для устройства ввода (например, на картонные перфокарты). После этого оставалось снабдить такую, как говорили, колоду перфокарт, перфокартой-признаком конца ввода, поместить на устройство ввода и нажать кнопку ПУСК. В нашем случае надо поместить на устройство ввода два массива машинных слов – саму программу (8 машинных слов с признаком конца ввода) и число x (одно машинное слово). Как уже говорилось, первый массив заканчивался специальным признаком конца ввода, так что устройство ввода само знало, сколько машинных слов надо ввести в память по кнопке ПУСК.







Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...

Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.