Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Типовые алгоритмы для работы с элементами записи.




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 файлов.

В конце работы файл следует закрыть.

Признаком ошибки при выполнении функции DOS является взведенный флаг С (переноса).

Количество одновременно открытых файлов (включая предопределенные файлы) не может превышать 20, хотя количество описателей может быть больше. Поскольку 5 первых описателей всегда открыто, то получается, что можно одновременно открыть не более 15 файлов.

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

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

При открытии выделяются буфера отдельно на чтение и запись. В MS DOS имеется функция 68Н, с помощью которой можно сбрасывать буфера, выделенные для записи, на диск, не закрывая файла. Эту функцию часто используют для того, чтобы обезопасить себя от возможной потери данных. Аналог ее имеется во всех языках высокого уровня.

DOS поддерживает как работу с длинными именами, так и с короткими именами файлов и каталогов.


При открытии или создании файла, DOS возвращает в регистр АХ описатель файла или HANDLE -двухбайтное число. Все операции с данным файлом после этого можно производить, зная только это число.

Стандартным устройствам ввода-вывода по умолчанию присваиваются свои описатели - от 0 до 4. Вот эти описатели:

● STDIN стандартное устройство ввода (клавиатура) - 0,

● STDOUT стандартное устройство вывода (экран) -1,

● STDERR устройство для вывода ошибок (обычно экран) - 2,

● AUX асинхронный порт(СОМ1) - 3,

● PRN печатающее устройство (LPT1) - 4.

Это позволяет перенаправить ввод или вывод с одного устройства на другое.

 

Можно выделить четыре аспекта работы с файлами в программах на ассемблере:

– работа с системой файлового ввода-вывода MS DOS, использующей короткие имена;

– работа с системой файлового ввода-вывода MS DOS, использующей длинные имена (длиной до 255 символов);

– работа с системой файлового ввода-вывода Win 32;

– использование файлов особого вида, поддерживаемых Win 32 — проецированных на память.

 


Функция DOS 3Dh — Открыть существующий файл

Ввод: AH = 3Dh

AL = режим доступа

Биты 0-1: открыть для записи или для чтения

Чтение

Запись

Чтение и запись

Биты 2 – 3: зарезервированы (0)

Биты 6 – 4: режим доступа для других процессов

Режим совместимости (остальные процессы также должны открывать этот файл в режиме совместимости)

Все операции запрещены

Запись запрещена

Чтение запрещено

Запрещений нет

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...