- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •1. Арифметические команды
- •2. Логические команды
- •3. Сдвиговые команды
- •4. Команды передачи управления и управления флагами
- •5. Формат строк ассемблера. Метки и их использование
- •6. Директивы распределения памяти
- •7. Сегменты
- •8. Прерывания
- •9. Директивы порядка загрузки сегментов
- •10. Директивы управления программным счетчиком
- •11. Условия
- •12. Процедуры
- •13. Глобальные объявления
- •14. Макроопределения
- •15. Выражения
- •16. Директивы управления файлами
- •17. Резидентные программы
- •Библиографический список
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •400005, Волгоград, просп. Ленина, 28, корп.1
- •400005, Волгоград, ул. Советская, 35, корп.7
6. Директивы распределения памяти
Любая программа работает с памятью, поэтому возникает необходимость работать с ее распределением. Для подобной работы используются специальные директивы, а именно псевдокоманды и структуры.
Псевдокоманда – это директива ассемблера, которая приводит к включению данных или кода в программу, хотя сама она никакой команде процессора не соответствует. Она указывает ассемблеру, что в соответствующем месте программы располагается переменная, определяет тип переменной, задает ее начальное значение и ставит в соответствие переменной метку, которая будет использоваться для обращения к этим данным. Записываются псевдокоманды так:
имя переменной D* значение
Под D* имеем в виду одну из следующих псевдокоманд:
- DB – определить байт;
- DW – определить слово (2 байта);
- DD – определить двойное слово (4 байта);
- DF – определить 6 байт;
- DQ – определить учетверенное слово (8 байт);
- DT – определить 10 байт.
Значение может быть числом, несколькими числами, символами (их надо брать в кавычки). В качестве дополнения используются операторы ? и DUP, но все это надо разделять запятыми. Все установленные таким образом данные окажутся в выходном файле, а имя переменной будет соответствовать адресу первого из указанных значений.
В каждом случае имеет смысл использовать разное количество памяти. К примеру, если необходимо задать простую строку символов, то достаточно выжелять в памяти один байт на каждый символ с помощью директивы DB. А вот если работаем со строкой символов с атрибутами (цвет, курсив и т.д.), но необходимо два байта памяти (один на собственно символ, а второй на атрибуты), тогда используют DW. Для больших чисел в степени и т.д. тоже используют другие варианты псевдокоманд.
msgtext DB ‘Privet’ ; обычная строка символов
naborchisel DB 1, 2, 3, 4, 5 ; набор простых чисел
slozchislo DD 5.8e6 ; число типа float, да еще с возведением в степень.
Кроме того, довольно часто возникает ситуация, когда нам необходимо заполнить большой участок памяти повторяющимися данными. Например, для введения заготовки под строку или при формировании двумерных массивов. Для этого используют оператор дублирования DUP, работающий следующим образом:
счетчик DUP значение
А применительно к псевдокомандам:
метка D* счетчик DUP значение
metka DB 64 dup (?)
Показанный пример создает массив из 64 неинициализированных байт, на адрес первого из которых указывает имя metka. Если бы мы хотели заполнить массив нулями или единицами, то сведали бы следующее:
metka DB 64 dup (0)
metka DB 64 dup (1)
Как известно, в языках высокого уровня широко используется такое понятие как структуры. Естественно, есть они и в ассемблере. Директива STRUC позволяет определить структуру данных аналогично структурам в языках высокого уровня. Последовательность директив
имя STRUC
поля
имя ENDS
где поля – любой набор псевдокоманд определения переменных или структур, устанавливает, но не инициализирует структуру данных. В дальнейшем для ее создания в памяти используют имя структуры как псевдокоманду:
метка имя <значения>
Если же нам необходимо что-то считать из структуры или записать в нее, то использует оператор «.». В случае использования сложенной структуры доступ к ее содержимому получаем через еще один такой же оператор «.».
