Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Топ:
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Интересное:
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
Макрос – это функциональный участок кода, встраиваемый в тело основной программы, на который возложено выполнение определённой задачи. Внешне макрос очень напоминает функцию, но на самом деле, механизмы работы у них абсолютно разные. Функция состоит из команд языка, а макрос – это директива препроцессора, которая может включать команды языка, или другие директивы. Коренным отличием функции от макроса является то, что он не вызывается, а просто копируется в то место программы, где условно произошёл вызов, и способен принимать аргументы.
Для работы с макросами имеется ряд директив, о которых упоминалось в лабораторной работе № 3. Так же как и функция – он имеет заголовок, тело и директиву препроцессора для окончания.
Заголовок состоит из стандартной директивы MACRO, которая слева от себя принимает в качестве параметра – метку, считаемую именем макроса, а справа может не иметь ничего, либо определённое число параметров. Также заголовком называется макроопределение.
; Объявление макроса без параметров
Calc_Perim MACRO
; Объявление макроса с параметрами
Calc_Perim MACRO m_Heigth, m_Weight
Тело макроса может содержать метки, вызовы функций, директивы, другие макросы, либо оставаться пустым.
Директива окончания ENDM сообщает компилятору о том, где завершается тело макроса, и встраивание кода следует прекратить. Объявление, а также вызов макроса в основной программе представлен ниже. В качестве примера, был взят код функции расчёта периметра:
Calc_Perim MACRO; Макрос вычисления Периметра
movfw Height; W = Height = 10;
addwf Weight,W; W = Height + Weight
movwf Perim; Perim = W
ENDM; директива окончания макроса
;----------------------------------; начало основной программы
main:
Calc_Perim; обращение к макросу Расчёта Периметра
END; конец основной программы
Для обращения к макросу не требуется никакой дополнительной команды, потому что никакого вызова не происходит. При компиляции, строка имени макроса, будет замещена его телом, и предыдущая программа будет иметь следующий вид:
main:
movfw Height; W = Height = 10;
addwf Weight,W; W = Height + Weight
movwf Perim; Perim = W
END; конец основной программы
Более подробно этот момент рассматривается в разделе 3, а пока обратите внимание на ещё один факт.
В отличие от функции, которая не меняет своё местоположение в области памяти программ, макрос – это встраиваемый код. Если он вызывается в программе неоднократно, то при компиляции произойдёт ошибка, из-за совпадения имён меток. Избежать этого можно, если все метки объявить локально. Это значит, что они будет действительны, только для данного участка кода, а для другого компилятор автоматически создаст новые. Чтобы объявить метки локальными, применяют директиву LOCAL.
Calc_Perim MACRO; Макрос вычисления Периметра
LOCAL A2, A3, A4; объявить метки локальными
A2: movfw Height; W = Height = 10;
A3: addwf Weight,W; W = Height + Weight
A4: movwf Perim; Perim = W
ENDM; директива окончания макроса
Макросы способны явно принимать аргументы. Для всего кода программы, переменные являются, общедоступными, то есть из любого места, возможно получить доступ к требуемой переменной. Функция не способна явно принимать аргументы, но она также как и макрос имеет доступ ко всем переменным.
Чтобы макрос имел возможность принять аргументы, необходимо указать их в его заголовке, и дальше использовать в теле.
; Объявление макроса с параметрами
Calc_Perim MACRO m_Heigth, m_Weight
LOCAL A2, A3, A4; объявить метки локальными
A2: movfw m_Height; W = m_Height = 10;
A3: addwf m_Weight,W; W = m_Height + m_Weight
A4: movwf Perim; Perim = W
ENDM; директива окончания макроса
Передавать в качестве параметров нужно имена переменных.
Calc_Perim MACRO m_Heigth, m_Weight
LOCAL A2, A3, A4; объявить метки локальными
A2: movfw m_Height; W = m_Height = 10;
A3: addwf m_Weight,W; W = m_Height + m_Weight
A4: movwf Perim; Perim = W
ENDM; директива окончания макроса
;-----------------------------------
main:
movlw D‘20’; W = 20
movwf Height; Height = 20
movlw D‘25’; W = 25
movwf Weight;
Calc_Perim Height,Weight; передача параметров в макрос
END; конец основной программы
Чтобы закрепить знания и получить практический навык, измените предыдущий пример, в соответствии с кодом, представленным ниже. Сначала периметр рассчитывается с помощью функции, а потом при помощи макроса:
; Программа демонстрирует работу функции
;----------------------------------;
#include<p17С756А.inc>; подключение заголовочного файла
; для МК 1886ВЕ2У 16F877
;----------------------------------;
Height EQU 0x20; Высота
Weight EQU 0x21; Ширина
f_Perim EQU 0x22; значение Периметра для функции
m_Perim EQU 0x23; значение Периметра для макроса
;----------------------------------;
org 0x00
goto main
org 0x05
;----------------------------------;
; Функции программы;
;----------------------------------; функция расчёта периметра
f_Calc_Perim:
movfw Height; W = Height = 10;
addwf Weight,W; W = Height + Weight
movwf f_Perim; f_Perim = W
return; команда возврата
;---------------------------------; макрос расчёта периметра
m_Calc_Perim MACRO m_Height, m_Weight
movfw m_Height; W = m_Height = 10;
addwf m_Weight,W; W = m_Height + m_Weight
movwf m_Perim; m_Perim = W
ENDM; директива окончания
;----------------------------------; начало основной программы
main:
movlw D'10'; W = 10
movwf Height; Heigth = 10
movlw D'20'; W = 20
movwf Weight; Weight = 20
call f_Calc_Perim; вызов функции расчёта периметра
movlw D'25'; W = 25
movwf Height; Heigth = 25
movlw D'25'; W = 25
movwf Weight; Weight = 25
m_Calc_Perim Height,Weight; вызов макроса расчёта периметра
goto main
END EN
|
|
|
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
© cyberpedia.su 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!