Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Определение экземпляра записиСодержание книги
Поиск на нашем сайте
Для использования шаблона записи в программе необходимо определить переменную с типом данной записи, для чего применяется следующая синтаксическая конструкция (рис. 10.3).
Рис. 10.3. Синтаксис описания экземпляра записи
Рассмотрим несколько вариантов инициализации. Пример: Если инициализировать поля не требуется, то достаточно указать? при определении экземпляра записи: ... Iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00; 8 бит ... Flag iotest?;все поля записи после выполнения данной ; инициализации обнуляются
Пример_1: согласиться со значениями по умолчанию можно так:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00; _11_1100 ... flag iotest<>;согласились со значением по умолчанию
Пример_2: Изменить значение поля i2 можно так:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ... flag iotest<,10,,,>; переопределили i2
Пример_3: Переопределим поле i2:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ... flag iotest{i2=10};переопределили i2, не обращая внимания ; на порядок следования других ; компонентов записи
Работа с записями При работе с записями: – Каждому имени элемента записи ассемблер присваивает числовое значение, равное количеству сдвигов вправо, которые нужно произвести для того, чтобы этот элемент оказался «прижатым» к началу ячейки. Это дает возможность локализовать его и работать с ним. Но для этого нужно знать длину элемента в битах. – Ассемблер содержит оператор width, который позволяет узнать размер элемента записи в битах или полностью размер записи. Варианты применения оператора width: – Сдвиг вправо производится с помощью команды сдвига shr.
А) width имя_элемента_записи — значением оператора будет размер элемента в битах; Б) width имя_экземпляра_записи или width имя_типа_записи — значением оператора будет размер всей записи в битах.
Mov al,width i2 ... Mov ax,width iotest
– Ассемблер содержит оператор mask, который позволяет локализовать биты нужного элемента записи. Эта локализация производится путем создания маски, размер которой совпадает с размером записи. В этой маске обнулены биты во всех позициях, за исключением тех, которые занимает элемент в записи. – Действия по преобразованию элементов записи производятся с помощью логических команд. Непосредственно обратиться к элементу записи невозможно. Чтобы произвести обработку интересующего нас элемента, нужно сначала выделить его, сдвинуть при необходимости к младшим разрядам, выполнить требуемые действия и поместить обратно на свое место в записи. Типовые алгоритмы для работы с элементами записи. 1) Для выделения элемента записи необходимо: m Поместить запись во временную память — регистр (8-, 16- или 32-битный, в зависимости от размера записи). m Получить битовую маску, соответствующую элементу записи, с помощью оператора mask. m Локализовать биты в регистре с помощью маски и команды and. m Сдвинуть биты элемента к младшим разрядам регистра командой shr. Число разрядов для сдвига получить с использованием имени элемента записи. В результате этих действий элемент записи будет локализован в начале рабочего регистра и далее с ним можно производить любые действия.
2) Чтобы поместить измененный элемент на его место в запись необходимо: m Используя имя элемента записи в качестве счетчика сдвигов, сдвинуть влево биты элемента записи. m Подготовить исходную запись к вставке измененного элемента путем обнуления битов в записи на месте этого элемента. Это можно сделать путем наложения командой and инвертированной маски элемента записи на исходную запись. m С помощью команды or наложить значение в регистре на исходную запись. В качестве примера рассмотрим листинг, который переопределит поле i2 в записи iotest как 10. Листинг 10.5. Работа с полем записи .386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00; 01101100 .data flag iotest<> .code main: mov al,mask i2; al=01100000 shr al,i2; биты i2 в начале ax al=00000011 and al,0feh;переопределили i2 00000011 and 11111110; ; al=00000010
;помещаем i2 на место shl al,i2; al=0100 0000 mov bl,[flag]; bl=01101100 xor bl,mask i2; сбросили i2 01101100 xor 01100000=00001100=bl or bl,al; наложили 0000 1100 or 0100 0000=0100 1100 ; переопределили i2 mov [flag],bl; записали новое значение записи в память exit: push 0h call ExitProcess end main; конец программы _____________________________________________________ Самостоятельно на практике: Создать следующую запись Iotest2 record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00, i6:3=110,i7:3,i8:2=01. Разработать программу, которая полю i6 присваивает значение 101. Новое значение записи сохранить в памяти.
Дополнительные возможности обработки В ассемблере существуют команды, которые позволяют скрыть от программиста действия по выделению и установке отдельных полей записи. Для установки значения некоторого поля записи используется команда setfield с синтаксисом: setfield имя_ элемента_записи, назначение, регистр_источник Для выборки значения некоторого поля записи используется команда getfield с синтаксисом: getfield имя_элемента_записи, регистр_назначения, источник
Объединения Ассемблер даёт возможность переопределить область памяти для объекта с другими типом и именем с помощью специального типа данных, называемого объединением. Объединение — тип данных, позволяющий трактовать одну и ту же область памяти как имеющую разные типы и имена. При описании объединений в программе сначала описывается шаблон, в котором с помощью директив описания данных перечисляются имена и типы полей: имя_объединения UNION <описание полей> имя_обьединения ENDS Отличие объединений от структур состоит в том, что при определении переменной типа объединения память выделяется в соответствии с размером максимального элемента. Обращение к элементам объединения происходит по их именам, но при этом все поля в объединении накладываются друг на друга. Одновременная работа с элементами объединения исключена. В качестве элементов объединения можно использовать и структуры.
Работа с файлами. Метод работы с файлами в системе MS DOS называется методом описателя или дескриптора. Идея работы с файлами методом описателя в MS DOS заключается в следующем: 1. Вначале файл должен быть открыт, при этом должно быть указано имя файла - либо полное (полный путь), либо краткое. В последнем случае файл берется из текущего каталога. В конце имени файла должен стоять код 0. 2. После того как файл был удачно открыт, ему присваивается описатель - число от 5 до 256 (записывается в регистр АХ). Дальнейшая работа с файлом будет вестись через этот описатель. Под таблицу описателей отводится 20 байт, поэтому программа не может открыть одновременно более 20 файлов.
|
||||
Последнее изменение этой страницы: 2016-09-13; просмотров: 308; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.148.105.131 (0.006 с.) |