4497

Структуры в языке ассемблер

Лекция

Информатика, кибернетика и программирование

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

Русский

2012-11-21

33.87 KB

6 чел.

Структуры в языке ассемблер

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

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

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

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

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

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

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

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

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

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

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

Описать структуру в программе можно только один раз, а определить — любое количество раз.

Описание шаблона структуры

Описание шаблона структуры имеет следующий синтаксис:

имя_структуры STRUC

<описание полей>

имя_структуры ENDS

 

Здесь <описание полей> представляет собой последовательность директив описания данных db, dw, dd, dq и dt.

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

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

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

Рассмотрим работу со структурами на примере моделирования базы данных о сотрудниках некоторого отдела.

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

Определим структуру записи этой базы данных следующим шаблоном:

worker struc ;информация о сотруднике

nam db 30 dup (' ') ;фамилия, имя, отчество

sex db 'м' ;пол, по умолчанию 'м' — мужской

position db 30 dup (' ') ;должность

age db 2 dup(‘ ’)  ;возраст

standing db 2 dup(‘ ’) ;стаж

salary db 4 dup(‘ ’)  ;оклад в рублях

birthdate db 8 dup(‘ ’) ;дата рождения

worker ends

Определение данных с типом структуры

Для использования описанной с помощью шаблона структуры в программе необходимо определить переменную с типом данной структуры. Для этого используется следующая синтаксическая конструкция:

[имя переменной] имя_структуры <[список значений]>

Здесь:

  1.  имя переменной — идентификатор переменной данного структурного типа.
  2.  Задание имени переменной необязательно. Если его не указать, будет просто выделена область памяти размером в сумму длин всех элементов структуры.
  3.  список значений — заключенный в угловые скобки список начальных значений элементов структуры, разделенных запятыми.
  4.  Его задание также необязательно.
  5.  Если список указан не полностью, то все поля структуры для данной переменной инициализируются значениями из шаблона, если таковые заданы.
  6.  Допускается инициализация отдельных полей, но в этом случае пропущенные поля должны отделяться запятыми. Пропущенные поля будут инициализированы значениями из шаблона структуры. Если при определении новой переменной с типом данной структуры мы согласны со всеми значениями полей в ее шаблоне (то есть заданными по умолчанию), то нужно просто написать угловые скобки.
  7.  К примеру: victor worker <>.

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

data segment

sotr1 worker <’Гурко Андрей Вячеславович’,,’художник’,’33’,‘15’,‘1800’,’26.01.64’<

sotr2 worker <’Михайлова Наталья Геннадьевна’,’ж’,’программист’,’30’,’10’,’1680’,’27.10.58’<

sotr3 worker <’Степанов Юрий Лонгинович’,,’художник’,’38’,’20’,’1750’,’01.01.58’<

sotr4 worker <’Юрова Елена Александровна’,’ж’,’свяэист’,’32’,’2’,,’09.01.66’<

sotr5 worker <> ;здесь все значения по умолчанию

data ends

Методы работы со структурой

Идея введения структурного типа в любой язык программирования состоит в объединении разнотипных переменных в один объект.

В языке должны быть средства доступа к этим переменным внутри конкретного экземпляра структуры. Для того чтобы сослаться в команде на поле некоторой структуры, используется специальный оператор — символ "." (точка). Он используется в следующей синтаксической конструкции:

адресное_выражение.имя_поля_структуры

 

Здесь:

  1.  адресное_выражение — идентификатор переменной некоторого структурного типа или выражение в скобках в соответствии с указанными ниже синтаксическими правилами (рис. 1);
  2.  имя_поля_структуры — имя поля из шаблона структуры.
  3.  Это, на самом деле, тоже адрес, а точнее, смещение поля от начала структуры.

Таким образом оператор "." (точка) вычисляет выражение

(адресное_выражение) + (имя_поля_структуры)

 

Рис. 5. Синтаксис адресного выражения в операторе обращения к полю структуры

Продемонстрируем на примере определенной нами структуры worker некоторые приемы работы со структурами.

К примеру, извлечь в ax значения поля с возрастом. Так как вряд ли возраст трудоспособного человека будет больше величины 99 лет, то после помещения содержимого этого символьного поля в регистр ax его будет удобно преобразовать в двоичное представление командой aad.

Будьте внимательны, так как из-за принципа хранения данных “младший байт по младшему адресу” старшая цифра возраста будет помещена в al, а младшая — в ah.

Для корректировки достаточно использовать команду xchg al,ah:

 mov ax,word ptr sotr1.age ;в al возраст sotr1

 xchg ah,al

а можно и так:

lea bx,sotr1

mov ax,word ptr [bx].age

 xchg ah,al

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

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

К примеру, определим массив из 10 структур типа worker:

mas_sotr worker 10 dup (<>)

Дальнейшая работа с массивом структур производится так же, как и с одномерным массивом. Здесь возникает несколько вопросов:

Как быть с размером и как организовать индексацию элементов массива?

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

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

К примеру:

worker struc

...

worker ends

...

mas_sotr worker 10 dup (<>)

...

mov bx,type worker ;bx=77

 lea di,mas_sotr

;извлечь и вывести на экран пол всех сотрудников:

 mov cx,10

cycl:

mov al,[di].sex

...

;вывод на экран содержимого поля sex структуры worker

add di,bx ;к следующей структуре в массиве mas_sort

loop cycl

Как выполнить копирование поля из одной структуры в соответствующее поле другой структуры? Или как выполнить копирование всей структуры? Давайте выполним копирование поля nam третьего сотрудника в поле nam пятого сотрудника:

worker struc

...

worker ends

...

mas_sotr worker 10 dup (<>)

...

mov bx,offset mas_sotr

mov si,(type worker)*2 ;si=77*2

add si,bx

mov di,(type worker)*4 ;si=77*4

add di,bx

mov cx,30

rep movsb

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

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

Наличие в языке следующих двух типов данных, наверное, объясняется стремлением “хозяйки” максимально эффективно использовать рабочую площадь стола (оперативной памяти) при приготовлении еды или для размещения продуктов (данных программы).


 

А также другие работы, которые могут Вас заинтересовать

31820. Современные программные средства, используемые для поддержки принятия решений 24 KB
  Продукт SS Wrehouse dministrtor позволяет реализовать хранилища данных на верхнем уровне и SS OLP ДЛЯ АНАЛИТИЧЕСКОЙ ОБРАБОТКИ В РЕЖИМЕ реального времени. Продукт Orcle Wrehouse Builder OWB средства для проектирования и развертывания хранилищ данных витрин данных и приложений по деловому интеллекту в Интернет. Система Business Objects предназначен для создания самых сложных консолидирующих упрх и аналитических отчетов на основе накопленных в организации разнородных данных рассылки этих отчетов корпоративным сервером. Система...
31821. Понятие и классификация автоматизированных информационных систем в управлении 28.5 KB
  Автоматизированная информационная система АИС совокупность программноаппаратных средств предназначенных для автоматизации деятельности связанной с хранением передачей и обработкой информации. АИС являются с одной стороны разновидностью информационных систем ИС с другой автоматизированных систем АС вследствие чего их часто называют ИС или АС. В АИС за хранение информации отвечают: на физическом уровне встроенные устройства памяти RM внешние накопители дисковые массивы на программном уровне файловая система ОС СУБД...
31822. Реформа армии Петра I 595 KB
  Для приверженцев первой точки зрения в военной историографии характерна уверенность в том, что военное дело в допетровской России было безнадежно отсталым, устаревшим и к моменту воцарения Петра I находилось в состоянии полного развала и запустения, армия была дезорганизована и небоеспособна
31823. Создание плана озеленения с использованием древесно-кустарниковых и травянистых растений, исключительно имеющих лечебные свойства 150.18 KB
  Фитотерапия с лечебной и профилактической целью использует либо растения в целом либо их отдельные части: корни корневища клубни луковицы листья цветки стебли кору почки ягоды плоды и семена. Цветет в мае плоды созревают в июле августе. Плоды черемухи использовались человеком каменного века о чем свидетельствуют результаты археологических раскопок. Используя их в пищу люди не могли не отметить их специфического вяжущего действия поэтому плоды черемухи можно считать одним из древнейших лекарственных средств.
31824. СВИНЦОВО-КИСЛОТНИЙ АКАМУЛЯТОР 6-СТ-90 550.5 KB
  Приготовление пасты. Расчёт объема пасты осуществляется по формуле. Поэтому при формировании очередной партии пластин отрицательной и положительной пасты меняются местами и следовательно изменяется полярность подачи напряжения на шины.3 Приготовление пасты Активная масса свинцовых аккумуляторов образуется в результате электрохимических процессов окисления или восстановления протекающих в электродных пастах при формировании намазных этими пастами пластин.
31825. Разработка информационно-справочного ресурса культурно-развлекательного центра «Мистик» способного представлять текстовую и графическую информацию пользователю 8.37 MB
  3 Анализ достоинств и недостатков имеющихся технологий 3 Техническое задание на создание ресурса 22 4 Проектирование работы ресурса с помощью UML 32 5 Реализация информационного ресурса 5.1 Разработка информационного ресурса 5.2 Описание интерфейса 6 Тестирование работы ресурса и контрольный пример работы 6.1 Тестирование интернет ресурса 6.
31826. Создание электронного ресурса, который поможет сделать процесс управления образованием более оперативным и удобным 4.53 MB
  3 Описание языка [2] PHP англ. PHP: Hypertext Preprocessor PHP: препроцессор гипертекста англ. [4] В области программирования для Сети PHP один из популярных скриптовых языков наряду с JSP Perl и языками используемыми в SP.NET благодаря своей простоте скорости выполнения богатой функциональности кроссплатформенности и распространению исходных кодов на основе лицензии PHP.
31827. Поиск субоптимальных параметров в методе аддитивного расщепления 240.81 KB
  Субоптимальные параметры расщепления максимально с точностью до малого параметра расширяют по вещественной оси спектральную область сходимости. Также проблематично бывает проверить условие сходимости которое обычно не выполняется. В связи с этим в данной дипломной работе для схемы МАР находятся такие параметры при которых спектральная область сходимости содержала бы интервал на вещественной оси наибольшей длины. Для случая когда спектральный радиус применяется метод аддитивного расщепления [13]: произвольный набор начальных...
31828. Реалии Третьего рейха и проблема их перевода 1.1 MB
  Вот некоторые из подобных явлений: Слово о воздушной войне речь рейхсминистра Геббельса Ein Wort zum Luftkrieg von Reichsminister Doktor Goebbelsâ N № 210 Вера и красота женская фашистская организация Glube und Schönheit N № 21 офицеры вермахта офицерыэсэсовцы Offiziere der Wehrmcht SSOffiziereâ R № 59 Германия и песнь о Хорсте Весселе ds Deutschlnd und ds HorstWesselLied R № 214 назначенный на 1 апреля 1933 года бойкот врачебной практики...