Директивы условной трансляции
IF <Выражение>
<Операторы1>
ELSE
<Операторы2>
ENDIF
Операторы1 компилируются, если значение выражения истинно, в противном случае компилируются операторы2. Выражение
считается ложным, если оно равно 0.
В выражениях можно использовать логические операции AND, OR, NOT, знаки отношений: EQ(=), NE (¹), GT(>), GE(³), LT (<), LE (£), а также операции сдвига SHL, SHR.
Есть специальные выражения, позволяющие определить транслируемые команды в зависимости от определенных переменных, передаваемых параметров и т.д.
Список специальных выражений:
ifdef <Переменная>
- Если определена заданная переменная (т.е. для нее есть оператор equ или =);
ifndef <Переменная> - Если не определена заданная переменная;
ifidn <П1>, <П2>
- если совпадают два параметра макрокоманды, или параметр совпадает с некоторой константой;
ifdif <П1>, <П2>
- если не совпадают два параметра макрокоманды, или параметр не совпадает с некоторой константой;
ifb <П1> -
если заданный параметр в макрокоманде пустой (не определен);
ifnb <П1> - если заданный параметр в макрокоманде не пустой (определен);
if1 - если выполняется первый просмотр;
if2 - если выполняется второй просмотр.
Пример. Составить макроопределение для вычисления у = |x| для данных длиной 32 бита.
ideal
p586
model flat
extrn ExitProcess:proc
MACRO _ABS x, y
local m
push eax
mov eax, x
test eax, eax
jns short m
neg eax
m:
mov y, eax
pop eax
endm
codeseg
begin:
mov edx, -5
_ABS edx, ebx
mov edx, 5
_ABS edx, ebx
call ExitProcess
end begin
Имя
_ABS используется, т.к. имя ABS зарезервировано. Макрос работает не верно, если результат в регистре EAX.
Для использования макроса в случае результата в регистре EAX запишем его в виде:
MACRO _ABS x, y
local m
ifidn <y> , <eax>
r equ <ebx>
else
r equ <eax>
endif
push r
mov r, x
test r, r
jns short m
neg r
m:
mov y, r
pop r
endm
Директива условной трансляции позволяет выбрать рабочий регистр.