Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 23

Unknown Author

Операнд ?

Возможный пример:

A DW ?

По этой директиве ассемблер отводит под переменную А слово памяти, в которое ничего не записывает, т. е. эта переменная не получает начального значения. Тип переменной равен 2, т. к. она занимает два байта. В ЯА есть стандартная константа с именем WORD и значением 2, поэтому данный факт можно записать так:

TYPE А * WORD в 2.

Константное еыражение со значением от -32768 до 65535 Возможные примеры:

В DW 1234h С DW -2

По этим директивам под переменные В и С отводится по слову памяти и в эти ячейки записываются указанные числа, которые становятся начальными значениями этих переменных.

Как и в случае директивы DB, неотрицательные числа записываются в память как числа без знака, а отрицательные числа - в дополнительном коде. Поэтому числа, которые могут быть заданы как операнды директивы DW, должны принадлежать отрезку [-215, 216-1].

Но здесь имеется и отличие от директивы DB. Напомним, что в ПК числа размером в слово хранятся в памяти в "перевернутом” виде. Так вот, на ЯА такие числа записываются в нормальном, неперевернутом виде, а "переворачиванием” их занимается сам ассемблер, поэтому по нашим двум директивам память заполнится следующим образом:

FF

С учетом этого при программировании на ЯА можно в обгцем-то забыть о "перевернутом" представлении чисел в памяти ПК.

Частным случаем рассматриваемого вида операнда директивы DW может быть строка из одного или двух символов, например:

51    DW '01'

52    DW '1'

Если указана строка из двух символов, тогда ассемблер берет коды указанных символов (в нашем случае - 30h (код ’0’) и 31 h (код Т)) и образует из них число-слово (3031 h), которое и считается начальным значением описываемой переменной (S1). Но как и любое число размером в слово, данное значение будет записано в память в "перевернутом" виде. Если же в правой части директивы DW указан один символ, тогда к нему слева приписывается символ с кодом 0 и дальнейшие действия ассемблера будут такими же, как и в случае двухсимвольной строки. Поэтому по нашим двум директивам память будет заполнена следующим образом:

31

30

31

00

S2

В связи с тем, что операнды-строки записываются в память в "перевернутом" виде, что в общем-то не характерно для строк, то подобные операнды редко указываются в директиве DW.

Адресное выражение

В качестве операнда директивы DW может быть указано адресное выражение, т. е. выражение, значением которого является адрес. Как записываются такие выражения, мы еще рассмотрим, а пока лишь отметим, что основной случай адресного выражения - это имя переменной или метка. Поэтому допустим такой пример:

С DB ? D DW С

В этом случае ассемблер записывает в слово, выделенное под переменную D, адрес переменной С, который становится начальным значением переменной D.

Несколько операндов, конструкция повторения

В правой части директивы DW можно указать любое число операндов, а также конструкцию повторения. Возможный пример:

Е DW 40000, 3 ,DUP( ?)