Состав команд операций вызова подпрограмм и возврата в основную программу

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

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

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

Когда МП передает первую команду CALL по адресу 1000Н, он находит адрес перехода в двух следующих байтах программы. Адрес, следующий за CALL команды, отправляется (2010) в стек и МП переходит тогда в начало подпрограммы по адресу 1000Н. Команды, составляющие эту программу, выполняются до тех пор, пока МП не встретит команду возврата RET. Сохраняющий в стеке адрес 2010 помещается в счетчик команд и МП продолжает выполнение основной программы, принимая ее там, где он ее покинул. Эта программа выполняется до тех пор, пока МП не встретит другую команду подпрограммы вызова CALL по адресу 2020. МП сохраняет адрес следующей команды 2023 в стеке и переходит к подпрограмме, находящейся по адресу 1000Н. После завершения выполнения этой подпрограммы команда возврата RET извлекает из стека адрес следующей команды основной программы (2023) и загружает ее в счетчик команд.

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

Подпрограммы, как правило, размещены в ПЗУ МП, но в некоторых случаях для ускорения выполнения программ, подпрограммы размещают в ОЗУ.

Команда вызова сочетает функции оператора загрузки в стек и перехода.

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

Нарисуем блок-схему выполнения этой команды:

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

Имеет место следующей последовательности операции:

1. Указатель стека декрементирован от 210А до 2109.

2. Старший байт счетчика команд загружается в стек по адресу 2109.

3. Указатель стека декрементируется до 2108.

4. Младший байт счетчика команд загружается в ячейку памяти с адресом 2108.

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

6. Старший байт адреса перехода загружается в старший байт счетчика команд.

После этого МП ответвляется по адресу, на который указывает счетчик команд (в примере 1000Н). Этот адрес является началом подпрограммы. В конце подпрограммы находится команда RETERN. Обнаружив ее, МП извлекает в известном порядке из стека сначала младший, затем старший байты и размещает их в счетчике команд (в примере 2010). После этого продолжается выполнение основной программы до следующей команды CALL.

Имеется ряд других таких команд, как команды обслуживания стека, отсутствие операции, команда остановок и др. При их выполнении индикаторы регистра состояния не меняются.

Программирование микропроцессара

Запись программы

Программист должен:

1. Знать состав команд МП.

2. Быть хорошо знаком с расположением регистров МП.

3. Знать общую архитектуру ЭВМ.

Этапы развития программы могут быть представлены следующим образом:

· Определить и проанализировать задачу.

· Начертить структурную схему решения.

· Записать программу на ассемблере.

· Записать или генерировать программу в кодах.

· Загрузить программу на решение.

· Документировать программу.

Например.

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

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

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

Нарисуем подробную функциональную схему:

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

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

Затем следует записать версию подробной структурной схемы на ассемблере в 4 типовых поля: метка, мнемоника, операнд и комментарий.

Метка Мнемоника Операнд Комментарий
  LXI Н, 2010Н Загрузить адрес 2010Н в пару регистров HL. Эта пара регистров используется как указатель адреса.
  MOV А, М Поместить первое число из ячейки памяти с адресом 2010Н в аккумулятор (А).
  INX Н Инкрементировать пару регистров HL до 2011Н.
  ADD М Сложить второе число в ячейке памяти 2011Н с содержимым А.
  INX H Инкрементировать пару регистров HL до 2012.
  ADD M Сложить третье число в ячейке памяти 2012 с содержимым А.
  INX Н Инкрементировать пару регистров HL до 2013.
  MOV М, А Поместить сумму из А в ячейку памяти 2013.
  HLT   Остановить МП.


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

Записанная версия должна быть переведена в состав бит из 0 и 1, понимаемых МП и называемых машинным кодом.

Это можно сделать с помощью специальных программ или вручную.

Вручную кодирование выполняется следующим образом:

1. найти код операции каждой мнемоники в таблице состава команд.

2. определить операнды (данные и адреса), когда это необходимо передать командами из нескольких байт.

3. установить адреса памяти в последовательности каждой команды и операнда.

Шестнадцатеричная Мнемоника Операнд Комментарий
Адрес Содержимое
21(код операции) 10 (младший байт) 20 (старший байт) LXI Н, 2010Н Загрузить адрес 2010Н в пару регистров HL, как указатель адреса.
MOV А, М Загрузить первое число из ячейки памяти с адресом 2010Н в А.
INX Н Инкрементировать пару регистров HL до 2011Н.
ADD М Сложить второе число с адресом 2011Н с содержимым А.
INX H Инкрементировать пару регистров HL до 2012.
ADD M Сложить третье слагаемое из ячейки памяти 2012 с содержимым А.
INX Н Инкрементировать пару регистров HL до 2013.
MOV М, А Поместить сумму из А в ячейку памяти, на которую указывает содержимое пары регистров HL.
202А HLT   Остановить программу.

Затем нужно проверить программу в том смысле работает ли она. Эта операция представляет собой процесс отладки программы (поиск и устранение ошибок).

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

Большие сильно развитые программы требуют тщательно разработанной документации.

Ветвление программ

Рассмотрим на примере.

Найти большее число и поместить его в определенную ячейку памяти.

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

Во-первых, 2-х кадрах блок-схемы представлены операции загрузки чисел в регистре A и L. Команда сравнение, не разрушая содержимого регистров, вычитает из содержимого Аккумулятора содержимое регистра L. Результат сравнения изменяет состояние индикаторов (флагов) в регистре состояния. Следующий кадр называется знаком принятия решений. Он завершает в программе этап решения и содержит поставленный вопрос [(A) ≥ (L)]? Если да, то программа продолжается последовательно и содержимое аккумулятора помещается в память, затем МП останавливается. Если нет, то программа ответвляется и содержимое регистра L помещается в память, затем МП останавливается.

Ъ

Метка Мнемоника Операнд Комментарий
  MVI A, ØF Загрузить число 15 (в десятичной форме) в аккумулятор.
  MVI L, Ø6 Загрузить число Ø6 в регистр L.
  CPM L Сравнить содержимое А с содержимым регистра L, индикатор CY регистра состояния =1, если А<L.
  JC STORE, L Перейти к STORE, L,если CY=1 (если A<L). В противном случае продолжить последовательность.
  STA 2040H Загрузить содержимое А в ячейку памяти 2040.
  HLT   Остановить МП.
STORE, L MOV A, L Поместить регистр L в А.
  STA 2040H Загрузить содержимое А в ячейку памяти 2040.
  HLT   Остановить МП.

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

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

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

ЦИКЛЫ

Вычислительные машины (системы) особенно эффективны в случае выполнения повторяющихся задач.

Например, если программе необходимо провести счет от 0 до 254 (ØØ до FE) и вывести результат счета на какую-либо выбранную периферию, то если не использовать циклов, программа будет содержать не менее 300 строчек.

Нарисуем блок-схему этой задачи.

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

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

Рассмотрим другой пример.

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

Структурная схема размещения ряда чисел (от 0 до 8) последовательно в память с адресами от 2040 до 2048. Два первых кадра соответствуют начальной загрузке пары регистров HL и аккумулятора значениями 2040 и ØØ соответственно. Третий кадр соответствует процессу размещения данных в памяти и который будет повторяться 9 раз, в ходе выполнения этой программы. МП, повторяя свои действия, размещает содержимое аккумулятора в памяти по адресу, указанному в паре регистров HL. Четвертый и пятый кадры представляют операции, которые изменяют адрес в паре регистров HL и числа в аккумуляторе. Кадр сравнение и знак принятия решения составляют операцию тестирования. Команда сравнение вычитает число Ø9 из содержимого аккумулятора для установки или сброса индикатора нуля в регистре состояния.

Если содержимое аккумулятора меньше 9 индикатор нуля сброшен. Команда сравнения и условного перехода используются для проверки изменяющегося счета и определения момента выхода из цикла.

Метка Мнемоника Операнд Комментарий
  LXI H, 2040 Загрузить число 2040 в пару регистров HL.
  XRA A Сброс А в ØØ.
LOOP MOV M, A Поместить А в М.
  INX H Инкремент HL.
  INR A Инкремент А.
  CPI Ø9 Сравнить А= Ø9. Если да, то индикатор нуля Z установится в единицу.
  JZ LOOP Перейти к LOOP, если Z=0, т.е. если содержимое А ≠ Ø9, если да, то продолжить последовательно.
  HLT   Остановить МП.

ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ

Существуют подпрограммы, очень часто используемые одной и той же типовой программой или одним и тем же программистом в различных программах. Передача управления программой в подпрограмме выполняется одной командой вызова (CALL). Возврат или восстановление управления основной программой осуществляется командой возврата (RET). Кроме того, используются команды размещения в стек и извлечения из стека – используются как текущие вместе с подпрограммой.

Пример.

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

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

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

Нарисуем подробную блок-схему.

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

Метка Мнемоника Операнд Комментарий
  LXI SP, 20CØ Поместить число 20CØ в указатель стека.
  LXI Н, 2040 Поместить адрес 2040 в пару регистров HL (указать область ОЗУ, в которой будут находиться данные).
  XRA A Сброс аккумулятора в ØØ.
  ADD М Сложить содержимое аккумулятора с М (2040).
  INX H Инкрементировать пару регистров HL.
  ADD M Сложить содержимое аккумулятора с содержимым ячейки памяти 2041.
  PUSH PSW Поместить в стек содержимое аккумулятора и индикатора регистра состояния.
  CALL MULTIPLAY Вызов подпрограммы MULTIPLAY, начинающейся с адреса 2042.
  INX H, 2042 Инкремент HL до 2042.
  MOV M, A Разместить произведение в ячейку памяти 2042.

Три первые команды восстанавливают указатель стека пару регистров HL и аккумулятор соответственно до 20СØ, 2040 и ØØ.

Четвертая команда складывает содержимое аккумулятора с содержимым ячейки памяти, на которую указывает пара регистров HL. Например, содержимое памяти по адресу 2040 – Ø5.

После выполнения четвертой команды, содержимое аккумулятора будет Ø5 (ØØ + Ø5 = Ø5).

Пятая команда основной программы инкрементирует содержимое пары регистров HL.

Шестая команда складывает содержимое памяти по адресу 2041 (Ø9) с содержимым аккумулятора. В результате Ø5 + Ø9= ØЕ.

Следующая команда PUSH PSW сохраняет содержимое аккумулятора и индикаторы регистра состояния. Это должно быть выполнено потому, что следующая команда вызова подпрограммы разрушит содержимое этих регистров, при выполнении программы умножения.

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

Например, адрес 2050 (adr. 2050). В примере подпрограммы осуществляется умножение суммы ØЕ * 2 = 1С и произведение помещается в аккумулятор. После возврата в основную программу адрес следующей последовательной команды извлекается из стека и например, равен 200Е.

Т.к. команды размещения в стек и извлечение из него парные, то содержимое аккумулятора и регистра состояния восстанавливается командой POP PSW.

Теперь содержимое аккумулятора является не произведением, а сумма ØЕ. Эта сумма будет тестируема следующей командой CPI. Две следующие команды основной программы для тестирования суммы в аккумулятор. Команда сравнить непосредственно (CPI) выполняет операцию вычитание (ØЕ – 10 = FE). Результат вычитания будет FE, который представлен в дополнительном коде. Т.е. содержимое аккумулятора меньше, чем 10. Индикатор CY равен 1 и МП переходит к символическому адресу START.

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

Например:

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

При повторяющемся сложении это операция выглядит иначе:

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

В этом случае множимое повторяется слагаемым число раз, равное множителю, а результат этой операции будет произведение. В нашем примере вместо ØЕ * Ø2 = ТС будет ØЕ + = 1.

Первый шаг обеспечивает хранение текущего содержимого пары регистров HL в стеке. Три следующих шага восстанавливают регистры (L), (H) и (A). Регистр (L) будет содержать множитель (Ø2) и он будет инкрементирован программой до. Регистр (Н) содержит множимое (ØЕ), т.е. сумму, посланную в подпрограмму основной программы. Аккумулятор = ØØ. Пятый шаг соответствует сложению множимого (ØЕ) с аккумулятором (ØØ). Частное произведение ØЕ затем сохраняется в ОЗУ по адресу, например, 2020. В то время, как аккумулятор используется для декрементирования содержимого регистра (L). На шаге принятия решения возникает вопрос (L) = ØØ? Если ответ отрицательный, программа переходит снова в цикл. Если ответ положительный, ветвится вправо. Содержимое пары регистров HL восстанавливается командой извлечения из стека и наконец команда возврата возвращает нас в основную программу.

Нарисуем блок-схему.

состав команд операций вызова подпрограмм и возврата в основную программу - student2.ru

Метка Мнемоника Операнд Комментарий
  PUSH H Поместить в стек содержимое регистра HL (20C1).
  MVI L, Ø2 Поместить множитель Ø2 в регистр L.
  MOV H, A ØE из (А) поместить в (Н).
  XRA A Сброс (А) в ØØ.
LOOP ADD H Сложить (А) с (Н).
  STA Поместить частное произведение (ØØ + ØE = ØE) в (М).
  MOV A, L Содержимое (L) поместить в (А).
  DCR A Декремент (А).
  MOV L, A Содержимое (А) поместить в (L).
  LDA Поместить в Аккумулятор содержимое ячейки памяти 2020.
  IZ DONE Перейти к DONE, если индикатор Z=1, т.е. регистр L декрементируется в ØØ, если нет – продолжить последовательно.
  IMP LOOP Перейти всегда к символическому адресу LOOP.
DONE POP H Извлечь из стека содержимое пары регистров HL.
  RET   Возврат в основную программу.

ИНТЕРФЕЙС МИКРОПРОЦЕССОРА

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

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

СПИСОК ЛИТЕРАТУРЫ

1. Архитектура компьютера Э.Таненбаум С.Пб.

2. Р. Токхейм «Основы Цифровой электроники». Москва.-Мир. 1988

3. Р. Токхайм «Микропроцессоры» Курс и упражнения. Москва.-Энергоатомиздат 1988

4. П. Хоровиц, У. Хилл «Искусство схемотехники» в двух томах Москва.-Мир, 1983

[1] Нормально замкнутый (НЗ) контакт обозначает положение подвижного контакта на схеме и наоборот нормально разомкнутый (НР) контакт не соединен с подвижным контактом на схеме.

Наши рекомендации