Всего на сайте:
248 тыс. 773 статей

Главная | Информатика

Подпрограмма умножения целых положительных чисел  Просмотрен 137

Распределение общих регистров: R2: счетчик, R3: множимое Y, R4: множитель X, R5: ст. часть произведения Рн, R6:мл.

часть произведения PL

Ячейка памяти Команда на машин­ном языке Команда в сим­волической форме Комментарий
LRI 5 Установка нулевых значений в Рн и PL
   
LTI 6  
   
LRI 2 Установка на счетчике начального
значения 8
MOV 0 from 4 Загрузка множителя в аккумулятор
F2 RTR Циклический сдвиг вправо, мл. бит попа-
      дает в С
MOV 0 to 4 Запоминание сдвинутого множителя
MOV 0 from 5 Загрузка ст. части произведения в
      аккумулятор
000А JCZ Тест бита множителя. Переход при 0
000В    
000С 0E  
000D ADD 3 Сложение множимого со ст. частью
      произведения
000Е F2 RTR Сдвиг Рн вправо, мл. бит в С
000F MOV 0 to 5 Запоминание сдвинутого Рн
MOV 0 from 6 Загрузка мл. части произведения в
      аккумулятор
F2 RTR Сдвиг С и мл. части произведения
      вправо
MOV 0 to 6 Запоминание сдвинутого PL
F6 DHL Уменьшение счетчика на 1
MOV 0 from 2 Загрузка счетчика в аккумулятор
7D JAN Тестирование счетчика. Повторение
цикла, если не нуль
   
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 0 to F передает содержимое аккумулятора в ячейку памяти, адрес которой задан содержимым регистров 1 и 2 (т. е. Н и L). Поскольку эти регистры содержат значение ТА, слово попадает в нужное место памяти. Следующая команда, IHL, увеличивает на 1 значение ТА.

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

 

 

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

 

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

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

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

LRI 5

80 (маска)

AND 5

JAZ

1D

 

 

Таблица 5.8

Предыдущая статья:Умножение Следующая статья:Программа-загрузчик
page speed (0.0156 sec, direct)