Процедуры и подпрограммы
Разрабатывая ПО контроллеров, программист применяет два способа организации программ:
монолитный, когда прикладная программа разрабатывается как единое целое;
модульный, когда программа строится из отдельных программных блоков. Каждый из них выполняет законченную логическую функцию, т.е. вычислительную процедуру, оформляемую в виде подпрограмм, к которой вызывающая (основная) программа может обращаться по необходимости. Обращение к подпрограмме реализуется вызовом по команде CALL MARK, где MARK - содержательное имя процедуры, используемое в качестве метки, отмечазжющей команду подпрограммы. Командой CALL в стеке сохраняется значение счетчика команд, и возврат из подпрограммы реализуется в то место основной программы, откуда был осуществлен вызов. Поэтому подпрограммы заканчиваются командой возврата RET (безусловного или условного), которая восстанавливает содержимое счетчика команд из стека. Командой CALL не сохраняется в стеке содержимое регистров общего назначения и, если подпрограмма использует те же рабочие регистры, что и основная программа, то она должна обеспечить сохранение их содержимого. Хранение текущего содержимого регистров осуществляется стеком. Например, подпрограмма, в которой реализуются перечисленные функции, составляется так:
MARK: | PUSH PSW | ; сохранить в стеке содержимое |
; аккумулятора и признаков | ||
PUSH В | ; сохранить содержимое регистровой пары ВС | |
PUSH D | ; сохранить DE | |
PUSH H | ; сохранить HL | |
: | ; текст подпрограммы | |
POP H | ; восстановить содержимое регистровой пары HL | |
POP D | ; восстановить DE | |
POP В | ; восстановить ВС | |
POP PSW | ; восстановить PSW | |
RET |
Восстановление содержимого регистров выполняется в порядке, обратном порядку упаковки в стек. Процесс вложения программ заключается в последовательном вызове друг у друга подпрограмм, а их число называется глубиной вложенности, которая ограничивается емкостью стека, т. е. размерами области оперативной памяти, отведенной для стека и адресуемой указателем стека SP.
Чтобы подпрограмма успешно работала, необходимо однозначно определить место хранения ее исходных данных и выходные параметры.
Параметрические подпрограммы требуют дополнительных параметров для вычисления (например, умножения).
Непараметрические подпрограммы - это подпрограммы, в которых результат выполнения не зависит от момента вызова подпрограммы и места в основной программе, из которого осуществлен вызов. Например, подпрограмма реализации временной задержки длится одну секунду. Но ее можно оформить и как параметризуемую, если в основной программе требуется реализация временных задержек различной длительности. Основная программа при этом обеспечивает передачу в подпрограмму установок, обеспечивающих требуемое время задержки.
Возможности МП характеризуются тремя способами передачи параметров:
- через память. Основная программа обязательно содержит последовательность команд:
STA MEMORY
CALL MARK 1
или:
LXI H, MEMORY MOV M,r
CALL MARK 1
Подпрограмма MARK 1 должна содержать команду LDA MEMORY. При передаче выходных параметров через память в подпрограмме должна соблюдаться такая последовательность команд'
STA MEM1
RET
или:
LXI H, MEM1
MOV М,г
RET
В основной программе после команды вызова подпрограммы должна быть команда LDA MEM1;
- через регистры. Осуществляется аналогичным образом, но содержимое регистра, выступающего посредником между основной программой и подпрограммой, в стеке не сохраняется.
Программа умножения байтов. В аккумуляторе находится множитель, в регистре С - множимое, а результат формируется в регистровой паре HL:
MULT: DCR A ; декремент множителя RM
Дата добавления: 2019-02-07; просмотров: 352;