![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 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; просмотров: 274; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.116.56 (0.014 с.) |