7.1. Оператор EQ

Простейший логический оператор — это EQ. Он всего лишь сравнивает два идентификатора — одинаковы ли их значение. Значение abcd eq abcd — истина, а abcd eq 1 — ложь и так далее… Это полезно для сравнения символов, которые будут обработаны препроцессором:

STRINGS equ ASCII

if STRINGS eq ASCII

 db 'Oh yeah',0

else if STRINGS eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

после обработки препроцессором, это примет вид:

if ASCII eq ASCII

 db 'Oh yeah',0

else if ASCII eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

Здесь только первое условие (ASCII eq ASCII) выполняется, так что будет ассемблировано только db 'Oh yeah',0

Другой вариант:

STRINGS equ UNICODE  ;разница здесь, UNICODE вместо ASCII

if STRINGS eq ASCII

 db 'Oh yeah',0

else if STRINGS eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

получим:

if UNICODE eq ASCII

 db 'Oh yeah',0

else if UNICODE eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

Тут уже первое условие (UNICODE eq ASCII) будет ложно, второе (UNICODE eq UNICODE) — верно, будет ассемблироваться du 'Oh yeah',0.

Несколько лучшее применение этого — проверка аргументов макросов, вроде:

macro item type,value

{

 if type eq BYTE

  db value

 else if type eq WORD

  dw value

 else if type eq DWORD

  dd value

 else if type eq STRING

  db value,0

 end if

}

item BYTE,1

item STRING,'aaaaaa'

будет:

if BYTE eq BYTE

 db 1

else if BYTE eq WORD

 dw 1

else if BYTE eq DWORD

 dd 1

else if BYTE eq STRING

 db 1,0

end if

if STRING eq BYTE

 db 'aaaaaa'

else if STRING eq WORD

 dw 'aaaaaa'

else if STRING eq DWORD

 dd 'aaaaaa'

else if STRING eq STRING

 db 'aaaaaa',0

end if

ассемблироваться будут только 2 команды:

db 1

db 'aaaaaa',0

Подобно всем другим операторам препроцессора, EQ может работать с пустыми аргументами. Это значит, что, например, if eq верно, а if 5 eq — ложно и т. п.

Пример макроса:

macro mov dest,src,src2

{

 if src2 eq

  mov dest, src

 else

  mov dest, src

  mov src, src2

 end if

}

здесь, если есть третий аргумент, то будут ассемблироваться 2 последних команды, если нет — то только одна первая.

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК