Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 23
Unknown Author
Возможный пример:
A DW ?
По этой директиве ассемблер отводит под переменную А слово памяти, в которое ничего не записывает, т. е. эта переменная не получает начального значения. Тип переменной равен 2, т. к. она занимает два байта. В ЯА есть стандартная константа с именем WORD и значением 2, поэтому данный факт можно записать так:
TYPE А * WORD в 2.
В 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( ?)