Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 26
Unknown Author
A DW К ; эквивалентно: A DW 10 К=К+4
В DB К ; эквивалентно: В DB 14
Подобного рода константы можно использовать, например, ради "экономии имен": если в разных частях текста программы используются разные константы и области использования этих констант не пересекаются, тогда, чтобы не придумывать новые имена, этим константам можно дать одно и то же имя
(другими словами, поменять значение константы с таким именем). Однако главное применение таких констант - в макросредствах (см. гл. 11).
Теперь кое-что уточним.
Если с помощью директивы EQU можно определить имя, обозначающее не только число, но и другие конструкции, то по директиве присваивания можно определить только числовую константу. Кроме того, если имя указано в левой части директивы EQU, то оно не может появляться в левой части других директив (его нельзя переопределять). А вот имя, появившееся в левой части директивы присваивания, может снова появиться в начале другой такой директивы (но только такой!). Поэтому ошибочными являются все следующие три фрагмента программы:
К EQU 1 К EQU 1 К=1
К EQU 2 К=2 К EQU 2
Появление в языке констант, которые могут менять свои значения, вносит некоторую неопределенность. Рассмотрим, к примеру, фрагмент слева:
К=1
К=1
N EQU К
К EQU К+10
A DW N
;А=1
С DW N ;С=11
К=2
К=2
В DW N
D DW N ;D=11
Какие начальные значения получат переменные А и В? Относительно значения переменной А сомнений нет - это 1. Но вот значением переменной В, оказывается, будет число 2, а не 1. Почему? Дело в том, что имя N объявлено синонимом имени К, поэтому все вхождения имени N ассемблер будет заменять на имя К. Значит, директива В DW N понимается как директива В DW К. Но в этом месте текста программы константа К имеет значение 2, поэтому данная директива воспринимается как В DW 2.
В то же время в примере справа переменные С и D получат одно и то же значение 11. Дело в том, что в директиве EQU указано, так сказать, настоящее константное выражение, и потому ассемблер вычисляет его сразу. Значение 11 этого выражения объявляется значением константы N, которая далее и будет обозначать это число.
Таким образом, необходимо внести следующее уточнение в действие директивы EQU: если в правой части директивы указано имя константы, то имя слева надо понимать не как имя константы (не как имя числа), а как синоним имени справа; если же в правой части указано любое другое константное выражение, тогда имя слева действительно становится именем константы (обозначением числа). Что же касается директивы присваивания, то ее правая часть всегда вычисляется сразу и полученное число тут же становится новым значением константы.
Выражения
2.5.
Операнды директив, как правило, описываются в Виде выражении. Выражения
испольауютсй и для описания операндов команд..