15.Сложные структуры данных языка ассемблер: массивы, структуры, объединения, записи.
TASM поддерживает следующие сложные типы данных:
- массивы;
- структуры;
- объединения;
- записи.
Массивы
Массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа.
Описание и инициализация массива в программе
Специальных средств описания массивов в программах ассемблера, конечно, нет. При необходимости использовать массив в программе его нужно моделировать одним из следующих способов:
- Перечислением элементов массива в поле операндов одной из директив описания данных. При перечислении элементы разделяются запятыми.
mas dd 1,2,3,4,5
- Используя оператор повторения dup. К примеру:
mas dw 5 dup (0)
Доступ к элементам массива
В общем случае для получения адреса элемента в массиве необходимо начальный (базовый) адрес массива сложить с произведением индекса (номер элемента минус единица) этого элемента на размер элемента массива:
база + (индекс*размер элемента)
Если последовательность однотипных элементов в памяти трактуется как двухмерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле
(база + количество_элементов_в_строке * размер_элемента * i+j)
Структуры
Структура — это тип данных, состоящий из фиксированного числа элементов разного типа.
Для использования структур в программе необходимо выполнить три действия:
- Задать шаблон структуры. По смыслу это означает определение нового типа данных, который впоследствии можно использовать для определения переменных этого типа.
- Определить экземпляр структуры. Этот этап подразумевает инициализацию конкретной переменной заранее определенной (с помощью шаблона) структурой.
- Организовать обращение к элементам структуры.
Описание шаблона структуры
Описание шаблона структуры имеет следующий синтаксис:
имя_структуры STRUC
<описание полей>
имя_структуры ENDS
Здесь <описание полей> представляет собой последовательность директив описания данных db, dw, dd, dq и dt.
Их операнды определяют размер полей и, при необходимости, начальные значения. Этими значениями будут, возможно, инициализироваться соответствующие поля при определении структуры.
Определение данных с типом структуры
Для использования описанной с помощью шаблона структуры в программе необходимо определить переменную с типом данной структуры. Для этого используется следующая синтаксическая конструкция:
[имя переменной] имя_структуры <[список значений]>
Здесь:
- имя переменной — идентификатор переменной данного структурного типа.
Задание имени переменной необязательно. Если его не указать, будет просто выделена область памяти размером в сумму длин всех элементов структуры. - список значений — заключенный в угловые скобки список начальных значений элементов структуры, разделенных запятыми.
Его задание также необязательно.
Методы работы со структурой
Идея введения структурного типа в любой язык программирования состоит в объединении разнотипных переменных в один объект.
В языке должны быть средства доступа к этим переменным внутри конкретного экземпляра структуры. Для того чтобы сослаться в команде на поле некоторой структуры, используется специальный оператор — символ “.” (точка). Он используется в следующей синтаксической конструкции:
адресное_выражение.имя_поля_структуры
Здесь:
- адресное_выражение — идентификатор переменной некоторого структурного типа или выражение в скобках в соответствии с указанными ниже синтаксическими правилами (рис. 1);
- имя_поля_структуры — имя поля из шаблона структуры.
Это, на самом деле, тоже адрес, а точнее, смещение поля от начала структуры.
Объединения
Объединение — тип данных, позволяющий трактовать одну и ту же область памяти как имеющую разные типы и имена.
Описание объединений в программе напоминает описание структур, то есть сначала описывается шаблон, в котором с помощью директив описания данных перечисляются имена и типы полей:
имя_объединения UNION
<описание полей>
имя_объединения ENDS
Отличие объединений от структур состоит, в частности, в том, что при определении переменной типа объединения память выделяется в соответствии с размером максимального элемента.
Обращение к элементам объединения происходит по их именам, но при этом нужно, конечно, помнить о том, что все поля в объединении накладываются друг на друга.
Одновременная работа с элементами объединения исключена. В качестве элементов объединения можно использовать и структуры.
Записи
Запись — структурный тип данных, состоящий из фиксированного числа элементов длиной от одного до нескольких бит.
При описании записи для каждого элемента указывается его длина в битах и, что необязательно, некоторое значение.
Суммарный размер записи определяется суммой размеров ее полей и не может быть более 8, 16 или 32 бит.
Если суммарный размер записи меньше указанных значений, то все поля записи “прижимаются” к младшим разрядам.
Использование записей в программе, так же, как и структур, организуется в три этапа:
- Задание шаблона записи, то есть определение набора битовых полей, их длин и, при необходимости, инициализация полей.
- Определение экземпляра записи. Так же, как и для структур, этот этап подразумевает инициализацию конкретной переменной типом заранее определенной с помощью шаблона записи.
- Организация обращения к элементам записи.
Описание записи
заебался :c
http://kit.znu.edu.ua/eDoc/Arch/assembl/guide/Text/Data.htm#записи