- •4) Mov esi,6*2 ; 2 байта – размер элементов
- •Индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
- •Базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
- •Xor ecx,ecx ;обнуление есx
- •Структуры
- •Организовать обращение к элементам структуры.
- •Цепочечные команды или команды обработки строк символов
- •Организация обращения к элементам записи.
- •Работа с записями
- •1) Для выделения элемента записи необходимо:
- •2) Чтобы поместить измененный элемент на его место в запись необходимо:
- •3. В конце работы файл следует закрыть.
- •4. Признаком ошибки при выполнении функции dos является взведенный флаг с (переноса).
- •2. Создание файла с усечением существующего до нулевой длины.
- •LpFileName — указатель на asciiz-строку с именем (путем) открываемого или создаваемого файла;
- •DwDesiredAccess — тип доступа к файлу:
- •3) Создать и открыть новый файл
- •4) Чтение из файла или устройства
- •5) Переместить указатель чтения/записи
- •1) HFile – хэндл того файла, в котором перемещается указатель.
- •7) Запись в файл или устройство
- •8) Закрыть файл
- •9) Удаление файла
- •Функция 01h – ожидание ввода символа с эхопечатью
- •Функция 0ah – получение строки символов
- •1) Создать каталог
- •2) Удалить каталог
- •5) Определить текущий каталог
- •Перечень функций прерывания 21h, работающих с файлами, которые имеют длинные имена и соответствующие функции api Win32.
- •Перечислим функции api Win32, имеющие отношение к работе с файловой системой.
- •1) В Win32 получить время создания, время последнего доступа и время последней модификации файла можно с помощью функции GetFileTime.
- •3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:
- •Обзор прерываний bios
- •Int 10h, функция 0Dh. Чтение пиксела.
- •02H/03h - Чтение/запись секторов.
- •Прямое программирование видеобуфера в текстовом режиме
- •Текстовый режим. Доступ к памяти
- •Организация памяти в графическом режиме 12h
- •Вычисление адреса Пикселя по экранным координатам.
- •Рисование с помощью регистров Графического Контроллера
- •Установка цвета отдельных пикселей.
- •Прокрутка областей экрана, копирование областей экрана.
- •Чтение отдельных пикселей с экрана.
- •Рисование с помощью регистров Указателя Последовательности
- •Установка цвета ячейки пикселей.
1) Для выделения элемента записи необходимо:
-
Поместить запись во временную память — регистр (8-, 16- или 32-битный, в зависимости от размера записи).
-
Получить битовую маску, соответствующую элементу записи, с помощью оператора mask.
-
Локализовать биты в регистре с помощью маски и команды and.
-
Сдвинуть биты элемента к младшим разрядам регистра командой shr. Число разрядов для сдвига получить с использованием имени элемента записи.
В результате этих действий элемент записи будет локализован в начале рабочего регистра и далее с ним можно производить любые действия.
2) Чтобы поместить измененный элемент на его место в запись необходимо:
-
Используя имя элемента записи в качестве счетчика сдвигов, сдвинуть влево биты элемента записи.
-
Подготовить исходную запись к вставке измененного элемента путем обнуления битов в записи на месте этого элемента. Это можно сделать путем наложения командой and инвертированной маски элемента записи на исходную запись.
-
С помощью команды 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 файлов.