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 последних команды, если нет — то только одна первая.