
Микропроцессоры Токхайм / 6.13 ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ
.doc6.13. ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ
Существуют подпрограммы, очень часто используемые одной и той же основной программой или одним и тем же программистом в различных программах. Бывает, что одна подпрограмма так часто используется, что она помещается в ПЗУ постоянно. Передача управления программой в подпрограмму выполняется одной командой вызова. Возврат или восстановление управления основной программой осуществляется командой возврата. Кроме того, команды помещения в стек, извлечения из стека и загрузки указателя стека используются также как текущие вместе с подпрограммой.
На рис. 6.45, а приведен пример функциональной структурной схемы. В задачу МП входит ввести два отобранных
числа, образовать их сумму и сохранить ее. Этой процедуре соответствуют три кадра в начале схемы. Затем сумма должна быть умножена на масштабный коэффициент и
результат размещается в памяти. Это связано с тем, что сумма (в третьем кадре) должна быть восстановлена в аккумуляторе. Затем она проверяется знаком принятия решения. В том случае, если сумма равна или больше 10Н (16ю), программа выводится на сигнализацию тревоги, если меньше ЮН, циклится и снова вводит выборку чисел. Такой тип программ мог бы быть использован в промышленных устройствах, когда сумма двух входов должна постоянно контролироваться; быть подвержена масштабированию, а затем размещена в памяти; контролироваться по крайней мере один раз в секунду для определения, не приняла ли она опасного значения, и если да, то программа должна выдать аварийный сигнал АС.
Программа задумана для образования циклов неопределенно долго и принимает новые наборы данных в каждом цикле. Она покидает цикл для процедуры аварийной сигнализации только в случае возникновения соответствующей ситуации. В этом случае оператор или другая программа выдает процедуру отработки аварийного состояния. Это показано на структурной схеме кружком.
На рис. 6.45,б представлена схема программы.
Каждый кадр ее эквивалентен одной операции МП. Выделенная рамкой ячейка, представляет собой группу команд, называемую подпрограммой умножить.
В табл. 6.13 представлена программа на ассемблере к рис. 6.45,б. Этот список привлекает только команды, которые составляют часть состава команд нашего типового МП (список, относящийся к подпрограммам умножения, на рисунке не приведен).
Три первые команды (табл. 6.13) восстанавливают указатель стека, пару HL и аккумулятор А соответственно до 20С0Н, 2040Н и ООН. Четвертая складывает содержимое (А) (т.е. ООН) с содержимым ячейки памяти, на которую указывает пара HL (адрес 2040Н). Обратимся к рис. 6.46, который представляет собой основную программу, данные, подпрограмму и память стека, использованные в этом примере. Заметим, что содержимым памяти по адресу 2040Н, сложенным с (А) является 05Н. После выполнения четвертой команды содержимым (А) является 05Н (00Н + + 05Н=05Н).
Пятая команда основной программы инкрементирует пару HL. Шестая складывает содержимое памяти по адресу 2041Н с (А). Эта ячейка памяти содержит 09Н (см. рис. 6.46), А содержит 05Н, сумма в А после второго ADD М—ОЕН является суммой двух выбранных чисел.
Следующей командой основной программы является PUSH PSW, которая сохраняет содержимое аккумулятора и индикатора. Это должно быть выполнено, потому что следующая команда вызова разрушит содержимое этих регистров, выполняя подпрограмму умножения. Операция вызова помещает адрес команды в последовательности основной программы (в нашем примере 200ЕН) в стек, затем переходит к адресу первой команды подпрограммы (адрес 2050Н).
Этот вызов показан на рис. 6.45, б. Теперь рассмотрим команду вызова как команду, которая просто умножает содержимое А на два. Подпрограмма в нашем примере осуществляет умножение 0ЕНХ2=1СН, и произведение, помещенное в аккумулятор к моменту возврата, будет 1СН.
После возврата в основную программу адресом следующей последовательной команды становится 200ЕН. Команда INX Н инкрементирует пару HL, и произведение, выполненное подпрограммой, помещается теперь в памяти по адресу 2042Н командой MOV М, А.
Вспомним, что команды помещения в стек и извлечения из него парные. Только что мы поместили в стек содержимое аккумулятора и индикаторов командой PUSH PSW, мы их восстановим теперь командой POP PSW. Содержимое аккумулятора является не произведением, а суммой 0ЕН в нашем примере). Эта сумма будет тестирована последующей командой.
Важно отметить, что (0ЕН) отправлена в подпрограмму для обработки. Напротив, именно произведение было
передано подпрограммой и, следовательно, размещено в памяти. На жаргоне информатики эта операция составляет прохождение параметра. В данном случае использован именно регистр А, но в других случаях это могло бы быть выполнено посредством памяти.
Две следующие команды основной программы предназначены для тестирования суммы в аккумуляторе. Команда сравнить непосредственно выполняет операцию вычитания 0ЕН—10H = FEH с использованием дополнительного кода числа — 210. Содержимое А меньше чем 10Н, индикатор переноса CY установлен в 1. Команда ПЕРЕЙТИ, если перенос, проверяет индикатор, он установлен в 1, и МП переходит к символическому адресу START, который является не чем иным, как началом цикла команды LXI Н (адресация 2003Н, см. рис. 6.46).
Для операции двоичного умножения могут быть использованы различные способы на базе команд типового МП. Вытекающие непосредственно из правил умножения методы приводят к повторяющемуся сложению. Рассмотрим типичное решение на примере выполнения операции 5X3 = = 15ю.
При повторяющемся сложении эта операция выполнится иначе:
В этом случае множимое повторяется слагаемым число раз, равное множителю, а результатом этой операции будет произведение. В нашем примере подпрограмма эффективно выполняет операцию сложения (вместо 0Ех2 = = 1СН). Множимое складывается с самим собой (0Е + + 0Е=1СН), что дает искомое произведение.
На рис. 6.47 приведена подробная структурная схема подпрограммы умножения, и каждый ее шаг соответствует одной команде программы на ассемблере, приведенной в табл. 6.14.
Первый шаг на рис. 6.47 обеспечивает хранение текущего содержимого пары HL операцией помещения в стек. Это характерно для многих подпрограмм — помещать в
стек содержимое регистров МП, потому что они могут быть использованы во время выполнения подпрограммы, что изменит их содержимое. Совершенно очевидно, что содержимое пары HL будет восстановлено в конце программы командой извлечения из стека.
Три следующих шага восстанавливают регистры L, Н и А. Регистр L будет содержать множитель (здесь 02Н), и он будет декрементирован до ООН в ходе программы умножения. Регистр Н будет содержать множимое (здесь 0ЕН). т.е. сумму, посланную в подпрограмму основной программой. Аккумулятор здесь сбрасывается в 00Н.
Пятый шаг соответствует сложению множимого (здесь 0ЕН) с (А). Частичное произведение 0ЕН затем сохраняется во временной памяти по адресу 2020Н, тогда как аккумулятор используется для декрементирования содержимого L. Один раз множитель декрементируется от 02Н до 01Н и помещается в L. Затем частичное произведение восстанавливается в А.
На шаге принятия решения возникает вопрос: (L) =00?. Если ответ отрицательный, программа переходит снова в цикл, если положительный — ветвится вправо. Содержимое пары HL восстанавливается командой извлечения из стека, и, наконец, команда возврата возвращает нас в основную программу. Согласно рис. 6.46 возврат осуществляется по адресу 200ЕН основной программы.
В табл. 6.14 приведена программа на ассемблере. Каждая команда соответствует одному шагу структурной схемы на рис. 6.47. Рекомендуем читателю попытаться проследить поток данных сначала по ней, а затем по программе, приведенной в табл. 6.14.
Используя команды вызова и возврата, следует быть очень внимательным и использовать их парами. Нужно следить за тем, чтобы требуемые регистры были правильно инициализированы, многократно проверять состояние указателя стека. Следует также убедиться, что парно используются команды загрузки и извлечения из стека, а также глубоко осознать способы обмена параметрами между подпрограммами и основными программами.
Упражнения
Подпрограмма умножения на рис. 6.47 для вычисления произведения использует метод ______ (сложения-сдвига, повторяющегося сложения).
См. рис. 6.46. Какие типы команд используются обычно памятью, называемой стеком?
Назначением команды LXI SP в табл. 6.13 является ________ (установка, тестирование) указателя стека.
6.111. Если индикатор переноса в табл. 6.13 установлен в 1, по команде JC МП перейдет к выполнению команды _________(HLT, LXI H).
6.112. Команда вызова в табл. 6.13 осуществляет помещение в стек содержимого ________ (регистра Л, счетчика
команд) и загрузку счетчика команд адресом ________ (шестнадцатеричный).
6.113. См. табл. 6.13. Команда POP PSW извлекает из
стека содержимое ________ (аккумулятора, счетчика команд)
и индикаторов и передает их в МП.
6.114. Знак принятия решения (см. рис. 6.47) заменяется обычно командой _________ (сравнить, JUMP).
6.115. При выполнении подпрограммы УМНОЖИТЬ, приведенной в табл. 6.14, множимое находится в регистре ___________ (Н,L), а множитель — в регистре (H,L).
6.116. В ходе выполнения подпрограммы умножить содержимое регистра ______ (H, L) декрементируется до
00Н.
6.117. См. табл. 6.13 и 6.14. Регистры Я и L используются как ______ (регистры данных, указатели адреса) в
основной программе и как _______(указатели адреса, регистры данных) в подпрограмме.
Решения
6.108. Повторяющегося сложения. 6.109. Помещения в стек, извлечения из стека (PUSH и POP) соответственно.
См. рис. 6.50. Каковы состояния индикаторов после операции XRI?
См. рис. 6.51. Каково содержимое аккумулятора после операции СМА?
6.144. См. табл. 6.4. Если аккумулятор содержит 1110 1110 и CY—0, каково содержимое Л и СУ после выполнения операции RAR?
6.145. Почти все команды передачи ______ (влияют, не
влияют) на индикаторы.
См. табл. 6.5. Команды IN и OUT являются командами ________ адресации.
См. табл. 6.5. В ходе выполнения команды MOV L, А регистр ______ (A, L) является источником данных,
а регистр ____ (A, L) — назначением.
6.148. См. табл. 6.5. Код операции команды LDA _____,
ее формат — ________байт.
6.149. См. рис. 6.52. Каково содержимое аккумулятора после операции загрузки?
6.150. См. рис. 6.52. Какой адрес источника данных?
6.151. См. табл. 6.5. Какой способ адресации команды загрузки на рис. 6.52?
6.152. Команды перехода называют также команда- ми ______.
6.153. Команды ____(условного, безусловного) пере- хода называются командами принятия решения.
6.154. Команды перехода устанавливают содержимое ____ (счетчика команд, указателя стека).
См. табл. 6.6. Какой КОП команды JZ на рис. 6.53?
См. рис. 6.53. Каково содержимое счетчика команд после операции JZ?
6.157. Команда _______(вызова, возврата) типового микропроцессора выполняет одновременно функции помещения в стек или извлечения из него.
Команда __________(вызова, возврата) следует в конце подпрограммы.
См. рис. 6.54. Каково содержимое ячейки памяти 2109Н после выполнения операции вызова?
6.160. Каково содержимое ячейки памяти 2108Н в стеке (рис. 6.54) после вызова?
6.161. См. рис. 6.54. Каково содержимое счетчика команд после вызова?
6.162. См. рис. 6.54. Содержимое счетчика команд после вызова указывает на первую команду ______(стека, под- программы).
6.163. См. табл. 6.8. Какой КОП команды NOP на рис. 6.55?
6.164. Каково содержимое регистров после операции NOP на рис. 6.55?
6.165. См. табл. 6.8. Если команда PUSH PSW использована как первая команда подпрограммы, какая команда (дать ее мнемонику) используется непосредственно перед возвратом?
6.166. Когда типовой микропроцессор находится в со- стоянии останова после команды HLT, его может запустить только вход ______(ГТИ, сброса) или вызов прерывания.
6.167. Первым этапом записи программы является _______ (определение задачи, запись на ассемблере).
6.168. Программист должен хорошо знать архитектуру
системы, ее воображаемую память, регистры МП и ______
МП.
6.169. После анализа и определения задачи следующим
этапом программирования является составление ____
(документации, структурной схемы).
Формат команд непосредственной адресации в типовом микропроцессоре составляет _________ байт.
См. табл. 6.8. Команда PUSH Н является _______
байтовой командой ______ адресации.
6.172. См. табл. 6.3. Команда сравнить Л и L является _______ байтовой.
6.173. См. табл. 6.5. Команда LDA
является ______ байтовой командой ______ адресации.
6.174. В знаке
принятия
решения
____ (ставится вопрос,
утверждается
положение).
6.175. Для определения содержащейся внутри знака
принятия решения команды используют команду ______
(логическую, условного перехода).
До операции условного перехода часто используются команды ______(загрузки, сравнения).
Структурные схемы со знаками принятия решения, _______ (являются, не являются) последовательными.
См. табл. 6.12. Каково назначение команды XRA А?
Формирование ______ используется для решения
повторяющихся задач.
См. рис. 6.44, а. Самое большое число, выводимое этой программой, ______.
Наиболее часто используемые программы помещаются в _______ (ПЗУ, ОЗУ).
При команде JC проверяется индикатор ________
(CY, Z).
6.183. Команды PUSH и _________ (ADD, POP) должны
использоваться совместно.
6.184. Команда CALL и ________(RET, JUMP) должны
использоваться парно.
6.185. Структурная схема на рис. 6.45, а является ________
(подробной, функциональной).
Решения
6.118. Машинном. 6.119. Ассемблер. 6.120. Метка, мнемоника, операнд, комментарий. 6.121. Исходной программой. 6.122. Больше. 6.123. Состояния. 6.124. Адреса. 6.125. ОЗУ. 6.126. L. 6.127. Указателем стека. 6.128. Счетчиком команд. 6.129. Вычесть 1. 6.130. Влияют. 6.131. Индикаторы. 6.132. 0000 0001. 6.133. Переноса — устанавливается в 1, нуля — сбрасывается в 0. 6.134. Вычитаемое. 6.135. Отсутствие переноса; больше. 6.136. 1111 1110; —210. 6.137. СУ=1; Z = 0. 6.138. Устанавливаются. 6.139. И. 6.140. ЕЕН. 6.141. 1100 1100. 6.142. СY=0; Z=0. 6.143. 0000 1110. 6.144. (А) =0111 0111 и СУ = 0. 6.145. Не влияют. 6.146. Прямой. 6.147. A; L. 6.148. ЗАН; 3. 6.149. 1010 1010. 6.150. 210АН. 6.151. Прямая адресация. 6.152. Ветвления. 6.153. Условного. 6.154. Счетчика команд. 6.155. САН. 6.156. 2003Н (то же, что и до перехода). 6.157. Вызова. 6.158. Возврата. 6.159. 0010 0000 (20Н). 6.160. 0000 0111 (07Н). 6.161. 30F0H (ООП 10000 1111 0000). 6.162. Подпрограммы. 6.163. ООН. 6.164. Регистр состояния: СУ=0; Z=0 (без изменения).
Аккумулятор: (А) = 1111 0000 (без изменения).
Пара регистров Н: (HL)=20C0H (без изменения).
Счетчик команд инкрементирован до значения 2001Н. 6.165. POP PSW. 6.166. Сброса. 6.167. Определение задачи. 6.168. Состав команд. 6.169. Структурной схемы. 6.170. 2 или 3. 6.171. Одно; косвенной регистровой. 6.172. Одно; регистровой. 6.173. Трех; прямой. 6.174. Ставится вопрос. 6.175. Условного перехода. 6.176. Сравнения. 6.177. Не являются. 6.178. Сбросить аккумулятор до ООН. 6.179. Образования циклов. 6.180. FEH или 25410. 6.181. ПЗУ. 6.182. СУ. 6.183. POP. 6.184. RET. 6.185. Функциональной.