Что такое макрос? Как он работает? — КиберПедия 

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

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

Что такое макрос? Как он работает?

2017-06-29 408
Что такое макрос? Как он работает? 0.00 из 5.00 0 оценок
Заказать работу

 

Макрос – это функциональный участок кода, встраиваемый в тело основной программы, на который возложено выполнение определённой задачи. Внешне макрос очень напоминает функцию, но на самом деле, механизмы работы у них абсолютно разные. Функция состоит из команд языка, а макрос – это директива препроцессора, которая может включать команды языка, или другие директивы. Коренным отличием функции от макроса является то, что он не вызывается, а просто копируется в то место программы, где условно произошёл вызов, и способен принимать аргументы.

Для работы с макросами имеется ряд директив, о которых упоминалось в лабораторной работе № 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


Поделиться с друзьями:

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.016 с.