Программирование на Ассемблере


         

12.4.1 Директивы условной трансляции


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

Директива условной трансляции позволяет выбрать рабочий регистр.




Содержание  Назад  Вперед