Лекция 9. Объединения (1 пара)



Представим ситуацию, когда мы используем некоторую область памяти для размещения некоторого объекта программы (переменной, массива или структуры). Вдруг после некоторого этапа работы у нас отпала надобность в использовании этих данных. Обычно память останется занятой до конца работы программы. Конечно, в принципе, ее можно было бы использовать для хранения других переменных, но при этом без принятия специальных мер нельзя изменить тип и имя. Неплохо было бы иметь возможность переопределить эту область памяти для объекта с другим типом и именем. Язык ассемблера предоставляет такую возможность в виде специального типа данных, называемого объединением.

Объединение — тип данных, позволяющий трактовать одну и ту же область памяти как имеющую разные типы и имена.

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

имя_объединения          UNION          <описание полей>имя_объединения          ENDS

Отличие объединений от структур состоит, в частности, в том, что при определении переменной типа объединения память выделяется в соответствии с размером максимального элемента.

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

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

Листинг 7, который мы сейчас рассмотрим, примечателен тем, что кроме демонстрации использования собственно типа данных “объединение” в нем показывается возможность взаимного вложения структур и объединений.

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

  • 16-битного смещения;
  • 32-битного смещения;
  • пары из 16-битного смещения и 16-битной сегментной составляющей адреса;
  • в виде пары из 32-битного смещения и 16-битного селектора.

Какие из этих указателей можно применять в конкретной ситуации, зависит от режима адресации (use16 или use32) и режима работы микропроцессора.

Так вот, описанный в листинге 7 шаблон объединения позволяет нам облегчить формирование и использование указателей различных типов.

Листинг 7 Пример использования объединенияmasmmodel smallstack  256.586Ppnt     struc                  ;структура pnt, содержащая вложенное объединениеunion                                ;описание вложенного в структуру объединенияoffs_16 dw     ?offs_32 dd      ?ends                                 ;конец описания объединенияsegm  dw     ?ends                                 ;конец описания структуры.datapoint  union ;определение   объединения, содержащего вложенную структуруoff_16 dw     ?off_32 dd      ?point_16 pnt     <>point_32 pnt     <>point  endstst      db      "Строка для тестирования"adr_data point <> ;определение экземпляра объединения.codemain:          mov   ax,@data          mov   ds,ax          mov   ax,seg tst;записать адрес сегмента строки tst в поле структуры adr_data          mov   adr_data.point_16.segm,ax;когда понадобится, можно извлечь значение из этого поля обратно, к примеру, в регистр bx:          mov   bx,adr_data.point_16.segm;формируем смещение в поле структуры adr_data          mov   ax,offset tst      ;смещение строки в ax          mov   adr_data.point_16.offs_16,ax;аналогично, когда понадобится, можно извлечь значение из этого поля:          mov   bx,adr_data.point_16.offs_16exit:          mov   ax,4c00h          int      21hend    main

Когда вы будете работать в защищенном режиме микропроцессора и использовать 32-разрядные адреса, то аналогичным способом можете заполнить и использовать описанное выше объединение.

Лекция 10. Записи (1 пара)

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

Подумаем, зачем тратить под некоторый программный индикатор со значением “включено-выключено” целых восемь разрядов, если вполне хватает одного? А если таких индикаторов несколько, то расход оперативной памяти может стать весьма ощутимым.

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

TASM предоставляет нам специальный тип данных, использование которого помогает решить проблему работы с битами более эффективно. Речь идет о специальном типе данных — записях.

Запись — структурный тип данных, состоящий из фиксированного числа элементов длиной от одного до нескольких бит.

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

Суммарный размер записи определяется суммой размеров ее полей и не может быть более 8, 16 или 32 бит.

Если суммарный размер записи меньше указанных значений, то все поля записи “прижимаются” к младшим разрядам.

Использование записей в программе, так же, как и структур, организуется в три этапа:

  1. Задание шаблона записи, то есть определение набора битовых полей, их длин и, при необходимости, инициализация полей.
  2. Определение экземпляра записи. Так же, как и для структур, этот этап подразумевает инициализацию конкретной переменной типом заранее определенной с помощью шаблона записи.
  3. Организация обращения к элементам записи.

Компилятор TASM, кроме стандартных средств обработки записей, поддерживает также и некоторые дополнительные возможности их обработки.

Описание записи

Описание шаблона записи имеет следующий синтаксис (рис. 6):

имя_записи RECORD <описание элементов>

Здесь:

<описание элементов> представляет собой последовательность описаний отдельных элементов записи согласно синтаксической диаграмме (см. рис. 6):

Рис. 6. Синтаксис описания шаблона записи

При описании шаблона память не выделяется, так как это всего лишь информация для транслятора ассемблера о структуре записи.

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


Дата добавления: 2019-09-13; просмотров: 234; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!