Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Передача переменных-параметров в подпрограмму

Поиск

В приведенном на листинге 23.11 примере байт передается в подпрограмму через глобальную переменную G_Per. Однако программа будет эффективнее при использовании подпрограммы с параметрами. Мы уже знаем, что параметр подпрограммы— это локальная переменная, а при использовании локальных переменных могут значительно снизиться требования к памяти данных, так как локальные переменные разных подпрограмм располагаются в одних и тех же ячейках памяти микроконтроллера. Для размещения локальных переменных лучше всего использовать внутренние регистры процессора, так как кроме экономии памяти данных, использование регистровых переменных приводит к сокращению длины машинных команд, а значит и длины всей программы в целом. Кроме того, использование подпрограмм с параметрами позволяет вызывать подпрограмму саму из себя, например, при реализации рекурсивных алгоритмов. На языке ASM51 для передачи параметра размерностью один байт обычно используется аккумулятор как показано в примере программы, приведенном в листинге 23.12.

Листинг 23.12. Пример подпрограммы-процедуры с передачей параметра через аккумулятор

...

MOV A,#56;Передать число 56 через

CALL PeredatByte;последовательный порт

...

MOV A,#37;Передать число 37 через

CALL PeredatByte;последовательный порт

...

 

;********************************************

;Подпрограмма передачи байта

;через последовательный порт

;********************************************

PeredatByte:

JB TI, $;Если предыдущий байт передан

MOV SBUF, A;то передать очередной байт

RET

Часто пример использования подпрограммы с параметрами более понятно выглядит на языке высокого уровня. Вызов подпрограммы с одним параметром, приведенный в листинге 23.12, на языке программирования C выглядел бы следующим образом:

PeredatByte(56); //Передать число 56

PeredatByte(37); //Передать число 37

Часто в подпрограмме требуется обрабатывать большие объемы данных, такие как массивы или структуры. При обращении к массивам или структурам, расположенным во внутренней памяти данных в качестве указателя адреса обычно используются регистры R0 или R1. Пример передачи в подпрограмму массива в качестве параметра, написанный на языке программирования ASM-51 приведен в листинге 23.13.

Листинг 23.13. Пример подпрограммы-процедуры с передачей адреса массива через регистр R0

...

MOV R0,#Massiv;Задать адрес обрабатываемого массива

CALL ObrabotatMassiv;Вызвать подпрограмму обработки массива

...

Если требуется, чтобы подпрограмма обработала такого же вида данные, но расположенные во внешней памяти данных или в памяти программ, то начальный адрес этих данных можно передать через двухбайтовый параметр-указатель. В качестве такого указателя обычно используется регистр-указатель данных DPTR. Пример передачи в подпрограмму адреса начального элемента строки в качестве параметра, написанный на языке программирования ASM-51 приведен в листинге 23.14. Строка расположена в памяти программ. Ее размещение в памяти программ показано в последней строке этого же листинга.

Листинг 23.14. Пример вызова подпрограммы-процедуры с передачей адреса строки через регистр DPTR

...

MOV DPTR,#Stroka;Задать адрес первого байта строки

CALL PeredatStroky;Вызвать подпрограмму передачи строки

...

Stroka: db ‘Напечатать строку’

Если в подпрограмму нужно передать в качестве параметра двухбайтовое число, то для этого используется пара регистров (обычно это регистры R6 – старший байт и R7 – младший байт). Пример вызова подпрограммы с передачей в нее двухбайтового параметра, написанный на языке программирования ASM-51 приведен в листинге 23.15.

Листинг 23.15. Пример вызова подпрограммы-процедуры с передачей в нее двухбайтного числа (параметра) через регистры R7 и R6

...

;Пример передачи в подпрограмму двухбайтового числа

MOV R7,#56;Передать младший байт

MOV R6,#0;Передать старший байт

CALL Podprogr;Вызвать подпрограмму

...

Если в подпрограмму нужно передать четырехбайтовое значение (параметр типа long, unsigned long или float), то обычно используются регистры R4–R7 (регистр R4 – старший байт). Пример вызова подпрограммы с передачей в нее четырехбайтового параметра, написанный на языке программирования ASM-51 приведен в листинге 23.16.

Листинг 23.16. Пример вызова подпрограммы-процедуры с передачей в нее четырехбайтного числа (параметра) через регистры R4–R6

...

;Пример передачи в подпрограмму четырехбайтового числа

MOV R7,#56;Передать младший байт

MOV R6,#0

MOV R5,#0

MOV R4,#0;Передать старший байт

CALL Podprogr;Вызвать подпрограмму

...

В примере показана передача в подпрограмму константы, но точно также можно передавать и переменную, расположенную во внутренней или внешней памяти данных. Для этого достаточно просто скопировать переменную в регистры R4–R7.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 196; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.177.204 (0.005 с.)