3. Программирование учебной микро-ЭВМ

 

3.1. Основные идеи программирования

3.1.1.Общие сведения

3.1.2.Линейная программа

3.1.3.Линейная программа с разрывами

3.1.4.Подпрограмма

3.1.5.Ветвление программы по условию

3.1.6.Цикл

3.1.7.Модификация адреса

3.2. Язык ассемблера.

3.2.1. Общие сведения

3.2.2.Основные элементы языка ассемблера

3.2.3.Запись программ на языке ассемблера

3.2.4.Понятие о работе программы–ассемблера

3.2.5. Типовые приемы программирования

3.3.Понятие о системном программном обеспечении

3.4. Начальные сведения об учебной микро-ЭВМ Микролаб КР580

3.4.1.Общие сведения

3.4.2.Стандартные приемы ввода-вывода информации

3.4.3.Программная модель микро-ЭВМ

3.5.Простейшие программы для учебной микро-ЭВМ

3.5.1.Программа 3

3.5.2.Программа 4

3.5.3.Программа 5

3.6.Особенности использования подпрограмм

3.6.1. Инициализация стека

3.6.2. Вызов подпрограммы

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

3.6.4. Передача параметров между основной программой и подпрограммой

3.6.5. Сохранение исходного состояния регистров микропроцессора

3.7. Расчет времени выполнения программ.

 

3.1. Основные идеи программирования

 

3.1.1.Общие сведения

 

Программирование любой ЭВМ и на любом языке от самого простого до самого сложного основывается на практическом применении шести элементарных идей, это:

линейная программа;

линейная программа с разрывами;

подпрограмма;

ветвление по условию;

цикл;

модификация адреса.

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

При рассмотрении большинства идей программирования удобно изобразить процесс выполнения программы с помощью графика в координатах «время», «содержимое счетчика команд РС» микропроцессора. Строго говоря, такой график представляет собой ломаную линию примерно следующего вида (рис.3.1).

Рис.3.1.График, иллюстрирующий процесс выполнения программы в микро-ЭВМ

 

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

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

 

3.1.2.Линейная программа

 

Для линейных программ характерен исключительно естественный порядок выполнения команд. При естественном порядке команды выполняются одна за другой строго в порядке их записи в памяти ЭВМ. На графике линейная программа изображается отрезком прямой линии (рис.3.2).

Рис.3.2. График, иллюстрирующий выполнение линейной программы

 

Здесь — начальный адрес программы

— конечный адрес программы,

— максимально-допустимое значение содержимого счетчика команд РС. Это значение определяется разрядностью счетчика команд и для учебного микропроцессора составляет 216–1. Замкнутый интервал адресов микропроцессора [0, ] принято называть адресным пространством микропроцессора.

— время выполнения программы,

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

Поскольку содержимое счетчика команд ограничено сверху значением , любая линейная программа должна заканчиваться командой останова HLT. Линейные программы в чистом виде встречаются редко. Однако, вместе с тем, отрезки линейной программы составляют основу, каркас программ всех других типов.

 

3.1.3.Линейная программа с разрывами

 

Этот вид программы отличается от линейной только тем, что естественный порядок выполнения команд нарушается в ней конечное число раз с помощью команды безусловной передачи управления JMP ADR. Процесс выполнения такой программы изображен графически на рис.3.3.

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

Рис.3.3.График, иллюстрирующий выполнение линейной программы с разрывами

 

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

.

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

 

3.1.4.Подпрограмма

 

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

Для организации подпрограмм используются команды вызова подпрограммы CALL ADR и возврата из подпрограммы RET.

Использование подпрограммы поясняется графиком, приведенным на рис.3.4.

Адресные пространства основной программы и подпрограммы никогда не пересекаются.

Рис.3.4.График, иллюстрирующий использование подпрограммы

 

3.1.5.Ветвление программы по условию

 

Ветвление по условию позволяет по-разному организовать обработку информации в зависимости от конкретного значения признака результата какой-либо операции. Простейший вариант ветвления осуществляют команды условной передачи управления вида J-CON ADR. В зависимости от конкретного логического значения условия –CON в программе выполняется один из 2-х возможных линейных отрезков. Одновременное выполнение обоих отрезков невозможно.

Рис.3.5. Графики, иллюстрирующие выполнение ветвящейся программы

 

Выполнение ветвящихся программ может иллюстрировать один из графиков, представленных на рис.3.5. Если условие –CON = 0, то есть не выполняется, то действует график (рис.3.5.а) и программа выполняется как линейная. Если условие — CON = 1, то есть выполняется, то действует график (рис.3.5б) и программа выполняется как линейная с разрывом.

Несколько более сложные варианты ветвления обеспечивают команды условного вызова подпрограмм C – CON ADR и условного возврата из них R-CON.

 

3.1.6.Цикл

 

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

Существуют две разновидности циклов — бесконечные и с выходом по условию. Бесконечные циклы будут выполняться в ЭВМ неограниченно долго (пока включено питание машины). Использование таких циклов характерно для управляющих программ. Бесконечные циклы организуются с помощью команд безусловной передачи управления JMP ADR, передающей управление в уже выполненную ранее ветвь программы. График, иллюстрирующий выполнение программы с бесконечным циклом, приведен на рис.3.6.

Последовательность команд, которая многократно повторяется в ходе циклической программы, называют телом цикла. В нашем случае тело цикла – это отрезок линейной программы, записанной в адресах .

Рис.3.6.График, иллюстрирующий выполнение программы с бесконечным циклом

 

В циклах с выходом по условию всегда проверяется выполнение некоторого условия (выполнено ли заданное количество циклов, достигнута ли ошибка расчета меньшая, чем , нажата ли клавиша, введен ли определенный символ и т.д.). Если условие выполнено, то происходит выход из цикла в последующую ветвь программы, если условие не выполнено, то следует новый цикл. Легко видеть, что в зависимости от используемого условия, здесь получается программа либо с заданным числом циклов (выполняется заданное число циклов), либо с неопределенным числом циклов (другие условия). Циклы с выходом по условию обычно организуются с помощью команд условной передачи управления вида J — CON ADR. График, иллюстрирующий выполнение программ, такого типа представлен на рис.3.7.

Рис.3.7.График, иллюстрирующий выполнение циклической программы с выходом по условию

 

Очень часто тело цикла содержит в себе другой цикл, считающийся вложенным по отношения к исходному (внешнему) циклу. Следует иметь в виду того, что бесконечный цикл может быть внешним, но никогда вложенным. График выполнения программы, содержащей бесконечный внешний цикл и вложенный цикл с выходом по условию, приведен на рис.3.8.

Глубина вложения циклов обычно не ограничивается и может достигать значительных величин.

 

3.1.7.Модификация адреса

 

Модификация адреса обычно используется в рамках циклических программ, хотя может иметь и самостоятельное значение. Эта идея

Рис.3.8.График, иллюстрирующий выполнение циклической программы, имеющей внешний бесконечный цикл и внутренний цикл с выходом по условию

 

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

3.2. Язык ассемблера.

3.2.1. Общие сведения

 

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

В языке ассемблера используются мнемоники команд микропроцессора, установленные системой команд. Имеется возможность использования во входном тексте символических имен–меток для обозначения адресов и данных.

Последняя особенность сближает язык ассемблера с алгоритмическими языками программирования общего назначения, например, такими как BASIC и PASCAL. Имеются и существенные отличия. Так BASIC и PASCAL — языки высокого уровня. Каждый оператор такого языка превращается во время трансляции в некоторое множество команд ЭВМ. Язык ассемблера – язык низкого уровня. Каждая мнемоника входного текста, написанного на этом языке, транслируется ассемблером в единственную команду.

BASIC и PASCAL машинонезависимы. Исходные тексты программ,. написанные на этих языках, практически не изменяются при переносе программ с одной ЭВМ на другую, хотя системы команд этих ЭВМ могут быть совершенно непохожи. Язык ассемблера машиноориентирован, каждая ЭВМ, каждый микропроцессор имеют свой собственный язык ассемблера.

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

 

3.2.2.Основные элементы языка ассемблера

 

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

Рассмотрим эти элементы и правила их записи более подробно.

 

3.2.2.1.Числовая константа

 

Числовая константа представляет собой просто некоторое целое число без знака. Константы, представляемые в машинном коде одним байтом (типа D8, N), не могут быть больше, чем 28—1. Константы, представляемые в машинном коде двумя байтами (типа D16, ADR), не могут быть больше 216-1. Константы могут быть выражены в любой из четырех систем счисления. Систему счисления указывают латинской буквой, записанной справа от константы. Здесь используются следующие обозначения: B – двоичная, D – десятичная, Q – восьмеричная, H – шестнадцатеричная. Константы, не помеченные буквой, считаются записанными в десятичной системе счисления. Константы, записанные в шестнадцатеричной системе счисления и начинающиеся с цифр A, B, C, D, E, F должны быть дополнены слева незначащим нулем.

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

Примеры записи констант:

01001111В – двоичная,

36 – десятичная,

00Н – шестнадцатеричная,

0FABCH – шестнадцатеричная,

‘B’ – символьная.

 

3.2.2.2.Метка

 

Метка представляет собой символическое (буквенно-цифровое) имя, присвоенное программистом адресу какой-либо ячейке памяти микроЭВМ, содержимому этой ячейки или цифровой части многобайтной команды.

Метка должна состоять не более чем из шести символов и начинаться с буквы. Запрещено использовать в качестве меток аббревиатуры команд и псевдокоманд, а также имена программно доступных регистров микропроцессора. Часто используют в качестве меток слова, обозначающие характерные точки или фрагменты программы.

Примеры записи меток:

START,

TEST,

TBL23,

M1.

 

3.2.2.3.Мнемоника команды микропроцессора

 

Мнемоника команды микропроцессора берется из его системы команд. При этом буквенная часть мнемоники воспроизводится в тексте программы полностью. В цифровой части мнемоники на месте обобщенного обозначения D8, D16, N или ADR указывается либо конкретная константа, либо соответствующая метка.

Примеры записи мнемоник команд микропроцессора:

MOV

A, B,

XRA

L,

RRL,

 

STA

0FAABH,

JMP

TEST2,

CPI

‘L’,

ADI

06H,

LXI

H, TABL32.

 

3.2.2.4.Мнемоника псевдокоманды ассемблера

 

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

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

В качестве аргумента мнемоник могут выступать метки и константы.

Обычно используются следующие мнемоники:

ORG ARG – размещать последующие машинные коды программы в памяти микро-ЭВМ с адреса, определяемого аргументом ARG. Эта директива обычно записывается в начале программы. Если же там этой директивы нет, то ассемблер будет размещать машинные коды программы с нулевого адреса памяти;

  1. END – закончить ассемблирование текста программы;

  2. MET EQU ARG – присвоить метке MET численное значение, определяемое аргументом ARG;

  3. DW ARG – зарезервировать столько очередных ячеек памяти, каково численное значение аргумента ARG;

  4. DB ARG – записать в очередную ячейку памяти численное значение аргумента ARG, представленное восьмиразрядным двоичным кодом (байтовым словом). Директива может иметь несколько аргументов разделенных запятыми. В этом случае она записывается следующим образом: DB ARG1,ARG2,…,ARGN. При этом байты, определяемые этими аргументами, заносятся в последовательные ячейки памяти. В качестве аргументов, кроме упомянутых выше констант и меток, в псевдокоманде DB ARG могут фигурировать строки из символов ASCII, заключенные в апострофы, например, DB ‘ERROR’. При этом в последовательные ячейки памяти будут записаны соответствующие байтовые коды ASCII.

  5. DW ARG – записать в пару очередных ячеек памяти численное значение аргумента ARG, представленное шестнадцатиразрядным двоичным кодом (двухбайтным словом). Директива может иметь несколько аргументов, разделенных запятыми, например, DW ARG1, ARG2, …, ARGN. При этом двухбайтовые слова, определенные этими аргументами, записываются в последовательные ячейки памяти.

Примеры записи мнемоник псевдокоманд:

ORG

8000H,

 

END,

   

TABL

EQU

0ABC1H,

MASK    EQU

00101111B,

 

DS

9,

 

DB

57H,

 

DB

‘L’,

 

DB

0DH, ‘ALFA’, 0AH, 0DH,

 

DW

TABL1, TABL2, 378AH.

 

 

3.2.2.5.Комментарий

 

Комментарий представляет собой произвольную комбинацию символов. Ассемблер не обрабатывает комментарии, и поэтому нет строгих правил их построения. Обычно в качестве комментариев используют краткие пояснения к тексту программы.

 

3.2.3.Запись программ на языке ассемблера

 

Каждая строка текста программы может содержать от одного до четырех заполненных полей. Формат полной, то есть содержащей все четыре поля, строки представлен на рис.3.9.

 

МЕТКА

КОД

ОПЕРАНДЫ

КОММЕНТАРИЙ

Рис.3.9.Формат строки текста, записываемого на языке ассемблера

 

Мнемоники команд микропроцессора, а также псевдокоманд ассемблера, кроме MET EQU ARG, размещаются в полях «код» и «операнды».

Директива MET EQU ARG занимает все три левых поля.

Мнемоники команд микропроцессора и псевдокоманд ассемблера (кроме MET EQU ARG) могут быть снабжены метками, имеющими смысл адресов ячеек памяти, в которых размещены соответствующие машинные коды. Такие метки записываются в поле «метка» и дополняются справа символом «:» (двоеточие). Метки, входящие с состав директив MET EQU ARG, и тоже размещающиеся в поле «метка», вовсе не обязательно имеют смысл адреса и не дополняются двоеточием.

Поле «метка» может быть единственным заполненным полем строки. В этом случае метка относится к первой последующей команде микропроцессора или директиве ассемблера.

Любая строка программы может (но не обязана) содержать поле «комментарий». Это поле всегда начинается символом «;» (точка с запятой), за которым следует собственно комментарий.

Поле «комментарий» может быть единственным заполненным полем строки.

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

;МЕТКА

КОД

ОПЕРАНДЫ

КОММЕНТАРИЙ

     

;ПРОГРАММА 1

A0

EQU

02

;УСТАНОВИТЬ А0=2

B0

EQU

03

;УСТАНОВИТЬ В0=3

 

ORG

8000H

;НАЧАТЬ ПРОГРАММУ С АДРЕСА 8000Н

START:

LDA

ADA0

;ЗАГРУЗИТЬ А0 В РЕГИСТР А

 

MOV

B, A

;СОХРАНИТЬ А0 В РЕГИСТРЕ В

 

LDA

ADB0

;ЗАГРУЗИТЬ В0 В РЕГИСТР А

 

ADD

B

;ВЫЧИСЛИТЬ А0 + В0

 

STA

ADSUM

;СОХРАНИТЬ РЕЗУЛЬТАТ

 

HLT

 

;ОСТАНОВИТЬ МИКРОПРОЦЕССОР

ADA0:

 

DB A0

;ЯЧЕЙКА ДЛЯ А0

ADB0:

 

DB B0

;ЯЧЕЙКА ДЛЯ В0

ADSUM:

 

DS 1

;ЯЧЕЙКА ДЛЯ СУММЫ

 

END

 

;КОНЕЦ ТЕКСТА ПРОГРАММЫ

 

Рис.3.10.Текст простейшей программы на языке ассемблера

 

Рассмотрим использование меток в этой программе.

Метка START отмечает начальный адрес программы в памяти микро-ЭВМ. В нашем случае START = 8000H, так как именно с этого адреса будет размещать программу директива ORG ARG. Наличие метки START не является здесь обязательным, так как на нее не ссылается ни одна из команд или псевдокоманд программы. Эта метка введена для удобства программиста.

Программа использует три ячейки памяти, снабженные метками ADA0, ADB0, ADSUM. Эти метки имеют смысл, адреса этих ячеек (адрес числа А0, адрес числа В0, адрес суммы). Метки А0 и В0 имеют смысл данных байтового формата – исходных слагаемых А0 и В0. Этим меткам присвоены численные значение директивами MET EQU ARG, то есть установлено А0=2, В0=3. В результате при ассемблировании программы в ячейку ADA0 запишется число 2, а в ячейку ADB0 – число 3. Ячейка ADSUM в программе зарезервирована для размещения результата. Этот результат появляется там только после выполнения программы. До этого содержимое ячейки ADSUM неопределенно.

 

3.2.4.Понятие о работе программы–ассемблера

 

Программа–ассемблер дважды просматривает строчка за строчкой исходный текст программы. При первом просмотре:

  1. устанавливается исходное значение счетчика адресов размещения. При этом в него заносится адрес, указанный в псевдокоманде ORG ARG или 0, если такая директива отсутствует;

  2. начиная с начального адреса, размещаются друг за другом в порядке, заданном текстом программы, машинные коды команд микропроцессора, данные по директивам DB ARG или DW ARG, резервируется память по директиве DW ARG. Если какая–то информация о адресах и данных задана в программе с помощью меток, то под эту информацию резервируется память. Размещение очередного кода в памяти или резервирование очередной ячейки сопровождается увеличением на единицу (инкрементом) счетчика размещения;

  3. все метки, встреченные ассемблером при просмотре, заносятся в специальную таблицу меток;

  4. всем меткам, отмеченным в поле метки двоеточием,, присваивается соответствующее значение счетчика размещения, которое тоже указывается в таблице;

  5. выполняются, если это возможно, директивы MET EQU ARG. Численные значения, определяемые этими директивами, также заносятся в таблицу меток;

  6. по директиве END первый просмотр заканчивается и начинается второй просмотр.

При втором просмотре:

  1. из текста выбираются все метки, не отмеченные двоеточием, то есть входящие в состав мнемоник;

  2. по таблице меток каждой из них присваивается соответствующее численное значение, которое заносится в зарезервированные при первом просмотре ячейки памяти;

  3. ассемблирование заканчивается, если все метки, занесенные в таблицу, получили конкретное численное значение. Если же этого не произошло, регистрируется ошибка.

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

Рис.3.11.Листинг (протокол) ассемблирования программы 2

 

Программа 2, фигурирующая в этом документе, аналогична программе 1, отличаясь только тем, что здесь ячейки памяти с исходными данными размещены в середине текста программы. Разделы документа «машинные коды» и «таблица меток» заполнены в ходе построчного чтения исходного текста в соответствии с изложенной выше методикой. На рисунке обозначены:

– зарезервированное место в таблице меток, заполняемое в ходе первого просмотра текста;

– зарезервированное место в программе, заполняемое в ходе второго просмотра текста.

Рассмотренный документ называют протоколом или листингом ассемблирования. Аналогичный документ готовится и в ходе ассемблирования исходного текста программой–ассемблером. Он может быть выдан на печать или на экран дисплея. В протоколе, генерируемом ассемблером, дополнительно нумеруются строки и указываются обнаруженные ассемблером ошибки. Естественно, при ассемблировании могут быть обнаружены только синтаксические ошибки – нарушения правил составления исходного текста. Логические ошибки в программах ассемблер обнаружить не может. Для облегчения работы программиста ассемблер не только находит ошибки и помечает неправильные строки в листинге, но и сообщает о характере ошибки буквенным кодом.

 

3.2.5. Типовые приемы программирования

 

3.2.5.1.Загрузка регистров

 

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

Примеры загрузки регистров и регистровых пар имеют вид:

MVI

B, 38H

; ЗАГРУЗИТЬ 38H В РЕГИСТР В

MVI

C, ‘L’

; ЗАГРУЗИТЬ КОД ASCII БУКВЫ L В РЕГИСТР C

MVI

D, 01011111B

; ЗАГРУЗИТЬ 01011111В В РЕГИСТР D

LXI

H, 3829H

; ЗАГРУЗИТЬ 3829Н В ПАРУ HL

LXI

D, 0FABCH

; ЗАГРУЗИТЬ 0FABCH В ПАРУ DE

Часто бывает удобнее использовать в командах не сами константы, а их символические имена–метки. Метке может присвоить численное значение, как программист, так и программа-ассемблер. В первом случае программист указывает это значение явно в псевдокоманде MET EQU ARG. Этот случай иллюстрирует следующий фрагмент программы:

 

 

ALFA EQU

38H

; УСТАНОВИТЬ ALFA = 38H

 

 

MVI

B, ALFA

; ЗАГРУЗИТЬ ALFA В РЕГИСТР В

 

 

Во втором случае эта же метка (с двоеточием) должна отмечать одну из команд или псевдокоманд программы, например, следующим образом:

 

   
 

LXI

H, TABL1

; ЗАГРУЗИТЬ В ПАРУ HL АДРЕС TABL1

 

   

TABL1:

DS 7

 

; ЗАРЕЗЕРВИРОВАТЬ 7 ЯЧЕЕК ПАМЯТИ

; ДЛЯ ТАБЛИЦЫ TABL1

 

   

 

3.2.5.2.Очистка регистров

 

Очистка регистров является частным случаем загрузки – загрузкой нулевым кодом. Поэтому для очистки регистров и регистровых пар используют команды типа MVI B, 0 или LXI H, 0.

Для очистки аккумулятора обычно используется команда XRA A. Эта команда использует в качестве обоих операндов поразрядного «исключающего ИЛИ» содержимое аккумулятора и результат также помещает в аккумулятор. Проиллюстрируем очистку аккумулятора этой командой, считая, что в нем содержится код 11110000:

Очевидно, что результат этой операции при любом содержимом аккумулятора будет нулевым. Иногда аккумулятор очищают командой SUB A.

 

3.2.5.3.Установка признака переноса С

 

Установка признака переноса С при сохранении всех остальных признаков результата производится командой STC.

 

3.2.5.4.Сброс признака переноса С

 

Сброс признака переноса С при сохранении всех остальных признаков результата можно выполнить фрагментом программы:

 

STC

; УСТАНОВИТЬ С=1

CMC

; ИНВЕРТИРОВАТЬ С

 

Если нужно сбросить признак переноса, а остальные признаки не важны, следует воспользоваться одной из команд ANA A или ORA A.

 

3.2.5.5.Установка признаков Z, S, P

 

Установка признаков Z, S, P в соответствии с кодом, содержащимся в аккумуляторе, также производится одной из команд ANA A или ORA A.

 

3.2.5.6.Выделение фрагмента двоичного кода

 

Выделить фрагмент двоичного кода, нужный бит или группу битов можно с помощью операции поразрядного логического «И» исходного кода и кода-маски. В маске выделяемые биты должны иметь единичные значения, а остальные – нулевые. Например, старшую тетраду байта, содержащегося в аккумуляторе, выделит следующий фрагмент программы:

   

MASK EQU

11110000B

; МАСКА ДЛЯ СТАРШЕЙ ТЕТРАДЫ

   

ANI

MASK

; ВЫДЕЛИТЬ СТАРШУЮ ТЕТРАДУ

   

 

3.2.5.7.Сравнение байтовых кодов

 

Сравнение байтовых кодов друг с другом обычно производят с помощью команд сравнения CMP R или CPI D8. Как уже отмечалось, эти команды не меняют содержимого аккумулятора, но устанавливают биты регистра признаков F точно также как и команды вычитания SUB R или SUI D8. При равенстве D8 (или кода в регистре R) коду в аккумуляторе признак Z по командам сравнения устанавливается в единицу, поэтому далее обычно следует команда условной передачи управления JZ ADR     или JNZADR, осуществляющая ветвление программы или выход из цикла по условию.

 

3.2.5.8.Циклические программы с заданным числом циклов

 

Циклические программы с заданным числом циклов обычно организуют с помощью команд непосредственной загрузки одного из регистров, декремента этого регистра и команды JNZ    ADR. Общая структура такой циклической программы имеет вид:

 

3.3.Понятие о системном программном обеспечении

 

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

  1. стандартные формы взаимодействия прикладных программ с устройствами ввода-вывода;

  2. стандартные формы взаимодействия пользователя с машиной в процессе подготовки, отладки и запуска прикладных программ.

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

 

3.4. Начальные сведения об учебной микро-ЭВМ Микролаб КР580

 

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

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

  1. общие сведения о микро-ЭВМ;

  2. стандартные приемы ввода-вывода информации, поддерживамые аппаратным и системным программным обеспечением микро-ЭВМ;

  3. программная модель микро-ЭВМ.

 

3.4.1.Общие сведения

 

Микро-ЭВМ Микролаб КР580 построена на основе микропроцессора КР580ВМ80А, работающего с тактовой частотой fCLK = 2MГц. Длительность командного цикла микропроцессора (в машинных тактах) определяется соотношением

МТ = МЦ +МТmin.

Микро-ЭВМ имеет ОЗУ с информационной емкостью 1 К, ПЗУ с резидентной (постоянно находящейся в памяти) программой-монитором емкостью 1 К, а также съемное ПЗУ пользователя емкостью 2 К.

Ввод и вывод информации обеспечивают следующие устройства ввода-вывода:

  1. клавиатура, имеющая 16 цифровых и 8 функциональных клавиш;

  2. восьмиразрядный дисплей на семисегментных светодиодных индикаторах;

  3. линейка из восьми светодиодов;

  4. три двухпозиционных переключателя;

  5. громкоговоритель;

  6. модуль связи с ЭВМ высшего уровня.

Системное программное обеспечение микро-ЭВМ составляют программа- монитор и подпрограммы обслуживания устройств ввода-вывода.

Микро-ЭВМ попадает под управление монитора сразу же после нажатия клавиши «СБРОС». Можно также передать управление монитору из программы пользователя командами JMP STM или RST 0. Здесь метка STM = 0000H — стартовый адрес монитора. При запуске учебных программ монитор автоматически инициализирует указатель стека SP, записав в него адрес 83C7H.

 

3.4.2.Стандартные приемы ввода-вывода информации

 

Семисегментный дисплей микро-ЭВМ Микролаб КР580 управляется семисегментными кодами, содержащимися в восьми последних ячейках ОЗУ. Эти ячейки называются ячейками семисегментной индикации. Для вывода какого-либо символа на дисплей программе достаточно просто занести нужный код в одну из этих ячеек. Соответствие разрядов управляющего кода в ячейке семисегментной индикации и сегментов управляемого индикатора устанавливает рис.3.12. Единица в каком-либо из битов зажигает соответствующий сегмент, а нуль — гасит.

Рис.3.12. Соответствие разрядов управляющего кода и сегментов светодиодного индикатора

 

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

Рис.3.13. Соответствие разрядов дисплея и адресов ячеек семисегментной и шестнадцатеричной индикации

 

Цифровую информацию обычно выводят на дисплей с помощью системной подпрограммы шестнадцатеричной индикации HEX7. Эта подпрограмма переводит байтовые двоичные коды, соответствующие четырем двухразрядным шестнадцатеричным числам, в семисегментные коды управления разрядами дисплея и записывает эти коды в ячейки семисегментной индикации. Для вывода на дисплей двухразрядного шестнадцатеричного числа программе достаточно занести его байтовый двоичный код в одну из ячеек шестнадцатеричной индикации и далее выполнить команду CALL HEX7. Адреса ячеек шестнадцатеричной индикации также удобно нанести на эскиз внешнего вида дисплея (рис.3.13). Следует обратить внимание на то, что каждая из этих ячеек обслуживает два смежных разряда дисплея.

Адресам ячеек семисегментной и шестнадцатеричной индикации присвоены стандартные имена-метки, которые следует использовать в программах, записываемых на языке ассемблера. Эти метки построены с помощью букв, определяющих тип вывода (S — вывод с помощью семисегментных кодов, H — шестнадцатеричный вывод), а также цифр, определяющих номера знакомест дисплея, в которых высветится информация.

Стандартные режимы работы других устройств ввода-вывода обеспечиваются группой доступных программисту системных подпрограмм. Основные сведения об этих подпрограммах сведены в табл.3.1. В эту же таблицу включена и подпрограмма HEX7.

Таблица 3.1 Системные подпрограммы микро-ЭВМ Микролаб КР580

Имя

Стартовый адрес

Выполняемые функции

Размещение входной информации

Размещение выходной информации

Примечания

INIT

04BCH

Инициализация, настройка аппаратуры ввода-вывода

-

-

-

KEY

04C1H

Ввод символа с клавиатуры

-

Код клавиши в регистре А

1,2,3

LINE

04D6H

Вывод байта на линейку светодиодов

Выводимый

байт - в ре-

гистре А

-

1

BEEP

04D9H

Звуков. сигнал

-

-

1,4

SW

04FFH

Ввод трехразрядного кода с двухпозиционных переключателей

-

Вводимый код - в регистре А

1,5

HEX7

04F3H

Преобразова-

группы шест-

надцатеричных

кодов в семи-

сегментные

Ячейки ОЗУ

83ECH...

83EFH

(H10…H76)

Ячейки ОЗУ 83F8H...83FFH (S7…S0)

-

 

Примечания:

  1. перед использованием подпрограммы должна быть однократно

  2. выполнена подпрограмма INIT;

  3. подпрограмма KEY ведет циклический опрос клавиатуры до тех пор, пока не будет зарегистрировано нажатие какой-либо из клавиш. В момент нажатия клавиши происходит выход из подпрограммы с выдачей кода клавиши.

  4. при нажатии цифровых клавиш подпрограмма KEY выдает коды 00Н...0FН, в соответствии с маркировкой этих клавиш. Коды функциональных клавиш приведены в табл.3.2;

  5. подпрограмма BEEP уничтожает информацию, выведенную на линейку светодиодов. Поэтому при совместном применении следует сначала выполнить подпрограмму BEEP и лишь затем – LINE;

  6. подпрограмма SW вводит информацию с двухпозиционных переключателей в три старших разряда байтового кода. Младшие разряды кода обнуляются. Соответствие между размещением переключателей на плате микро-ЭВМ и разрядами вводимого кода устанавливает рис.3.14. Управляемый бит кода будет равен единице, если движок соответствующего переключателя установлен в верхнее положение или нулю — в противном случае.

Рис.3.14. Соответствие двухпозиционных переключателей и битов вводимого кода

 

3.4.3.Программная модель микро-ЭВМ

 

С точки зрения программиста микро-ЭВМ может рассматриваться как совокупность нескольких регистров, портов ввода-вывода и множества ячеек памяти, размещенных в ОЗУ и ПЗУ. Такое представление называют программной моделью микро-ЭВМ. Программная модель микро-ЭВМ Микролаб КР580 представлена на рис.3.15. На этом рисунке адресные пространства ОЗУ и ПЗУ дополнительно разделены на области, передаваемые в распоряжение пользователя и используемые монитором для системных целей.

Рис.3.15.Программная модель микро-ЭВМ Микролаб КР580

 

Следует иметь в виду, что ячейки семисегментной (S0…S7) и шестнадцатеричной (H10…H76) индикации находятся в ОЗУ монитора. Поэтому они полностью доступны программисту только в рамках его собственной программы. При переходе в монитор (например, при нажатии клавиши «СБРОС») информация в этих ячейках затирается служебной информацией монитора.

 

3.5.Простейшие программы для учебной микро-ЭВМ

 

3.5.1.Программа 3

 

Программа (рис.3.16) очищает заданное количество ячеек памяти, начиная с заданного адреса, после чего передает управление монитору.

Программа иллюстрирует очистку регистра А, загрузку константами регистра В и регистровой пары HL, организацию циклической программы с заданным числом циклов и передачу управления монитору.

Кроме того, в этой программе использована идея модификации адреса операнда. Первоначальное значение этого адреса 8100Н заносится в регистровую пару HL до начала циклической части программы командой LXI H, ADR. Команда MOV М, A, расположенная в теле цикла, посылает нулевой код из аккумулятора по адресу, находящемуся в регистровой паре HL (косвенная адресация). При первом выполнении этой команды будет очевидно очищена ячейка ОЗУ с адресом 8100Н. Далее команда INX H увеличивает на 1 содержимое пары HL. Там теперь адрес 8101Н. При втором выполнении тела цикла команда MOV М, A вновь перемещает нулевой код из аккумулятора, но теперь уже в ячейку с адресом 8101Н, которая при этом тоже очищается. Далее вновь модифицируется адрес и так далее, пока не будет выполнены все 10 циклов.

     

; ПРОГРАММА 3

NN

EQU

10

; ОЧИСТИТЬ 10 ЯЧЕЕК ОЗУ,

ADR

EQU

8100H   

; НАЧИНАЯ С АДРЕСА ADR = 8100Н

 

ORG

8000H

; НАЧАТЬ ПРОГРАММУ С АДРЕСА

     

; 8000Н

START:

XRA

A

; ОЧИСТИТЬ АККУМУЛЯТОР

 

MVI

B, NN

; ВЫПОЛНИТЬ NN ЦИКЛОВ

 

LXI

H, ADR

; ЗАГРУЗИТЬ НАЧ. АДРЕС МАССИВА

     

; В HL

M0:

MOV

M, A

; ОЧИСТИТЬ ОЧЕРЕДНУЮ ЯЧЕЙКУ

     

; ПАМЯТИ

 

INX

H

; МОДИФИЦИРОВАТЬ АДРЕС

     

; ОЧИЩАЕМОЙ ЯЧЕЙКИ

 

DCR

B

; ВЫПОЛНЕНЫ ВСЕ ЦИКЛЫ ?

 

JNZ

M0

; НЕТ, ПОВТОРИТЬ ДЛЯ ОЧЕРЕДНОЙ

     

;ЯЧЕЙКИ

 

RST

0

; ПЕРЕДАТЬ УПРАВЛЕНИЕ

     

; МОНИТОРУ

 

END

 

; КОНЕЦ ТЕКСТА ПРОГРАММЫ

 

Рис.3.16.Программа 3

 

3.5.2.Программа 4

 

Программа генерирует однократный звуковой сигнал при нажатии клавиши «1», на нажатие других клавиш не реагирует.

     

; ПРОГРАММА 4

INIT

EQU

 

; СТАРТОВЫЙ АДРЕС П/П INIT

BEEP

EQU

 

; СТАРТОВЫЙ АДРЕС П/П BEEP

KEY

EQU

 

; СТАРТОВЫЙ АДРЕС П/П KEY

KL1

EQU

01H

; КОД КЛАВИШИ «1»

 

ORG

8000H

; НАЧАТЬ ПРОГРАММУ

     

; С АДРЕСА 8000Н

START:

CALL

INIT

; ИНИЦИАЛИЗИРОВАТЬ АППАРАТУРУ

     

; ВВОДА-ВЫВОДА

M0:

CALL

KEY

; ВВЕСТИ СИМВОЛ С КЛАВИАТУРЫ

 

CPI

KL1

; НАЖАТА КЛАВИША «1» ?

 

JNZ

M1

; НЕТ, ПЕРЕЙТИ К МЕТКЕ М1, ИНАЧЕ

 

CALL

BEEP

; ПОДАТЬ ЗВУКОВОЙ СИГНАЛ

M1:

JMP

M0

; ПОВТОРИТЬ ВВОД

 

END

 

; КОНЕЦ ТЕКСТА ПРОГРАММЫ

 

Рис.3.17.Программа 4

 

Программа иллюстрирует сравнение байтовых кодов с помощью команды CPI D8, ветвление по условию с помощью команды JNZ ADR, бесконечный цикл. Следует указать, что вместо команды JNZ M1 можно поставить команду JNZ M0. Работа программы от этого не изменится. Следует также отметить, что пару команд JNZ M1 и CALL BEEP можно заменить одной командой условного вызова подпрограммы CZ BEEP.

     

; ПРОГРАММА 5 (ECHO)

INIT

EQU

 

KEY

EQU

 

HEX7

EQU

 

H10

EQU

; ЯЧЕЙКА ШЕСТНАДЦАТЕРИЧНОЙ

     

; ИНДИКАЦИИ ДВУХ ПРАВЫХ

     

; ПРАВЫХ ЗНАКОМЕСТ ДИСПЛЕЯ

MASK1

EQU

00010000B

; МАСКА ДЛЯ ВЫДЕЛЕНИЯ КОДА

     

;УПРАВЛЯЮЩЕЙ КЛАВИШИ

MASK2

EQU

11110000B

; МАСКА ДЛЯ ОЧИСТКИ МЛАДШЕЙ

     

;ТЕТРАДЫ

 

ORG

8000H   

; НАЧАТЬ ПРОГРАММУ

     

; С АДРЕСА 8000Н

START:

CALL

INIT

; ИНИЦИАЛИЗИРОВАТЬ АППАРАТУРУ

     

; ВВОДА-ВЫВОДА

M0:

CALL

KEY

; ВВЕСТИ СИМВОЛ С КЛАВИАТУРЫ

 

MOV

B, A

; СОХРАНИТЬ КОД КЛАВИШИ В

     

; РЕГИСТРЕ В

 

ANI

MASK1

; НАЖАТА УПРАВЛ. КЛАВИША?

 

JMZ

MO

; ДА, ПОВТОРИТЬ ВВОД, ИНАЧЕ

 

LXI

H, H10

; ЗАГРУЗИТЬ АДРЕС Н10 В ПАРУ HL

 

MOV

A, M

; ЗАГРУЗИТЬ СОДЕРЖИМОЕ ЯЧЕЙКИ

     

; Н10 В АККУМУЛЯТОР

 

RLC

 

; СДВИНУТЬ МЛАДШУЮ

 

RLC

 

; ТЕТРАДУ КОДА В АККУМУЛЯТОРЕ

 

RLC

 

; НА МЕСТО

 

RLC

 

; СТАРШЕЙ

 

ANI

MASK2

; ОЧИСТИТЬ МЛАДШУЮ ТЕТРАДУ

 

ORA

B

; ЗАНЕСТИ КОД НАЖАТОЙ КЛАВИШИ

     

; В МЛАДШУЮ ТЕТРАДУ

 

MOV

M, A

; ЗАГРУЗИТЬ СКОРРЕКТИРОВАННЫЙ

     

; КОД В Н10

 

CALL

HEX7

; ВЫВЕСТИ НА ДИСПЛЕЙ

 

JMP

M0

; ПОВТОРИТЬ ВВОД

 

END

 

; КОНЕЦ ТЕКСТА ПРОГРАММЫ

 

Рис.3.18.Программа 5

 

3.5.3.Программа 5

 

Программа выводит на дисплей произвольные двухразрядных шестнадцатеричные коды, набранных на клавиатуре. Нажатие функциональных клавиш не отрабатывается. Очередная цифра выводится в крайнюю правую позицию дисплея. Цифра, стоящая в этой позиции до нажатия клавиши, сдвигается на одну позицию влево. Программы такого типа используются очень часто. Их называют программами эхо-печати (ECHO).

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

  1. не гасит неиспользуемые разряды дисплея;

  2. сразу же после запуска индицирует на дисплее некоторое число. Лучше, если будут индицировать нули.

 

3.6.Особенности использования подпрограмм

 

3.6.1. Инициализация стека

 

При вызове подпрограммы в стек должен быть записан адрес возврата в основную программу. Естественно, что перед первой такой записью, стек должен быть инициализирован, настроен, то есть под него должна быть отведена программистом конкретная область адресного пространства ОЗУ. Инициализация обычно выполняется следующим фрагментом, размещенным, в самом начале текста программы:

STK

EQU

; АДРЕС ВЕРШИНЫ СТЕКА

START:

LXI

SP, STK

; ИНИЦИАЛИЗИРОВАТЬ УКАЗАТЕЛЬ СТЕКА

     

 

Адрес вершины стека STK выбирают таким образом, чтобы попадающая в стек информация не могла портить другие находящиеся в ОЗУ коды. Чаще всего при настройке стека устанавливают его указатель SP на адрес, величина которого на единицу превышает максимально доступный программисту адрес ОЗУ. Тогда при первом же обращении к стеку для записи информация запишется в две последние ячейки доступного программисту ОЗУ. Следует помнить, что:

  1. простейшие микропроцессорные контроллеры, использующие микропроцессор INTEL8080A, могут не иметь ОЗУ, только ПЗУ. В таких контроллерах нельзя организовать стек и поэтому использование подпрограмм, по крайней мере, в их стандартном виде, невозможно;

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

  3. сразу после включения микропроцессора его указатель стека SP содержит произвольный шестнадцатиразрядный код, то есть указывает на совершенно произвольную ячейку памяти как на вершину стека. Если указатель стека не настроить, работа программы будет непредсказуема.

  4. некоторые мониторы микро-ЭВМ сами инициализируют стек перед передачей управления программе пользователя. Таким свойством, в частности, обладает монитор микроЭВМ Микролаб КР580.

 

3.6.2. Вызов подпрограммы

 

Вызов подпрограммы осуществляется командой CALL ADR безусловно или командми C-CON ADR в зависимости от состояния одного из битов регистра признаков F. При выполнении этих команд управление передается на начальный адрес ADR подпрограммы. В стек при этом запишется адрес возврата – адрес следующей по порядку команды.

Различают 2 разновидности подпрограмм – внутренние и внешние. Внутренняя подпрограмма разрабатывается программистом одновременно с основной программой. Обе они входят в состав единого программного модуля, описываемого единым текстом на языке ассемблера. Начало подпрограммы в этом тексте отмечают уникальной меткой, которую используют для обращения к подпрограмме из основной программы. Внешняя подпрограмма не входит в состав того программного модуля, который к ней обращается. В этом случае обращение к подпрограмме должно осуществляться по ее адресу, непосредственно указанному в цифровой части команды CALL ADR, либо присвоенному псевдокомандой MET EQU ARG метке, входящей в состав команды CALL ADR. Проще работать с внешними подпрограммами, их не надо самому разрабатывать. Однако нужно четко представлять себе, каким именно образом подпрограмма получает входную информацию и выдает выходную. Кроме того, необходимо знать, не меняет ли подпрограмма содержимого аккумулятора либо регистров общего назначения микропроцессора.

 

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

 

Возврат из подпрограммы обычно осуществляется командой RET (безусловно) или командами R-CON в зависимости от состояния одного из битов регистра признаков F. При выполнении этих команд адрес возврата извлекается из стека и заносится в счетчик команд РС. Тем самым передается управление по адресу возврата. Следует особо отметить «парное» применение команд вызова и возврата. В реальной программе после каждого вызова подпрограммы обязательно должен иметь место и возврат в основную программу. Иначе рано или поздно стек переполнится или будет исчерпан полностью, Работа программы при этом нарушится.

 

3.6.4. Передача параметров между основной программой и подпрограммой

 

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

  1. через регистры микропроцессора;

  2. через общие ячейки памяти;

  3. через область параметров;

  4. через стек.

 

Рассмотрим особенности этих способов.

 

3.6.4.1.Передача параметров через регистры микропроцессора

 

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

 

3.6.4.2.Передача параметров через общие ячейки памяти

 

Здесь назначаются конкретные фиксированные ячейки памяти для размещения исходных данных и (или) результатов расчета. Этот способ передачи параметров использован в системной подпрограмме HEX7.

 

3.6.4.3.Передача параметров через область параметров

 

Под областью параметров понимают некоторое множество последовательных ячеек памяти, для которого:

  1. определен фактический адрес начальной ячейки этого множества;

  2. действует своя собственная сквозная нумерация ячеек;

  3. заданы (при помощи этой нумерации) правила размещения входной и (или) выходной информации подпрограммы.

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

Таблица 3.3 Структура области параметров

Собственный адрес

Содержимое

0

Семисегментный код, который надо передать в ячейку S7

1

Семисегментный код, который надо передать в ячейку S6

2

Семисегментный код, который надо передать в ячейку S5

3

Семисегментный код, который надо передать в ячейку S4

4

Семисегментный код, который надо передать в ячейку S3

5

Семисегментный код, который надо передать в ячейку S2

6

Семисегментный код, который надо передать в ячейку S1

7

Семисегментный код, который надо передать в ячейку S0

 

В качестве общих ячеек подпрограмма использует ячейки семисегментной индикации микро-ЭВМ с именами S7…S0. Начальный адрес области параметров будем передавать подпрограмме в регистровой паре HL. Очевидно, что в этом случае появляется возможность использовать разные области параметров при каждом обращении к подпрограмме, то есть печатать на дисплее разные сообщения. Принятую структуру области параметров поясняет табл.3.3. Текст подпрограммы приведен на рис.3.19. Фрагмент основной программы, работающей с подпрограммой PRINT, представлен на рис.3.20. Отметим, что в некоторых случаях удобнее передавать через область параметров не сами эти параметры, а их адреса.

     

; ПОДПРОГРАММА PRINT

     

; ПЕРЕД ОБРАЩЕНИЕМ ЗАНЕСТИ В HL

     

; НАЧАЛЬНЫЙ АДРЕС ОБЛАСТИ ПАРАМЕТРОВ

S7

EQU

83F8H

; АДРЕС СТАРШЕЙ ЯЧЕЙКИ

     

; СЕМИСЕГМЕНТНОЙ ИНДИКАЦИИ

NN

EQU

8

; ЧИСЛО ЯЧЕЕК ИНДИКАЦИИ

PRINT:

MVI

B, NN

; ВЫПОЛНИТЬ NN ЦИКЛОВ

 

LXI

D, S7

; ЗАГРУЗИТЬ АДРЕС СТАРШЕЙ

     

; ЯЧЕЙКИ ИНДИКАЦИИ В ПАРУ DE

PR:

MOV

A, M

; ПЕРЕСЛАТЬ КОД ИЗ ОБЛАСТИ

     

; ПАРАМЕТРОВ

 

STAX

D

; В ЯЧЕЙКУ СЕМИСЕГМЕНТНОЙ

     

; ИНДИКАЦИИ

 

INX

H

; МОДИФИЦИРОВАТЬ АДРЕСА

     

; ИСТОЧНИКА

 

INX

D

; И ПРИЕМНИКА ИНФОРМАЦИИ

 

DCR

B

; ВЫПОЛНЕНЫ ВСЕ ЦИКЛЫ?

 

JNZ

PR

; НЕТ, ПОВТОРИТЬ, ИНАЧЕ

 

RET

 

; ВОЗВРАТИТЬСЯ В ОСНОВНУЮ

     

; ПРОГРАММУ

 

Рис.3.19.Подпрограмма PRINT, использующая область параметров

 

   
 

LXI

H, STR1

; ЗАГРУЗИТЬ НАЧАЛЬНЫЙ АДРЕС

     

; СТРОКИ 1 ПАРУ В HL

 

CALL

PRINT

; ВЫВЕСТИ СТРОКУ 1

 

   
 

LXI

H, STR2

; ЗАГРУЗИТЬ НАЧАЛЬНЫЙ АДРЕС

     

; СТРОКИ 2 ПАРУ В HL

 

CALL

PRINT

; ВЫВЕСТИ СТРОКУ 2

 

   

STR1:

DB

…, …, …, …, …, …, …, …

; СТРОКА 1

STR2:

DB

…, …, …, …, …, …, …, …

; СТРОКА 2

 

Рис.3.20.Фрагмент основной программы, использующей подпрограмму PRINT

 

3.6.4.4.Передача параметров в тексте основной программы

 

В этом случае область параметров (обычно входных) формируется сразу же после команды вызова CALL ADR в тексте основной программы. Такой подход:

  1. cнимает с программиста заботу о сообщении подпрограмме начального адреса области параметров. Этот адрес будет автоматически занесен в стек при выполнении команды CALL ADR, откуда может быть взят подпрограммой;

  2. cоздает программисту определенные трудности по организации возврата из подпрограммы. Возврат в этом случае должен происходить не на ячейку памяти, следующую за командой CALL ADR, а на ячейку, следующую за областью параметров.

   

CALL

PRINTM

 

DB

…, …, …, …, …, …, …, …

; СТРОКА ИЗ 8 КОДОВ

   

 

Рис.3.21.Фрагмент основной программы, использующей подпрограмму PRINTM

     

; ПОДПРОГРАММА PRINTM

     

; ОБЛАСТЬ ПАРАМЕТРОВ

     

; РАЗМЕЩЕНА ПОСЛЕ КОМАНДЫ ВЫЗОВА

S7

EQU

83F8H

; АДРЕС СТАРШЕЙ ЯЧЕЙКИ

     

; СЕМИСЕГМЕНТНОЙ ИНДИКАЦИИ

NN

EQU

8

;ЧИСЛО ЯЧЕЕК ИНДИКАЦИИ

PRINTM:

XTHL

 

; ОБМЕНЯТЬ СОДЕРЖИМЫМ ПАРУ

     

; HL И ВЕРШИНУ СТЕКА

 

MVI

B, NN

; ВЫПОЛНИТЬ NN ЦИКЛОВ

 

LXI

D, S7

; ЗАГРУЗИТЬ АДРЕС СТАРШЕЙ

     

; ЯЧЕЙКИ ИНДИКАЦИИ В ПАРУ DE

PR:

MOV

A, M

; ПЕРЕСЛАТЬ КОД ИЗ ОБЛАСТИ

     

; ПАРАМЕТРОВ

 

STAX

D

; В ЯЧЕЙКУ СЕМИСЕГМЕНТНОЙ

     

; ИНДИКАЦИИ

 

INX

H

; МОДИФИЦИРОВАТЬ АДРЕСА

     

; ИСТОЧНИКА

 

INX

D

; И ПРИЕМНИКА ИНФОРМАЦИИ

 

DCR

B

; ВЫПОЛНЕНЫ ВСЕ ЦИКЛЫ?

 

JNZ

PR

; НЕТ, ПОВТОРИТЬ, ИНАЧЕ

 

XTHL

 

; ОБМЕНЯТЬ СОДЕРЖИМЫМ ПАРУ

     

; HL И ВЕРШИНУ СТЕКА

 

RET

 

; ВОЗВРАТИТЬСЯ В ОСНОВНУЮ

     

; ПРОГРАММУ

 

Рис.3.22.Подпрограмма PRINTM

 

Рассмотрим вариант предыдущей подпрограммы, использующий такую передачу параметров. Обращение к подпрограмме (назовем ее PRINTM) из основной программы представлено на рис.3.21. Текст подпрограммы PRINTM приведен на рис.3.22. В этой подпрограмме:

  1. начальный адрес области параметров пересылаются в пару HL командой XTHL, которая меняет местами коды, находящиеся в паре HL и вершине стека;

  2. адрес возврата из подпрограммы формируется в паре HL в ходе циклической процедуры пересылки кодов из области параметров в выходные фиксированные ячейки памяти;

  3. адрес возврата засылается в вершину стека повторным использованием команды XTHL перед возвратом из подпрограммы.

 

3.6.4.5.Передача параметров через стек

 

При передаче входных параметров через стек оказывается, что эти параметры закрыты для подпрограммы адресом возврата, находящимся в вершине стека. Поэтому подпрограмма должна сначала, до всякой обработки, извлечь этот адрес возврата из стека и сохранить его в регистровой паре или рабочих ячейках памяти. Организация сохранения адреса возврата и его использование при выходе из подпрограммы иллюстрируется фрагментом подпрограммы, приведенном на рис.3.23. Для возврата в основную программу здесь используется команда PCHL, по которой содержимое регистровой пары HL заносится в счетчик команд PC.

     

; ПОДПРОГРАММА SB

SB:

POP

H

; ИЗВЛЕЧЬ ИЗ СТЕКА АДРЕС

     

; ВОЗВРАТА И СОХРАНИТЬ

     

; ЕГО В ПАРЕ HL

 

   
 

   
 

PCHL

 

; ВОЗВРАТИТЬСЯ В ОСНОВНУЮ

     

; ПРОГРАММУ

 

Рис.3.23.Фрагмент подпрограммы, иллюстрирующий сохранение адреса возврата и его использование

 

3.6.5. Сохранение исходного состояния регистров микропроцессора

 

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

МЕТКА:

PUSH

PSW

; СОХРАНИТЬ

(ИМЯ П/П)

PUSH

B

; СОДЕРЖИМОЕ

 

PUSH

D

; РЕГИСТРОВ

 

PUSH

H

; A, F, B, C, D, E, H, L В СТЕКЕ

 

 

; СОБСТВЕННО ПОДПРОГРАММА

 

POP

H

; ВОССТАНОВИТЬ

 

POP

D

; ИЗ СТЕКА

 

POP

B

; СОДЕРЖИМОЕ РЕГИСТРОВ

 

POP

PSW

; A, F, B, C, D, E, H, L

 

RET

 

; ВОЗВРАТИТЬСЯ В ОСНОВНУЮ

     

; ПРОГРАММУ

 

Рис.3.24.Структура подпрограммы, не изменяющей содержимого регистров A,F,B,C, D,E H,L микропроцессора

 

Следует обратить внимание на то, что имена регистровых пар упоминаются в блоке команд POP Rp в конце подпрограммы в порядке обратном, использованному в блоке команд PUSH Rp в начале подпрограммы. Только в этом случае будет обеспечено соответствие между записью в стек и чтением из него.

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

 

3.7. Расчет времени выполнения программ.

 

Микропроцессорные контроллеры часто работают в условиях жестких ограничений на время выполнения программ. Для расчета этого времени сначала устанавливают длительность командного цикла каждой из команд программы, затем определяют сколько раз выполняется каждая команда в ходе циклических программ. Расчет времени выполнения следует начинать с вложенных циклов с наибольшей глубиной вложения. Определим для примера время выполнения на микроЭВМ Микролаб КР580 программы ONSEC, приведенной на рис.3.25.

Рис.3.25.К расчету времени выполнения подпрограммы ONSEC

 

Эта подпрограмма содержит два вложенных друг в друга цикла. Число выполнений внутреннего и внешнего цикла фиксировано и определяется загрузкой счетчиков — циклов регистров В и С. Общее число машинных тактов этой подпрограммы определится следующим образом:

Время выполнения при fCLK = 2MГц определится по соотношению

Таким образом, рассмотренная подпрограмма выполняется за время, близкое к одной секунде. В течение секунды, микро-ЭВМ выполняя эту подпрограмму, не выполняет ни какой другой работы кроме отсчета заданного интервала времени. Программы такого типа часто называют программными задержками. Их длительность обычно не превышает нескольких десятков миллисекунд. Более длительные программные задержки используются редко.

Рейтинг@Mail.ru