- •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) HFile – хэндл того файла, в котором перемещается указатель.
2) IDistanceToMove – это число символов, на которое необходимо передвинуть указатель файла. Так как тип этого аргумента LONG, то невозможно переместить указатель файла больше, чем на 2*32 байта. Если необходимо передвинуть указатель более чем на 2*32 байта, то в этом случае необходимо воспользоваться третьим аргументом функции, через который можно передать указатель на буфер, содержащий старшие тридцать два разряда требуемого значения.
3) PLONG lpDistanceToMoveHigh – указатель на буфер со старшими 32-мя байтами расстояния для перемещения указателя.
Таким образом, при определении нового значения указателя файла используется следующая формула:
НЗУ=СЗУ+ IDistanceToMove+ * lpDistanceToMoveHigh,
Где НЗУ – новое значение указателя;
СЗУ – старое значение указателя;
Функция SetFilePointer возвращает новое значение указателя файла. В том случае, когда 32 разрядов для этого мало, старшие тридцать два разряда записываются по адресу lpDistanceToMoveHigh.
4) dwMoveMethod определяет точку отсчёта для перемещения указателя файла. Возможные значения этого аргумента следующие:
Функция при успешном завершении возвращает новое значение указателя. Но возможны ещё два случая. Во-первых функция может вернуть значение 0хffffffff, при этом слово, на которое указывает третий аргумент может быть нулевым. Это означает, что при работе функции произошла ошибка. Во-вторых функция может вернуть значение 0хffffffff, при этом слово на которое указывает третий аргумент может быть не равно нулю. В этом случае для того, чтобы определить произошла ли ошибка, необходимо вызвать функцию GetLastError(). Если эта функция вернёт значение, отличное от NO_ERROR, то это будет являться сообщением об ошибке.
7) Запись в файл или устройство
Функция DOS 40h — Запись в файл или устройство
Ввод:
АН = 40h
ВХ = идентификатор
СХ = число байт
DS:DX = адрес буфера с данными
Вывод:
CF = 0 и АХ = число записанных байт, если не произошла ошибка
CF = 1 и АХ = 05h, если доступ запрещен, 06h, если неправильный идентификатор
Если при записи в файл указать СХ = 0, файл будет обрезан по текущему значению указателя. При записи в файл на самом деле происходит запись в буфер DOS, данные из которого сбрасываются на диск при закрытии файла или если их количество превышает размер сектора диска. Для немедленного сброса буфера можно использовать функцию 68h (функция fflush в С).
Пример для DOS 13.2. Прямой доступ к файлу. Модифицируем созданный ранее файл в примере 13.1 MYFILE.txt, содержащий строку “Файл номер 1”, в которой следует заменить 1 на 2а.
; В сегменте команд
; Откроем файл
mov AH,3Dh ;Функция открытия файла
mov AL,2 ;Доступ для чтения-записи
mov DX,offset fname ;Адрес имени файла
int 21h
mov handle,AX ;Сохраним дескриптор
;Установим указатель на байт номер 11
mov AH,42h ;Функция установки указателя
mov AL,0 ;Режим - от начала файла
mov BX,handle ;Дескриптор
mov CX, 0 ;Старшая половина указателя
mov DX, 11 ;Младшая половина указателя
int 21h
;Модифицируем файл
mov AH,40h ;Функция записи
mov BX,handle ;Дескриптор
mov CX,2 ;Число записываемых байтов
mov DX,offset mod ;Отсюда выводить
int 21h
;В сегменте данных
mod db '2a' ;Буфер вывода
handle dw 0 ;Ячейка для дескриптора
fname db 'MYFILE.txt', 0 ;Имя файла в формате ASCIIZ
При модификации будет произведена как замена последнего байта файла, так и увеличения длины файла на 1 байт.
Если необходимо задать положение указателя от конца файла, то для этого в параметрах функции 42h следует указать режим 02, а в регистровую пару CX:DX поместить число -1 (так как мы хотим сместиться на 1 байт влево от конца файла); 32- разрядное число -1 имеет машинное представление FFFFFFFFh. Поэтому строки заполнения регистров СХ и DX будут выглядеть следующим образом:
mov CX,0FFFFh
mov DX,0FFFFh
Пример 13.3. Чтение файла
;В сегменте команд
;Откроем файл
mov AH,3Dh ; Функция открытия файла
mov AL,2 ; Доступ для чтения-записи
mov DX,offset fname ; Адрес имени файла
int 21h
mov handle,AX ; Сохраним дескриптор
; Поставим запрос на чтение 80 байт
mov AH,3Fh ; Функция чтения
mov BX,handle ; Дескриптор
mov cx,80 ; сколько читать
mov DX,offset bufin ; СЮда
int 21h
mov CX,AX ; Сколько реально прочитали
; Выведем прочитанное на экран
mov AH,40h ; Функция записи
mov ВX,1 ; Дескриптор стандартного вывода
mov DX,offset bufin ; Отсюда выводить (СХ байт)
int 21h
; В сегменте данных
bufin db 80 dup (' ') ; Буфер ввода
handle dw 0 ; Ячейка для дескриптора
fname db 'MYFILE.001',0 ; Имя файла в формате ASCIIZ
Чтение файла осуществляется вызовом функции 3Fh, которая требует указания в качестве входных параметров дескриптора источника данных (в регистре ВХ), адреса приемного буфера (в регистрах DS:BX) и количества передаваемых байтов (в регистре СХ). Если мы хотим прочитать все содержимое файла, но не знаем точно его длину, можно в запросе на чтение указать заведомо большее число байтов (не более 65 535). Функция 3Fh сама определит длину файла и прочитает все его содержимое до конца. После возврата из DOS в регистре СХ будет содержаться число фактически прочитанных байтов. В примере содержимое АХ переносится в СХ и используется затем в качестве параметра для функции 40h, с помощью которой прочитанные данные выводятся на экран для контроля.