Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodicheskie_ukazania_k_kursovomu_proektu_VMSi....doc
Скачиваний:
5
Добавлен:
20.04.2019
Размер:
4.98 Mб
Скачать

5.6. Загрузка программ

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

Таблица 5.7

Подпрограмма умножения целых положительных чисел Распределение общих регистров: r2: счетчик, r3: множимое y, r4: множитель X, r5: ст. Часть произведения Рн, r6:мл. Часть произведения pl

Ячейка

памяти

Команда на машин­ном языке

Команда в сим­волической форме

Комментарий

0000

65

LRI 5

Установка нулевых значений в Рн и PL

0001

00

00

0002

66

LTI 6

0003

00

00

0004

62

LRI 2

Установка на счетчике начального

0005

08

08

значения 8

0006

14

MOV 0 from 4

Загрузка множителя в аккумулятор

0007

F2

RTR

Циклический сдвиг вправо, мл. бит попа-

дает в С

0008

04

MOV 0 to 4

Запоминание сдвинутого множителя

0009

15

MOV 0 from 5

Загрузка ст. части произведения в

аккумулятор

000А

JCZ

Тест бита множителя. Переход при 0

000В

00

00

000С

0E

000D

83

ADD 3

Сложение множимого со ст. частью

произведения

000Е

F2

RTR

Сдвиг Рн вправо, мл. бит в С

000F

05

MOV 0 to 5

Запоминание сдвинутого Рн

0010

16

MOV 0 from 6

Загрузка мл. части произведения в

аккумулятор

0011

F2

RTR

Сдвиг С и мл. части произведения

вправо

0012

06

MOV 0 to 6

Запоминание сдвинутого PL

0013

F6

DHL

Уменьшение счетчика на 1

0014

12

MOV 0 from 2

Загрузка счетчика в аккумулятор

0015

7D

JAN

Тестирование счетчика. Повторение

0016

00

00

цикла, если не нуль

0017

06

06

0018

F8

RET

Возврат из подпрограммы

Сам загрузчик может либо размещаться в постоянной памяти, либо вводиться в оперативную память покомандно вручную с пульта управления.

Поскольку загрузчик используется для ввода в память самых раз­ных программ и, возможно, данных, ему должна быть сообщена опре­деленная информация. В типичных случаях требуются следующие сведения:

  1. Начальный и конечный адрес загружаемой области памяти.

  2. Начальный адрес загружаемой области памяти и число вводимых слов.

  3. Начальный адрес загружаемой области памяти и вид ограничителя (признака конца) вводимой информации.

Кроме ввода программы, на загрузчик могут быть, вообще говоря, возложены дополнительные функции. Например, перемещение про­граммы в памяти. Выполнение такой функции требует от загрузчика изменения ссылок на ячейки памяти в командах таким образом, чтобы они соответствовали новому положению программы. Другая распро­страненная функция загрузчиков — это обнаружение ошибок, на­пример ошибок, возникающих при передаче информации между устрой­ствами ввода и памятью.

Рассмотрим простейший загрузчик для нашего иллюстративного микропроцессора. Это позволит нам не только полнее проиллюстри­ровать идеи загрузки, но и рассмотреть выполнение в микропроцессо­ре операции ввода.

Будем предполагать, что загружаемая информация (программа или данные) поступает с некоторого устройства ввода. Устройство ввода получает эту информацию слово за словом с неко­торого носителя и делает ее доступной для микропроцессора через некоторый порт ввода.

Будем предполагать, что слова имеют ту же длину 8 бит, что и слова в микропроцессоре. Будем считать, что первые два слова на носителе содержат 16-битовый адрес (старшие разряды в первом байте), указывающий загрузчику начальную ячейку области памяти, куда должна быть загружена информация. Следующие два слова определя­ют конечный адрес области памяти. Далее следует информация, ко­торая должна быть загружена в эту область.

Итак, загрузчик получает информацию пословно от устройства ввода. Первые четыре слова — это, как было сказано выше, адрес­ная информация, а остальные — загружаемая. Устройство ввода в силу своей механической природы, как правило, работает сущест­венно медленнее микропроцессора, обрабатывающего вводимые слова. Поэтому нужно запрограммировать микропроцессор так, чтобы он ожидал, когда очередное вводимое слово станет доступным. Поэтому для передачи информации о состоянии устройства ввода мы использу­ем второй порт. В этот порт устройство ввода устанавливает 1 в неко­торый (скажем, крайний левый) бит каждый раз, когда готово очеред­ное вводимое слово. Микропроцессор прежде, чем вводить данные, должен проверять этот бит и при необходимости ждать, пока он не ста­нет равным единице. В тот момент, когда микропроцессор действитель­но вводит слово, этот бит состояния автоматически внешними схема­ми сбрасывается в 0, так чтобы одно и то же слово не было введено дважды.

Работа программы - загрузчика изображена в виде блок-схемы на рис. 5.5.

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

Главная процедура четырежды обращается к подпрограмме ввода для ввода первых четырех адресных слов, передавая эти слова каждый-раз в новые общие регистры. Затем начинается цикл передачи вводи­мых слов в память. Каждое слово вводится подпрограммой ввода и за­тем передается в соответствующую ячейку памяти, адрес которой за­дается текущим значением адреса (ТА). ТА увеличивается на 1 при каждом прохождении цикла, т. е. при поступлении каждого слова. В конце цикла происходит проверка, не превышает ли ТА значение конечного адреса (КА). Если это так, процедура загрузки заканчива­ется; в противном случае — цикл повторяется.

Программа-загрузчик приведена в табл. 8. Как легко видеть, она начинается в ячейке 0000. Однако в реальных условиях она могла бы располагаться и в других ячейках, скажем со старшими адресами, чтобы не мешать размещению других программ. Программа обраща­ется к двум портам ввода: к порту 00 — за информацией о состоянии и к порту 01 — за данными,

Первая группа команд соответствует главной процедуре. Подпро­грамма ввода начинается с ячейки 001D. Общие регистры 1, 2, 3 и 4 хранят соответственно ТАН TAL, KAH и KAL. Они загружаются адресной информацией, поступающей с устройства ввода. Для этого каждый раз выполняется команда перехода на подпрограмму и команда пересылки.

Цикл, показанный на блок-схеме, начинается в ячейке 0010 командой перехода на подпрограмму ввода. После возврата из нее очередное введенное слово находится в аккумуляторе. Это слово переда­ется в ячейку памяти с помощью имеющегося в иллюстративном мик­ропроцессоре механизма косвенной адресации. А именно, команда MOV О to F передает содержимое аккумулятора в ячейку памяти, адрес которой задан содержимым регистров 1 и 2 (т. е. Н и L). Поскольку эти регистры содержат значение ТА, слово попадает в нужное место памяти. Следующая команда, IHL, увеличивает на 1 значение ТА.

Сравнение адресов ТА и КА осуществляется при помощи проце­дуры вычитания с двойной точностью и последующего условного пе­рехода. Для вычитания с двойной точностью сначала вычитаются младшие части ТА и КА, а затем старшие части с участием заема, оставшегося от младших частей. Окончательный заем остается в триг­гере С. Следующая команда — «переход при нулевом переносе» на начало цикла. При С=0 снова входим в цикл, при С= 1 программа ос­танавливается.

Рис. 5.5. Блок-схема программы-загрузчика

Подпрограмма ввода начинается с ввода слова из порта состоя­ния 00 в аккумулятор. Левый (т. е. знаковый) бит тестируется коман­дой «переход при положительном аккумуляторе». Если содержимое аккумулятора положительно (старший бит равен 0), устройство ввода не готово. В этом случае управление передается на начало подпрограм­мы и процесс повторяется. Если старший бит в аккумуляторе равен 1, следующая команда вводит слово из порта 01 в аккумулятор, а команда возврата завершает подпрограмму.

Следует обратить внимание на то, что бит готовности в слове состояния был выбран специально совпадающим со знаковым разря­дом аккумулятора. Это позволило выполнить тестирование бита од­ной командой. В общем случае тестируемый бит может оказаться в любом другом разряде. Тогда тестирование проводится путем выделе­ния этого разряда. Для этого достаточно логически умножить слово состояния на слово, называемое маской и содержащее 1 в интересую­щем нас разряде и нули — в остальных.

После этого результат те­стируется либо командой перехода при нулевом аккумуляторе, либо командой перехода при ненулевом аккумуляторе. Таким образом, команду JAP, проверяющую левый бит слова состояния, в нашей про­грамме можно будет заменить следующими командами

LRI 5