УТВЕРЖДАЮ
Зам. директора
по учебной работе
______________ И.В. Малафей
“___”_________ 201
Специальность: Дисциплина:
2-40 01 01 Программное обеспечение «Системное программное обеспечение»
информационных технологий
Составлена на основании рабочей учебной программы, утвержденной
директором ЧУО “Колледж бизнеса и права” 31.08.2017
Лабораторная работа №8
Инструкционно-технологическая карта
Макрокоманды
Для каждой закодированной команды ассемблер генерирует одну команду на машинном
языке. Но для каждого закодированного оператора компиляторного языка Pascal или C
генерируется одна или более команд машинного языка. В этом отношении можно считать, что
компиляторный язык состоит из макрооператоров.
Ассемблер также имеет макросредства, но макросы в языке Ассемблер определяются
программистом. Для этого задается имя макроса, директива MACRO, различные ассемблерные
команды, которые должен генерировать данный макрос и для завершения макроопределения -
директива ENDM. Затем в любом месте программы, где необходимо выполнение определенных
в макрокоманде команд, достаточно закодировать имя макроса. В результате Ассемблер
сгенерирует необходимые команды.
Использование макрокоманд позволяет:
упростить и сократить исходный текст программы;
сделать программу более понятной;
уменьшить число возможных ошибок кодирования.
Иными словами, макросредства языка Ассемблера позволяют формировать в исходной
программе блоки предложений (макроопределения), имеющие одно общее имя, и затем
многократно использовать это имя для представления всего блока. В процессе ассемблирования
MASM автоматически замещает каждое распознаваемое макроимя (макрокоманду)
последовательностью предложений в соответствии с макроопределением, в результате чего
формируется макрорасширение.
Макрокоманда может встречаться в исходной программе столько раз, сколько это
необходимо. Макроопределение в исходном файле должно предшествовать его первому
использованию в макрокоманде. Макроопределение может, как непосредственно находиться в
тексте программы, так и подключаться из другого файла директивой INCLUDE.
В макроопределение могут быть переданы параметры, которые могут управлять
макроподстановкой или задавать фрагменты текста.
В программе на языке Ассемблера макрокоманды выполняют в целом те же функции,
что и процедуры, то есть, обеспечивают много кратное и функционально законченное действие
с параметрическим управлением.
Различие заключается в следующем:
Процедура присутствует в исходной программе один раз, тогда как тело
макроопределения дублируется столько раз, сколько соответствующих макрокоманд содержит
исходный файл.
Текст процедуры статичен и неизменен, в то время как состав макрорасширения может
зависеть от параметров макрокоманды. Следует помнить, что параметры макрокоманды — это
значения времени ассемблирования, а параметры процедуры принимают какие-то
определенные значения лишь в процессе выполнения программы.
Макроодирективы
Именем макроопределения считается имя, указанное в директиве MACRO. Оно должно быть
уникальным и используется в исходном файле для вызова макроопределения. Формальные
параметры представляют собой внутренние по отношению к данному макроопределению
имена, которые используются для обозначения значений, передаваемых в макроопределение
при его вызове. Может быть определено любое число формальных параметров, но все они
должны помещаться на одной строке и разделяться запятыми (если их несколько).
В теле макроопределения допустимы любые предложения языка ассемблера, в том числе
и другие макродирективы. Допустимо любое число предложений. Каждый формальный
параметр может быть использован любое число раз в этих предложениях.
Макроопределения могут быть вложенными, то есть, одно макроопределение может
содержаться в другом. MASM не обрабатывает вложенные макроопределения до тех пор, пока
не будет вызвано внешнее макроопределение. Поэтому вложенное макроопределение не может
быть вызвано до тех пор, пока хотя бы один раз не было вызвано внешнее макроопределение.
Глубина вложенности может быть произвольной и ограничивается лишь размером
доступной при ассемблировании памяти.
Макроопределения могут содержать вызовы других макроопределений. Такие
вложенные макровызовы обрабатываются так же, как и другие макровызовы, но лишь тогда,
когда вызвано внешнее макроопределение.
Макроопределения могут быть рекурсивными, то есть, вызывать сами себя.
Макроопределение может быть вызвано в любой момент простым указанием его имени в
2
исходном файле (имена макро в комментариях игнорируются). MASM при этом копирует
предложения макроопределения в точку вызова, замещая в этих предложениях формальные
параметры на фактические параметры, задаваемые при вызове.
Общий вид макровызова:
tab <1,2,3,4>
Объявление макроопределений
Формат:
??номер
Определимся с терминологией.
Макрокоманда представляет собой строку, содержащую некоторое символическое имя
— имя макрокоманды, предназначенную для того, чтобы быть замещенной одной или
несколькими другими строками. Имя макрокоманды может сопровождаться параметрами.
Обычно программист сам чувствует момент, когда ему нужно использовать
макрокоманды в своей программе. Если такая необходимость возникает и нет готового, ранее
разработанного варианта нужной макрокоманды, то вначале необходимо задать ее шаблон-
описание, который называют макроопределением.
Синтаксис макроопределения следующий:
имя_макрокоманды macro список_формальных_аргументов
тело макроопределения
endm
Где должны располагаться макроопределения?
Есть три варианта:
1. В начале исходного текста программы до сегмента кода и данных с тем,
чтобы не ухудшать читабельность программы. Этот вариант следует применять в
случаях, если определяемые вами макрокоманды актуальны только в пределах одной
этой программы.
1. В отдельном файле. Этот вариант подходит при работе над несколькими
программами одной проблемной области. Чтобы сделать доступными эти
макроопределения в конкретной программе, необходимо в начале исходного текста этой
программы записать директиву include имя_файла, к примеру:
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\include\macros\macros.asm
...
include my_macros.asm
; в это место будет вставлен текст файла my_macros.asm
...
.DATA
...
.CODE
...
5
2. В макробиблиотеке. Если у вас есть универсальные макрокоманды,
которые используются практически во всех ваших программах, то их целесообразно
записать в так называемую макробиблиотеку. Сделать актуальными макрокоманды из
этой библиотеки можно с помощью все той же директивы include.
Недостаток двух последних способов в том, что в исходный текст программы
включаются абсолютно все макроопределения. Для исправления ситуации можно использовать
директиву purge, в качестве операндов которой через запятую перечисляются имена
макрокоманд, которые не должны включаться в текст программы. К примеру,
...
include \masm32\include\macros\macros.asm
имя_макрокоманды список_фактических_аргументов
Макрооператоры
alloc MACRO x
IRP z,<1,2,3> x&&z DB z
ENDM
ENDM
7
В этом примере замена формального параметра x осуществляется немедленно при
вызове макроопределения. Замена параметра z будет задержана до начала обработки блока
повторения IRP с тем, чтобы параметр z получал значения из указанного списка. Таким
образом, параметр z будет замещаться значением элемента списка каждый раз при переходе к
следующему элементу списка блока повторения. В итоге по макрокоманде:
alloc var
var1 DB 1
var2 DB 2
var3 DB 3
Текстовый оператор литерала указывает MASM, что заданный внутри скобок <…> текст
следует трактовать как простой литеральный элемент независимо от того, содержит ли он
запятые, пробелы или другие ограничители. Чаще всего этот оператор используется в
макровызовах и директивах IRP для того, чтобы значения списка параметров обрабатывались
как один параметр.
Кроме того, этот оператор используется в тех случаях, когда необходимо, чтобы MASM
трактовал некоторые специальные символы (например, ; или &) как литералы. Например, в
выражении <;> точка с запятой рассматривается как точка с запятой, а не как начало
комментария.
Символьный оператор литерала ! отличается от текстового лишь тем, что в нем в
качестве литерала рассматривается только непосредственно следующий за ! символ. Например,
выражения !; и <;> эквивалентны.
Оператор выражения % указывает MASM, что данный текст следует трактовать как
выражение. MASM вычисляет значение выражения с учетом основания системы счисления
встречающихся в выражении чисел и замещает текст этим значением. Текст должен
представлять корректное выражение.
Оператор выражения обычно используется в макровызовах, когда в макроопределение
необходимо передать значение выражения, а не его текстовую форму.
Пример:
area %(sum1+sum2)
DW 300
Обязательные параметры
Практические задания
1.
2.
3.
4.
5.
6.
7.
8.
Описать в виде макроса NULL RS (RS — это <R1, R2, ..., Rk>, где Ri — имена ре-
гистров общего назначения, k ≥ 0) обнуление регистров Ri.
10
Выписать макрорасширения для макрокоманд NULL <AL, BX, SI> и NULL <>.
9.
Оформление отчета
Контрольные вопросы
11