Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Выч. машины, системы и сети. Пособие. 80С51 v0.26.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

4.7 Реализация подпрограмм на языке asm51

4.7.1 Структура подпрограммы-процедуры на языке asm51

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

Исходный текст подпрограммы начинается с метки, которая одновременно является именем подпрограммы. Именно это имя указывается в качестве операнда в команде вызова подпрограммы CALL. Возвращение из подпрограммы на оператор, следующий за оператором вызова подпрограммы осуществляется оператором RET. Все операторы, относящиеся к подпрограмме располагаются между меткой, обозначающей имя подпрограммы и оператором возврата из подпрограммы.

Подпрограмма-процедура вызывается командами процессора LCALL и ACALL (рис. 4.8). В языке программирования ASM51 допустимо использования директивы CALL эта директива подбирает наиболее подходящую к данному случаю по размеру команду.

Рис. 4.8. Пример подпрограммы управления последовательным портом.

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

Параметр подпрограммы - это локальная переменная. В этом случае могут значительно снизиться требования к памяти данных. Для размещения локальных переменных лучше всего использовать внутренние регистры процессора. На языке ASM51 для передачи параметра размерностью один байт обычно используется аккумулятор.

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

Если в подпрограмму нужно передать четырёхбайтовое значение (это требуется для переменной, соответствующей типу long или float), то используются регистры R4...R7 (регистр R4 – старший байт).

Регистры R0 и R1 обычно используются в качестве указателей обрабатываемых переменных таких как строки или массивы. Если требуется, чтобы подпрограмма обработала значительный объём данных, то эти данные можно передать через параметр - указатель. В качестве указателя при обращении к внешней памяти данных или к памяти программ обычно используется регистр-указатель данных DPTR.

При обращении к массивам или структурам, расположенным во внутренней памяти данных в качестве указателя адреса используется регистр R0 или R1.

4.7.3 Реализация подпрограмм-функций на языке asm51

Часто требуется передавать результат вычислений из подпрограммы в основную программу. Для этого можно воспользоваться подпрограммой - функцией. Подпрограмма - функция возвращает вычисленное значение.

Использование подпрограмм-функций значительно увеличивает наглядность программ и приближает запись на языке программирования к записи математического выражения.

В этом примере подпрограмма вычисления синуса:

Подпрограмма - функция может возвращать и многобайтовые переменные, используя регистр - указатель R0 или R1. Однако для копирования этих переменных потребуется ещё одна подпрограмма копирования.

4.7.4. Реализация подпрограмм обработки прерываний на языке asm51

Как известно, подпрограммы обработки прерываний вызываются аппаратурой, поэтому эти подпрограммы не могут иметь параметров. Кроме того, эти подпрограммы не могут быть подпрограммами-функциями. При возврате из подпрограммы обработки прерывания должны быть разрешены дальнейшие прерывания, поэтому возврат из подпрограммы обработки прерывания может быть осуществлён только командой RETI.

Подпрограмма обработки прерываний не должна портить содержимое регистров, поэтому все регистры, которые используются подпрограммой обработки прерываний, должны быть сохранены перед использованием, а затем восстановлены. Чаще всего для временного сохранения регистров используется стек.

Пример подпрограммы обработки прерывания :

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

Если подпрограмма обработки прерывания использует несколько регистров, то на сохранение регистров в стеке и на восстановление их из стека тратится достаточно много времени. Микроконтроллеры семейства MCS-51 предлагают возможность использовать для подпрограмм прерываний отдельный банк регистров.