Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микропроцессоры Токхайм / 6.13 ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ

.doc
Скачиваний:
172
Добавлен:
13.05.2015
Размер:
4.23 Mб
Скачать

6.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ЕН основной программы.

В случае, когда множителем является 02Н, программа дважды пройдет в последовательности сложить—поместить—передать—декрементировать—передать—загрузить перед возвратом в ос­новную программу. Отметим, что окончательное произве­дение 1СН поступит в основную программу, оставаясь в аккумуляторе.

В табл. 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. Функциональной.