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

Unknown Author

Операнд-число, естественно, переводится ассемблером в двоичную систему. При этом неотрицательные числа записываются в память как числа без знака, а отрицательные числа записываются в дополнительном коде (см. комментарии к директивам). В связи с этим и получается, что в качестве операндов можно указывать числа от -128 до 255. Отсюда же следует, что числа 254 и -2 будут пред-ставлены в памяти одним и тем же байтом OFEh (это для нас данные числа различны, а для машины они одинаковы, и ей безразлично, что обозначает байт OFEh - число со знаком или без знака).

В другом распространенном случае в качестве начального значения переменной указывается символ. Такое значение можно задать двояко: либо указать числовой код этого символа, либо указать сам символ в кавычках. Например, в системе кодировки ASCII код символа равен 2Ah, поэтому следующие две директивы эквивалентны:

Q DB 2Ah    Q DB

Во втором случае ассемблер сам определит код указанного символа и запише! этот код в ячейку памяти. Ясно, что этот вариант лучше - он нагляднее и не тре3 бует знания кодов символов, поэтому его обычно и используют на практике.

Мы рассмотрели два основных случая задания начального значения. В общем же случае такое значение указывается любым константным выражением со значением от -128 до 255. (Если значение выходит за эти пределы, то ассемблер зафиксирует ошибку.) Константные выражения аналогичны арифметическим выражениям языков высокого уровня. Мы их рассмотрим позже, а пока лишь отметим, что к таким выражения относится оператор TYPE, поэтому допустима, скажем, следующая директива (имя Q описано выше):

V DB TYPE Q

которая эквивалентна директиве V DB 1.

Директива с несколькими операндами

Мы рассмотрели случаи, когда в директиве DB указывается один операнд. Это удобно, когда надо описать скалярную переменную, но неудобно, когда надо описать переменную-массив. В самом деле, если надо, к примеру, описать массив из 4 бантов с некоторыми начальными значениями, то это можно сделать так:

М DB 2 DB -2 DB ?

DB '*'

Отметим попутно, что в массивах имя обычно дается только его первому элементу, а остальные остааляют безымянными, поэтому-то в нашем примере имя указано лишь в первой директиве. Если в директиве DB не указано имя, то по ней байт в памяти отводится, но он остается безымянным.

Ясно, что, если в массиве много элементов, то такой способ описания массива слишком громоздок.. Поэтому в ЯА допускается упрощенная форма описания массивов, когда он описывается одной директивой, но с несколькими операндами - со столькими, сколько элементов в массиве. Например, вместо наших 4 директив можно выписать только одну:

И DB 2,-2,?,'*'

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