Простейший логический оператор — это >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 последних команды, если нет — то только одна первая.
Ещё один оператор — >EQTYPE
. Он определяет, одинаков ли тип идентификаторов.
Существующие типы:
отдельные строки символов, заключённые в кавычки (те, которые не являются частью численных выражений)
вещественные числа (с плавающей точкой)
любые численные выражения, например, >2+2
(любой неизвестный символ будет рассматриваться как метка, так что он будет считаться подобным выражением)