Читать «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

1 В-2

D DW N ;D=11

Какие начальные значения получат переменные А и В? Относительно значения переменной А сомнений нет - это 1. Но вот значением переменной В, оказывается, будет число 2, а не 1. Почему? Дело в том, что имя N объявлено синонимом имени К, поэтому все вхождения имени N ассемблер будет заменять на имя К. Значит, директива В DW N понимается как директива В DW К. Но в этом месте текста программы константа К имеет значение 2, поэтому данная директива воспринимается как В DW 2.

В то же время в примере справа переменные С и D получат одно и то же значение 11. Дело в том, что в директиве EQU указано, так сказать, настоящее константное выражение, и потому ассемблер вычисляет его сразу. Значение 11 этого выражения объявляется значением константы N, которая далее и будет обозначать это число.

Таким образом, необходимо внести следующее уточнение в действие директивы EQU: если в правой части директивы указано имя константы, то имя слева надо понимать не как имя константы (не как имя числа), а как синоним имени справа; если же в правой части указано любое другое константное выражение, тогда имя слева действительно становится именем константы (обозначением числа). Что же касается директивы присваивания, то ее правая часть всегда вычисляется сразу и полученное число тут же становится новым значением константы.

Выражения

2.5.

Операнды директив, как правило, описываются в Виде выражении. Выражения

испольауютсй и для описания операндов команд..