Если требуется, чтобы подпрограмма обработала такого же вида данные, но расположенные во внешней памяти данных или в памяти программ, то начальный адрес этих данных можно передать через двухбайтовый параметр-указатель. В качестве такого указателя обычно используется регистр-указатель данных DPTR. Пример передачи в подпрограмму адреса начального элемента строки в качестве параметра, написанный на языке программирования ASM-51, приведен в листинге 8.14. Строка расположена в памяти программ. Ее размещение в памяти программ показано в последней строке этого же листинга.
Если в подпрограмму нужно передать в качестве параметра двухбайтовое число, то для этого используется пара регистров (обычно это регистры
Если в подпрограмму нужно передать четырехбайтовое значение (параметр типа long, unsigned long или float), то обычно используются регистры
В примере показана передача в подпрограмму константы, но точно также можно передавать и переменную, расположенную во внутренней или внешней памяти данных. Для этого достаточно просто скопировать переменную в регистры
Часто требуется Передавать результат вычислений из подпрограммы в основную программу. Для этого обычно используется подпрограмма-функция. Наиболее наглядным примером использования подпрограмм-функций является вычисление элементарных функций. Подпрограмма-функция для вычисления синуса в программе на языке высокого уровня вызывается следующим образом:
Y=sin(x); //Вызов подпрограммы-функции
Как видно из приведенного примера, использование подпрограмм-функций значительно увеличивает наглядность программ и приближает запись на языке программирования к общепринятой математической форме. На языке программирования ASM-51 этот же вызов подпрограммы-функции выглядит следующим образом:
mov А, х ;Передать в подпрограмму вычисления синуса параметр
call sin ;Вызвать подпрограмму вычисления синуса
mov Y,A ;Запомнить значение, которое вернула подпрограмма в
В этом примере подпрограмма вычисления синуса перед выполнением оператора возврата в основную программу должна поместить результат вычисления синуса в аккумулятор. Переменные
Элементарные операции на языке программирования ассемблер чаще всего вычисляются табличным способом, подобным тому, как проводилась перекодировка чисел, приведенная в примере листинга 8.5. Сами значения функций при этом рассчитываются заранее с использованием компьютера и вводятся во внутреннюю память микроконтроллера при помощи директивы db.
Подпрограмма-функция может возвращать и многобайтовые переменные. Для этого можно использовать два или четыре регистра. Обычно используются регистровая пара
Кроме подпрограмм-процедур и подпрограмм-функций существует особый класс подпрограмм. Это подпрограммы обработки аппаратных прерываний.
Подпрограммы обработки прерываний вызываются аппаратурой в произвольный момент времени и не могут иметь параметров. Подпрограммы обработки прерываний не могут быть подпрограммами-функциями. При переходе на подпрограмму обслуживания прерывания автоматически запрещается возникновение последующих прерываний, поэтому при возвращении из подпрограммы обработки прерывания должны быть разрешены прерывания. Команда возвращения из подпрограммы ret не снимает запрет на обработку прерываний, поэтому возврат из подпрограммы обработки прерывания может быть осуществлен только специальной командой возврата из подпрограммы обслуживания прерывания reti. Пример подпрограммы обработки прерывания на языке программирования ASM-51 приведен в листинге 8.17.