Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Для описания переменных в языке ассемблера использу­ются директивы определения данных.

Директива DB (Define Byte, определить байт) определяет данные разме­ром в байт:

 

[<имя>] DB <операнд> {,<операнд>}

 

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

Существует два основных способа задания операндов директивы DB:

- неинициализированное начальное значение? (знак неопределенного значения);

- константное выражение со значением от -128 до 255.

 

X DB?

 

По этой директиве переменной X отводится один байт памяти, в который ничего не записывается. Ассемблер запомнит адрес переменной и когда он встретится в тексте, заменит его на дан­ный адрес (выполнит трансляцию имен). Адрес ячейки, выделенной переменной с именем X, принято называть значе­нием имени X (в отличие от содержимого ячейки по этому адресу).

По описанию переменной ассемблер определяет, сколько байт занимает переменная в памяти. Этот размер называется типом переменной. Значение (адрес) и тип (размер) переменной однозначно определяют ячейку, обозна­чаемую именем.

С одного и того же адреса могут на­чинаться ячейки размером байт, слово или двойное слово, поэтому кроме начального адреса ячейки обычно требуется знать и ее размер. В языке ассемблера существует оператор типа:

 

TYPE <имя>

 

Значением оператора является размер (в байтах) ячейки, выделенной под переменную с указанным именем. Если переменная описана по директиве DB, то для ее имени значение оператора равно 1. В языке ассемблера есть стандартная константа с именем BYTE и значением 1:

 

ТУРЕ X = BYTE = 1

 

Для определения переменной с начальным значением в качестве операнда в директиве DB указывается выражение, которое ассемблер вычислит, и значение которого запишет в ячейку памяти. В наиболее распространенном случае начальное значение байтовой переменной задается в виде числа с величиной от -128 до 255:

 

A DB 254; 0FEh

В DB -2; 0FEh (256-2=254)

 

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

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

 

S DB 2Ah

S DB "*"

 

Во втором случае ассемблер определит код символа и запишет его в ячейку памяти.

С помощью директивы DB можно описать двоично-десятичные числа:

 

PACK DB 01h, 23h; число 123 в упакованном формате

UNPACK DB 1, 2, 3; число 123 в неупакованном формате

 

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

Другим более удобным способом описания является применение ASCII-чисел – записи чисел в виде символьных строк (например, ‘123’). В кодировке ASCII символьные цифры от ‘0’ до ‘9’ имеют коды от 30h до 39h. Поэтому преобразования таких символьных чисел в двоично-десятичные выполняется путем выделения младшего полубайта кода, а обратное преобразование – путем сложением с 30h.

С помощью директивы DB можно описать массив. Например, байтовый массив A из 8 элементов с начальным значением 0 для каждого из них можно определить так:

 

A db 0, 0, 0, 0, 0, 0, 0, 0

 

Директиву можно записать иначе:

 

A DB 8 DUP(0)

 

В качестве операнда здесь использована конструкция повторе­ния, в которой сначала указывается коэффициент повторения, а затем служебное слово DUP (duplicate, копировать) и в круглых скобках повторяемая величина:

 

k DUP (p1, р2,..., pn)

 

где

k - константное выражение с положительным значением, n ³ 1;

рi - любой допустимый операнд директивы DB (возможна вновь конструкция повторения).

 

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

Вложенность конструкций DUP позволяет задать многомерные массивы. Например, байтовая матрица А размера 5x10 (10 байт в строке, 5 строк) имеет вид:

 

A DB 5 DUP(10 DUP(?))

 

Директива DW (Define Word, определить слово) определяет переменную размером в слово.

Рассмотрим допустимые виды ее операндов.

Определение неинициализированной переменной:

 

A DW?

 

В примере ассемблер отводит под переменную А слово памяти и переменная не получает начального значе­ния. Тип переменной равен 2, т.е. занимает два байта.

В языке ассемблера есть стандартная константа с именем WORD и значением 2:

 

TYPE а = WORD = 2

 

Операндом директивы может быть константное выражение со значением от -32768 до 65535.

 

B DW 1234b

 

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

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

 

A DB?

B DW A

 

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

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

 

A DW 100, 3 DUP(?)

 

Директива DD (Define Double Word, определить двойное слово) определяет переменную, под которую отводится двойное слово. Пере­менная имеет тип DWORD (значением константы является число 4).

Определение неинициализированной переменной:

 

A DD?

 

Под переменную А выделяется двойное слово и переменная А не получает начального значения.

Операндом директивы может быть константное выражение со значение от -231 до 232-1.

 

B DD 123456h

 

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

Операндом директивы может быть число в диапазоне от -215 до 216-1. Все выражения вычисляются в области 16-битовых чисел (по модулю 216). Например, по директиве:

 

A DD 8000h+8002h

 

начальным значением переменной A будет число 2, а не число 10002h.

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

Конструкция повторения DUP:

 

DW 10 DUP(?), 12345h

 

Директива эквивалентности EQU (Equal, равно) позволяет определить константу и имеет следующий синтаксис:

 

<имя> EQU <операнд>

 

Директива аналогична описанию константы в языке Паскаль. Она определяет, что операнду дается имя, и требует, чтобы все вхождения имени в текст программы ассемблер заменял на этот операнд. Директива EQU носит информационный характер, по ней ассемблер ничего не записывает в машинную программу. Поэтому директиву EQU можно использовать в любом месте программы.

Если в правой части директивы указано имя регистра, переменной или константы, тогда имя слева объявляется синонимом данного имени и все последующие вхождения в текст программы этого имени-синонима ассемблер будет заменять на имя, указанное справа, например:

 

A DW?

В EQU A

C DW В; эквивалентно С DW A

 

Имена-синонимы обычно используются для введения обозначений. Например, если регистр аккумулятора используется для хранения суммы, то его можно обозначить как SUM:

 

SUM EQU AX

 

и далее использовать более наглядное имя.

Операндом директивы EQU может быть константное выражение, например:

 

N EQU 100

К EQU 2*N-1

 

Если в правой части директивы EQU находится константное выражение, тогда указанное слева имя принято называть именем константы. Значением такой константы объявляется значение выражения. Например, N – константа со значением 100, К – со значением 199. Все последующие вхождения в текст имени константы ассемблер будет заменять на значение этой константы.

Операндом может быть любой текст:

 

s EQU 'Ошибка’

 

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

Директива присваивания определяет константу с именем, указанным в левой части и с числовым значением, равным значению выражения справа:

 

<имя> = <константное выражение>

 

В отличие от констант, определяемых по директиве EQU, константа может менять свое значение, обозначая в разных частях текста программы разные числа. По директиве присваивания можно определить только числовую константу, например:

 

C=10

A DW C; эквивалентно A DW 10

C=C+2

В DB C; эквивалентно В DB 12




Поделиться с друзьями:


Дата добавления: 2014-11-16; Просмотров: 4964; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.