3. Присваивания (Equates)

3.1. Директива EQU

Простейшая команда препроцессора.

Синтаксис:

name1 equ name2

Это команда говорит препроцессору, что необходимо заменить все последующие

name1
на
name2
.

Например:

count equ 10 ; это команда препроцессора

mov ecx, count

преобразуется в:

mov ecx, 10

Ещё пример:

mov eax, count

count equ 10

mov ecx, count

преобразуется в:

mov eax, count

mov ecx,10

потому что препроцессор заменит

count
только после директивы
equ
.

Даже это работает:

10 equ 11

mov ecx, 10

после обработки препроцессором, получим:

mov ecx, 11

Обратите внимание,

name1
может быть любым идентификатором. Идентификатор — это всего лишь набор символов, завершаемый пробелом (space), символом табуляции (tab), концом строки (EOL), комментарием
;
, символом переноса строки
\
или оператором, включая операторы ассемблера и/или специальные символы вроде
,
или
}
.

name2
может быть не только единичным идентификатором, берутся все символы до конца строки.
name2
может и отсутствовать, тогда
name1
будет заменен на пустое место.

Например:

10 equ 11, 12, 13

db 10

получим:

db 11, 12, 13

3.2. Директива RESTORE

Можно заставить препроцессор прекратить заменять идентификаторы, определённые директивой

EQU
. Это делает директива
RESTORE
.

Синтаксис:

restore name1

name1
— это идентификатор определённый ранее в директиве
EQU
. После этой команды name больше не будет заменяться на
name2
.

Например:

mov eax, count

count equ 10

mov eax, count

restore count

mov eax, count

получим:

mov eax, count

mov eax, 10

mov eax, count

Обратите внимание, что для определений сделанных директивой

EQU
работает принцип стека. То есть, если мы два раза определим один и тот же идентификатор используя
EQU
, то после однократного использования
RESTORE
значение идентификатора будет соответствовать определённому первой директивой
EQU
.

Например:

mov eax, count

count equ 1

mov eax, count

count equ 2

mov eax, count

count equ 3

mov eax, count

restore count

mov eax, count

restore count

mov eax,count

restore count

mov eax,count

получим:

mov eax, count

mov eax, 1

mov eax, 2

mov eax, 3

mov eax, 2

mov eax, 1

mov eax, count

Если попытаться выполнить

RESTORE
большее количество раз, чем было сделано
EQU
, никаких предупреждений выдано не будет. Значение идентификатора будет неопределенно.

Например:

mov eax, count

restore count

mov eax, count

получим:

mov eax, count

mov eax, count

Загрузка...