ПРОГРАММИРОВАНИЕ ПМ-ЭВМ
Как уже отмечалось в гл. 3, ПМ-ЭВМ не имеет программного обеспечения, позволяющего пользоваться для решения задач языками высокого уровня. Поэтому запись программы для ПМ-ЭВМ осуществляется пользователем на машинном языке с применением команд описанных выше групп.
Полный перечень команд, приведенных в сжатой форме в табл. 4.1 — 4.3, должен быть хорошо известен пользователю, решающему свою задачу. Это даст ему возможность варьировать при составлении своих программ различными командами и способами их включения в программы с целью составления программ либо более коротких, либо экономящих используемую память, либо сокращающих время счета.
В ряде случаев способ решения той или иной задачи становится более понятным, если он представлен в виде специальной схемы, называемой схемой алгоритма решения и имеющей вид ориентированной сети с вершинами различных типов, соответствующими используемым операциям.
В качестве примера рассмотрим решение задачи суммирования первых 20 чисел натурального ряда, схема которой приведена на рис. 4.13,а.
Для реализации первых двух операторов (не считая Start) можно воспользоваться двухбайтовой командой MVI г, осуществляющей непосредственную загрузку в какой-либо регистр данных, содержащихся во втором байте команды (в данном случае - чисел OD). Для осуществления операции S = S + N можно воспользоваться командой ADD r, выполняющей суммирование содержимого какого-либо регистра с содержимым аккумулятора и запись результата в аккумулятор. Для выполнения операции N = N + 1 в машинном языке ПМ-ЭВМ предусмотрена специальная команда INR г, осуществляющая увеличение на единицу содержимого какого-либо регистра. Остается еще организовать в программе цикл с использованием условного оператора. Для этой цели подошла бы команда JNZ, осуществляющая переход в программе при отсутствии нуля в результате какой-либо предшествующей переходу операции (в нашем случае — операции вычитания: 21 — N).
Однако этого можно и не делать, построив несколько иначе схему решения задачи. Вместо того чтобы суммировать последовательно увеличивающиеся числа от О D до 20 D, можно суммировать последовательно уменьшающиеся числа от 20 D до OD. Тогда содержимое регистра, хранящего число N, на некотором шаге выполнения программы обратится в нуль и этот результат можно будет использовать при организации условного перехода.
Итак, новая схема алгоритма может быть построена следующим образом.
Шаг 1. Заносим число О D в аккумулятор (А).
Шаг 2. Заносим число 20 D в какой-нибудь регистр, например в регистр D.
Шаг 3. Суммируем содержимое регистров А и D.
Шаг 4. Уменьшаем содержимое регистра Она единицу.
Шаг 5. Если содержимое регистра Вне равно нулю, осуществляем переход к шагу 3; в противном случае переходим к следующему шагу.
Ш а г 6. Переписываем содержимое регистра А в какой-нибудь из портов вывода, например в порт Р0оо-
Ш а г 7. Конец работы программы.
Соответствующая схема представлена йа рис. 4.13,6.
Приступим к программированию этой схемы. Для этой цели нам понадобятся все указанные выше команды, за исключением команды INR г (увеличение содержимого регистра на единицу). Вместо нее следует взять команду DCR г (уменьшение содержимого регистра на единицу), которая будет использована применительно к регистру D. Кроме того, нам будут необходимы еще следующие две команды: OUT — двухбайтовая команда вывода данных из аккумулятора в порт вывода, определяемый адресом, содержащимся во втором байте команды, и однобайтовая команда HLT — останов программы. Коды всех используемых команд можно взять из таблицы, приведенной в приложении 1.
Для размещения всей программы нам понадобятся 12 ячеек памяти с номерами от 014QOOOQ до 014Q013Q. В первые две ячейки с номерами 014 000 и 014 001 поместим оба байта первой команды MVI A OOOQ загрузки аккумулятора (регистра А) числом OD. При этом в первую ячейку поместим восьмеричный код команды 076, а во вторую — содержимое второго байта этой команды — восьмеричный код числа OD (число 000).
В следующие две ячейки с номерами 014 002 и 014 003 поместим два байта следующей команды, загружающей регистр D десятичным числом 20. Восьмеричный код этой операции 026 будет находиться в первой ячейке, а восьмеричный код 024 десятичного числа 20 - во второй и т. д. В последнюю ячейку с номером 014 013 поместим восьмеричный код 166 команды HLT, осуществляющей останов программы. В табл. 4.5 приведен полный текст составленной программы вместе с комментарием. При организации цикла использована специальная метка Ml, указывающая на операцию, которую следует выполнить, если содержимое регистра D не равно нулю.
Рис. 4.13. Схемы алгоритмов для задачи сложения первых 20 чисел
Таблица 4.5
Адрес ячейки |
Код операции или содержимого второго или третьего байта |
Метка |
Мнемокод |
Комментарий |
014 000 |
076 |
|
MVI A OOOQ |
Загрузка регистра А числом OD |
014 001 |
000 |
|
|
Число OD |
014 002 |
026 |
|
MVI D 024Q |
Загрузка регистра D числом 20 D |
014003 |
024 |
|
|
Число 20 D |
014 004 |
202 |
Ml: |
ADDD |
Сложение содержимого регистров А и D |
014005 |
025 |
|
DCRD |
Уменьшение на единицу содержимого регистра D |
014 006 |
302 |
|
JNZM1 |
Переход к метке М 1 при отсутствии нуля |
014 007 |
004 |
|
|
Метка М 1 (адрес) |
014 010 |
014 |
|
|
Метка М 1 (адрес) |
014 011 |
323 |
|
OUT OOOQ |
Вывод данных из регистра А в порт рооо |
014 012 |
000 |
|
|
Номер порта |
014013 |
166 |
|
HLT |
Останов программы |
Перейдем теперь к рассмотрению работы конкретных схем отдельных функциональных блоков ПМ-ЭВМ, назначение которых было определено ранее.