Сложные структуры данных. Перечислимые типы данных. Прерывания пользователя

Страницы работы

Содержание работы

Глава 8 Сложные структуры данных

8.1. Массивы

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

На расположение любых массивов в памяти компьютера накладывается требование  непрерывности следования элементов массива друг за другом, а на многомерные массивы – еще и правило установления соответствия между не одномерной структурой массива и одномерным вектором, представляющим этот массив в линейной памяти машины.

Дело в том, что если мы имеем, например, двумерный массив X = {xij: a≤i≤b и c≤j≤d}

xa,c     xa,c+1  …      xa,d-1   xa,d                    xa+1,c  xa+1,c+1         …      xa+1,d-1 xa+1,d                    …               xij                …                    xb-1,c     xb-1,c+1 …      xb-1,d-1 xb-1,d                    xb,c     xb,c+1  …      xb,d-1  xb,d       , то мы можем расположить его элементы в памяти машины по строкам, т.е. в последовательности: xa,c xa,c+1 … xa,d-1 xa,d xa+1,c xa+1,c+1 … xa+1,d-1 xa+1,d … xa+1,c xa+1,c+1 … xa+1,d-1 xa+1,d xb,c xb,c+1 … xb,d-1 xb,d. Или по столбцам, т.е. в последовательности:  xa,c xa+1,cxb-1,c xb,c xa,c+1 xa+1,c+1 … xb-1,c+1 xb,c+1 … xa,d-1 xa+1,d-1 … xb-1,d-1 xb,d-1 xa,d xa+1,d … xb-1,d xb,d. В первом случае говорят, что быстрым является последний индекс (такое расположение элементов принято, например, в языке Си), а доступ к элементу массива xij осуществляется по формуле X+((i-a)*(d–c+1)+j-c)*Type X. Во втором случае быстрым является первый индекс массива (такое расположение элементов массива в памяти машины принято в языке Фортран), а формула для вычисления адреса элемента массива будет такой: X+((j-c)*(b–a+1) + i-a)*Type X.

8.2. Записи

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

Имя_записи  RECORD  поле1:длина[=значение по умолчанию][,поле2…]

Например, для записи даты можно было бы использовать запись следующего формата:

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

    День                       Месяц                                Год

Date_format       record        day:5=1,month:4=1,year:7=0

Test_date  Date_format       <17,5,1>

Выше приведена строка, описывающая переменную Test_date и её начальное значение, которым будут инициализированы во время компиляции поля этой переменной: 17 мая 2001 года. Если бы начальные значения были опущены, то полям записи были бы присвоены значения, предусмотренные по умолчанию:

Millennium Date_format       <>

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

Last_day   Date_format       {day=31}

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

mov  ax,test_date

and   ax,mask month   или   getfield   month bl, test_date

shr    ax,month

А заменить значение месяца с мая на июнь можно следующим образом:

and   test_date,not mask month    или    and   test_date,not mask month or      test_date,6 shl month 

mov  bx,6

setfield       month test_date,bx    здесь первая пара команд обнуляет поле месяца, остальные – формируют в нужном месте регистра ax новое содержимое поля месяца, используя значение, записанное в регистре bx.

Определить количество бит, входящих в то или иное поле записи или в запись целиком позволяет оператор WIDTH.

8.3. Перечислимые типы данных

Компилятор ассемблера TASM допускает описание перечислимых типов с помощью оператора enum, в форме, аналогичной используемой в языке Си.

Например, тип  «буквы латинского алфавита» может быть описан следующим образом:

Alphabet enum A,B,C,D,E,F,G,H,I,J,K,L,N,M,O,P,Q,R,S,T,V,U,W,X,Y,Z

При этом компилятор по умолчанию каждому имени из перечисленного набора элементов типа присваивает значение константы соответствующей номеру элемента, начиная с нулевого значения для первого элемента типа. Указав начальное значение для какого-то (или всех) элемента от этого правила можно отступить. Значение константы, присвоенной имени, следующему в списке за именем, имеющим явно указанное начальное значение, будет на единицу больше. Имени типа присваивается значение количества бит, необходимого для моделирования множества с указанным количеством элементов. Само собой разумеется, что имена, встречающиеся в описании перечислимого типа, не следует использовать в программе для каких-либо других целей.

Похожие материалы

Информация о работе