Александр Микушин - Занимательно о микроконтроллерах стр 51.

Шрифт
Фон

Александр Микушин - Занимательно о микроконтроллерах

Иногда нужно расположить команду по определенному адресу. Наиболее часто это требуется при использовании прерываний, когда первая команда подпрограммы-обработчика прерываний должна быть расположена точно в ячейке с определенным адресом (вектором), зависящим от источника прерывания. Векторы размещаются в начальных ячейках программной памяти и занимают 8 байтов каждый. Если эта область не используется целиком, то можно использовать команду пор для заполнения промежутков между векторами прерывания. Но лучше для назначения нужных адресов подпрограммам прерываний воспользоваться директивой org.

Директива org предназначена для записи в счетчик адреса сегмента значения своего операнда. То есть при помощи этой директивы можно поместить команду (или данные) в памяти микроконтроллера по произвольному адресу. Пример использования директивы org для размещения подпрограмм обработки прерываний в нужных адресах показан в листинге 8.9.

Александр Микушин - Занимательно о микроконтроллерах

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

Директива using. При использовании прерываний критичным является время выполнения подпрограммы-обработчика прерываний. Его можно значительно сократить, выделив для обработки прерываний отдельный банк регистров при помощи директивы using. Номер используемого банка регистров указывается в директиве в качестве операнда. При этом реальное включение банка регистров производится записью необходимой константы в регистр PSW. Пример использования директивы using для подпрограммы обслуживания прерываний от таймера 0 приведен в листинге 8.10.

Александр Микушин - Занимательно о микроконтроллерах

Остальные директивы ассемблера предназначены для управления сегментами памяти и будут рассмотрены позднее.

Управляющие команды

Кроме директив, для управления процессом трансляции используются команды языка программирования. С их помощью можно управлять работой компилятора ASM-51. Команды могут задаваться как параметры в DOS-строке вызова компилятора или как управляющие строки в исходном тексте файла.

Если знак доллара ($) стоит в самом крайнем левом поле строки, то такая строка воспринимается компилятором как управляющая. Управляющие строки должны начинаться знаком доллара и могут содержать одну или более команд, разделенных пробелами.

Примеры управляющих строк:

$PRINT(A: \PROG.LST) OBJECT(PROG.OBJ)

$LIST DEBUG XREF

Так как целью книги является дать минимальные сведения, достаточные для того, чтобы начать работать с микроконтроллерами, то в данной книге будут рассмотрены только основные команды языка программирования ASM-51.

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

$INCLUDE (RBG51.INC)

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

Команды list/nolist позволяют включать и выключать листинг исходного текста соответственно. При активной команде nolist в файл листинга будут помещаться только сообщения об ошибках. Пример запрета размещения содержимого включаемого файла в листинге программы будет выглядеть следующим образом:

$NOLIST //Запретить создание листинга включаемого файла $INCLUDE (RBG51.INC)

$LIST //Разрешить создание листинга дальнейшего текста

Команда debug/nodebug позволяет помещать в объектный модуль отладочную информацию (имена и местоположение переменных, меток и операторов) или запрещать размещение отладочной информации в объектном модуле.

Команда pageiength (n) определяет максимальное число строк на странице файла листинга. Это число включает заголовок страницы. Количество строк в странице может изменяться в пределах от 10 до 65535.

Команда pagewidth (n) определяет максимальное число символов в строке листинга. Количество символов в строке листинга может изменяться от 72 до 132.

Реализация подпрограмм на языке ASM-51

Подпрограммы на языке программирования ASM-51 выносятся отдельно от основного текста программы. Обычно при программировании на языке ассемблера подпрограммы размещают после основного текста программы для того, чтобы случайно не передать управление подпрограмме не командой ее вызова, а последовательным выполнением операторов основной программы. Такая ситуация может произойти из-за того, что ассемблер назначает адреса машинным командам в порядке их написания. Если в начале поместить исходный текст подпрограммы, то именно она будет размещена по нулевому адресу памяти программ и после сброса будет выполнена раньше, чем основная программа. При завершении подпрограммы команда ret передаст управление по неопределенному адресу памяти программ, что может привести к непредсказуемым последствиям. Если в начале поместить текст основной программы, то после сброса начнется ее выполнение. После инициализаций (включая установку начального значения указателя стека) основная программа всегда содержит бесконечный цикл. Это означает, что попасть в подпрограмму в результате последовательного выполнения операторов невозможно. Управление в нее может быть передано только с помощью команды вызова подпрограммы lcall.

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

В главе 7 говорилось, что подпрограммы бывают двух видов: подпрограммы-функции и подпрограммы-процедуры. На языке программирования ассемблер проще реализуются подпрограммы-процедуры, поэтому сначала рассмотрим их.

Реализация подпрограмм-процедур на языке ASM-51

Подпрограмма-процедура вызывается командами процессора lcall и асаll. В языке программирования ASM-51 допустимо использование директивы call. Выполняя ее, компилятор автоматически подбирает наиболее подходящую к данному случаю по размеру команду. В листинге 8.11 приведен пример использования подпрограммы-процедуры для управления последовательным портом.

Александр Микушин - Занимательно о микроконтроллерах

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

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

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке