Skip to content

20. Макроопределения

Natasha Gurova edited this page Jun 24, 2022 · 5 revisions
Clone this wiki locally

Макросы. Общие сведения

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

Определения:

  1. Макроопределение - специальным образом оформленная последовательность предложений языка ассемблера, под управлением которой ассемблер (точнее, его часть, называемая макрогенератором или препроцессором) порождает макрорасширения макрокоманд.
  2. Макрорасширение - последовательность предложений языка ассемблера (обыкновенных директив и команд), порождаемая макрогенератором при обработке макрокоманды под управлением макроопределения и вставляемая в исходный текст программы вместо макрокоманды.
  3. Макрокоманда (или макровызов) - предложение в исходном тексте программы, которое воспринимается макрогенератором как команда (приказ), предписывающая построить макрорасширение и вставить его на ее место.
  • В макрокоманде могут присутствовать параметры, если они были описаны в макроопределении.
  • Макроопределение без параметров однозначно определяет текст макрорасширения.
  • Макроопределение с параметрами описывает множество (возможно, очень большое) возможных макрорасширений, а параметры, указанные в макрокоманде, сужают это множество до одного единственного макрорасширения.

Определение макроса в программе

имя MACRO параметры
...
ENDM
load_reg MACRO register1, register2
  push register1
  pop register2
ENDM

Сравнение макросов с подпрограммами

Плюсы

  • Так как текст макрорасширения вставляется на место макрокоманды, то нет затрат времени, как для подпрограмм, на подготовку параметров, передачу управления и выполнение других работ при выполнении программы

Минусы

  • При многочисленных вызовах МО (макроопределения) разрастается объем модуля программы,
  • Фактические значения параметров макрокоманд должны быть известны препроцессору или могли быть вычислены им (нельзя использовать в качестве * фактического параметра МО значения переменных или регистров, так как они могут быть известны только при выполнении программы).

Замечания

  • Имена формальных параметров МО-й локализованы в них, т.е. вне определения могут использоваться для обозначения других объектов.
  • Число формальных параметров ограничено лишь длиной строки, обрабатываемой ассемблером.
  • МО-я должны предшествовать обращениям к ним.
  • Нет ограничений, кроме физических, на число предложений в теле МО.
  • В листинге предложениям макрорасширений предшествуют ЦБЗ, указывающие глубину их вложения в макроопределениях.

Макроопределения. Директивы присваивания и отождествления.

Директива присваивания =

Директива присваивания служит для создания целочисленной макропеременной или изменения её значения и имеет формат

Макроимя = Макровыражение

Макровыражение (или Константное выражение) - выражение, вычисляемое препроцессором, которое может включать целочисленные константы, макроимена, вызовы макрофункций, знаки операций и круглые скобки, результатом вычисления которого является целое число

Операции:

  • арифметические (+, -, *, /. MOD)
  • логические
  • сдвигов
  • отношения

Директивы отождествления EQU, TEXTEQU

Директива для представления текста и чисел:

Макроимя EQU нечисловой текст и не макроимя ЛИБО число

Макроимя EQU <Операнд>

Макроимя TEXTEQU Операнд

X EQU [EBP+8]
MOV ESI, X

Диррективы условного ассемблирования

IF:
IF c1

ELSEIF c2

ELSE

ENDIF
IFB <par>              ; истинно, если параметр не определён 
                       ; (то есть фактический параметр par не был задан в МКоманде)
IFNB <par>             ; истинно, если параметр определён
IFIDN <s1>,<s2>        ; истинно, если строки совпадают
IFDIF <s1>,<s2>        ; истинно, если строки разные
IFDEF/IFNDEF <name>    ; истинно, если имя объявлено/не объявлено

Блоки повторения

REPT <число> 
...                 ; Повтор фиксированное число раз
ENDM
; Подстановка фактических параметров по списку на место формального
IRP form,<fact_1[,fact_2,...]>  (или FOR)
...                 
ENDM
; Подстановка символов строки на место формального параметра
IRPC form,fact                  (или FORC)
...
ENDM
WHILE cond 
...                 ; Классический while
ENDM

Пример

; Определение переменных A0, A1, A2, A3 с начальными значениями 0,1,2,3 соответственно

IRP X,<0,1,2,3> ;;параметры - числа
    A&X DB X
ENDM