|
Теперь макро min может быть использовано всякий раз, ког-
да это необходимо, так как каждый раз метке перехода будет прис-
ваиваться новое имя. Однако действительное имя не имеет для нас
никакого значения, ибо метка является собственностью функции min.
min ax,bx,cx,jmp1 <- вызов макро
1 mov ax,bx
1 cmp bx,cx
1 jl jmp1
1 mov ax,cx
1 jmp1:
Такой способ создания нового имени при каждом вызове макро min
является лучшим. Именно для этой цели MASM имеет директиву LOCAL
(локальный). Когда MASM встречает LOCAL, для стоящего рядом имени
создается уникальная метка. Другой способ заключается в помещении
параметра LOCAL в список параметров MACRO, но при этом MASM про-
изводит присваивание действительного аргумента. Предупреждение:
операторы LOCAL всегда должны помещаться сразу же после строки
именования MACRO! После включения директивы LOCAL новое макро min
выглядит так:
min MACRO result,first,second
LOCAL order_ok
mov &result,&first
cmp &first,&second
jl order_ok
mov &result,&second
order_ok:
ENDM
- 1-6 -
Теперь, когда мы снова вызовем макро min, образуется листинго-
вый файл, как показано в следующем примере. Значение order_ok бу-
дет заменено на ??0000. Каждый раз при вызове макро order_ok за-
меняется на новое значение, вырабатываемое MASM.
min ax,bx,cx ;первый вызов
1 mov ax,bx
1 cmp bx,cx
1 jl ??0000
1 mov ax,cx
1 ??0000:
min ax,bx,cx ;второй вызов
1 mov ax,bx
1 cmp bx,cx
1 jl ??0001
1 mov ax,cx
1 ??0001:
Конечно, остается вероятность возникновения конфликта меток,
если Вы решите использовать метки, начинающиеся с ??. Если Вы ус-
траните использование меток, начинающихся с ??, то Вы сможете вы-
зывать макро min столько раз, сколько захотите.
Использование меток LOCAL не ограничивается только переходами
по адресам. Метки LOCAL могут также использоваться с данными, как
показано в следующем макросе.
|