Директивы определения данных

Приоритеты операций

 

При вычислении значения выражения операции выполняются в соответствии со следующим списком приоритетов (в порядке убывания):

1. LENGTH, SIZE, WIDTH, MASK, (), [], <>.

2. Оператор имени поля структуры (.).

3. Оператор переключения сегмента (:).

4. PTR, OFFSET, SEG, TYPE, THIS.

5. HIGH, LOW.

6. Унарные + и -.

7. *, /, MOD, SHR, SHL.

8. Бинарные + и -.

9. EQ, NE, LT, LE, GT, GE.

10. NOT.

11. AND.

12. OR, XOR.

13. SHORT, .TYPE.

(Некоторые операции не были рассмотрены выше ввиду довольно редкого их использования)

 

Ссылки вперед

 

Хотя ассемблер и допускает ссылки вперед (т.е. к еще необъявленным объектам программы), такие ссылки могут при неправильном использовании приводить к ошибкам. Пример ссылки вперед:

 

JMP MET

...

MET: ...

 

Всякий раз, когда ассемблер обнаруживает неопределенное имя на 1-м проходе, он предполагает, что это ссылка вперед. Если указано только имя, ассемблер делает предположения о его типе и используемом регистре сегмента, в соответствии с которыми и генерируется код. В приведенном выше примере предполагается, что MET – метка типа NEAR и для ее адресации используется регистр CS, в результате чего генерируется инструкция JMP, занимающая 3 байта. Если бы, скажем, в действительности тип ссылки оказался FAR, ассемблеру нужно было бы генерировать 5-байтовую инструкцию, что уже невозможно, и формировалось бы сообщение об ошибке. Во избежание подобных ситуаций рекомендуется придерживаться следующих правил:

1. Если ссылка вперед является переменной, вычисляемой относительно регистров ES, SS или CS, следует использовать оператор переключения сегмента. Если он не использован, делается попытка вычисления адреса относительно регистра DS.

2. Если ссылка вперед является меткой инструкции в команде JMP и отстоит не далее, чем на 128 байтов, можно использовать оператор SHORT. Если этого не делать, метке будет присвоен тип FAR, что не вызовет ошибки, но на 2-м проходе ассемблер для сокращения размера содержащей ссылку инструкции вынужден будет вставить дополнительную и ненужную инструкцию NOP.

3. Если ссылка вперед является меткой инструкции в командах CALL или JMP, следует использовать оператор PTR для определения типа метки. Иначе ассемблер устанавливает тип NEAR, и, если в действительности тип метки окажется FAR, будет выдано сообщение об ошибке.

 

 

Директивы определения данных служат для задания размеров, содержимого и местоположения полей данный, используемых в программе на языке ассемблера.

Директивы определения данных могут задавать:

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