Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТ_ОРГ_1.doc
Скачиваний:
29
Добавлен:
18.11.2019
Размер:
1.27 Mб
Скачать

Контрольные вопросы

1 ASCIIZ-строка: назначение, примеры ASCIIZ-строк.

2 Дескриптор файла: для чего предназначен, какими средствами создаётся?

3 Роль флага CF и регистра AX при выполнении операций с файлам.

4 Основные характеристики файла, где MS DOS сохраняет информацию о найденном файле после выполнения операции поиска файла?

5 Что такое PSP и DTA и каким образом эти понятия связаны с предыдущим вопросом?

6 С помощью какой функции MS DOS можно осуществлять операции ввода данных с клавиатуры и чтения из файла?

7 С помощью каких функций MS DOS можно осуществлять вывод данных

на экран?

Теоретическая часть

Язык ассемблера не содержит средства для работы с файлами. Если возникает такая необходимость, то программа должна содержать фрагменты кода, в которых производится обращение к средствам ОС, осуществляющим взаимодействие с файловой системой.

Система функций MS DOS предоставляет пользователю широкие возможности для работы с файлами. Метод работы с файлами в среде MS DOS называется методом описателя или дескриптора. Идея этого метода заключается в следующем:

- в начале файл должен быть открыт, при этом должно быть указано имя файла - либо полное (полный путь), либо краткое. В последнем случае файл берётся из текущего каталога. В конце имени файла должен стоять код «0»;

- после того, как файл был удачно открыт, ему присваивается описатель – двухбайтное число. Дальнейшая работа с файлами будет вестись теперь через этот описатель. В PSP программы, по смещению 18h , находится таблица описателей. Под неё отводиться 20 байт (содержащие FFh соответствуют свободному описателю);

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

Следует знать, что признаком ошибки при выполнении функции DOS является единичное состояние флага переполнения – «С».

Таким образом, при открытии или создании файлов, DOS возвращает в регистр AX описатель файла (в англоязычной терминологии – HANDLE). Все последующие операции с данным файлом следует производить с использованием этого описателя. Удобство такого подхода заключается в том, что стандартным устройствам (на этапе инициализации ПК) также присваиваются свои описатели – от 0 до 4:

  • устройство ввода (клавиатура) – 0;

  • устройство вывода (экран) – 1;

  • устройство для вывода ошибок ( обычно экран ) – 2;

  • последовательный порт (COM1) – 3

  • печатающее устройство ( LPT1) – 4

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

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

При записи в файл данные записываются сначала в буфер и, если только он переполнен, записываются на диск. Таким образом, значительно увеличивается скорость работы с диском.

При закрытии файла содержимое буфера записи сбрасывается на диск, и далее этот буфер может использоваться для работы с другими файлами. Аналогично работает буферизация при чтении из файла. Из вышесказанного понятно, почему при открытии файла необходимо указывать режим работы с файлом (чтение, запись, чтение/запись). Некоторые функции MS DOS для работы с файлами приведены в приложении.

Для закрепления теоретического материала рассмотрим примеры программ.

CSEG segment

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG

org 100h

Begin: mov ax, 3D00h

mov dx, offset File_name ;DS:DX указывают на путь к файлу

int 21h ;открываем

jc Error_file ;если произошла ошибка (нет такого файла, слишком много открытых файлов, ошибка чтения) – то на метку Error_file

mov Handle, ax ;запомним номер файла в переменной Handle

mov bx,ax

mov ah,3Fh ;функция 3Fh – чтение файла

mov cx, 0FF00h ;будем читать 0FF00h

mov dx, offset Buffer DS:DX указывает на буфер в памяти для чтения

int 21h

mov ah,3Eh ;закрываем файл

mov bx, Handle ;номер файла должен быть в BX

int 21h ;закрываем файл

mov dx, offset Mess_ok

Out_prog:

mov ah,9

int 21h

int 20h ;выходим из программы

Error_file:

mov dx, offset Mess_error

jmp Out_prog

; данные

Handle dw 0

Mess_ok db 'Файл загружен в память! Смотрите в отладчике! $'

Mess_error db 'Не удалось открыть (найти) файл'

File_name db ‘c:\msdos.sys’,0,’!$’

Buffer equ $

CSEG ends

end Begin

; комментарий к строке Buffer equ $

Запомните оператор $. При ассемблировании нашей программы Ассемблер заменит этот знак на адрес, по которому он расположен.

Ниже приводится ещё одна программа, которая поможет уяснить, как обрабатываются операции создания файла, записи в файл и закрытия файла в случае возникновения критической ошибки.

DATA SEGMENT

BUF DB “0123456789”

BUFLEN EQU $-BUF

FILENAME DB 'A:\TEST\MN1_FIL.001',0

HANDLE DW ?

TEXT1 DB 'Жду нажатия клавиши’,13,10,’$

TEXT2 DB ‘Файл Создан’,13,10,’$’

TEXT3 DB ‘Произошла ошибка’,13,10,’$’

DATA ENDS

STK SEGMENT

STACK ‘STACK’

DW 128 DUP (0)

STK ENDS

CODE SEGMENT ‘CODE’

ASSUME

CS: CODE, DS:DATA, SS:STK

BEGIN:

MOV AX, DATA

MOV DS, AX

;Переустановить вектор 24h

XOR AX, AX

MOV ES, AX

LEA AX, NEW_24h

MOV ES:[24h*4],AX

MOV ES:[24h*4+2],CS

LEA DX, TEXT1

CALL TOUT

CALL INPUT

;ждём нажатия клавиши

CMP AL ,27

;проверка на нажатие ESC

JZ END

;создадим файл

MOV AH, 3Ch

;функция создания файла

MOV CX, 0

;без атрибутов

LEA DX, Filename

;адрес имени файла

INT 21h

MOV HANDLE, AX

;сохраним описатель файла

LEA DX, TEXT2

CALL TOUT

;запишем строку в файл

INP:

MOV AH, 40h

;функция записи

MOV BX, HANDLE

;дескриптор в ВХ

MOV CX, BUFLEN

;число записываемых байт

MOV DX, OFFSET BUF

;адрес буфера

INT 21h

JNC M1

LEA DX, TEXT3

CALL TOUT

JMP SHORT INP

;повторить операцию записи

;закроем файл

M1:

LEA DX, TEXT1

CALL TOUT

CALL INPUT

MOV AH, 3Eh

;функция закрытия

MOV BX, HANDLE

INT 21h

JNC END

LEA DX, TEXT3

CALL TOUT

JMP SHORT M1

;повторить операцию закрытия

END:

MOV AX, 4C00h

INT 21h

;обработчик прерывания 24h

NEW_24h PROC

MOV AL, 1

IRET

NEW_24H ENDP

;вывод текстовой строки

TOUT PROC

MOV AH, 9

INT 21h

RET

TOUT ENDP

INPUT PROC

MOV AH, 0

INT 16h

RET

INPUT ENDP

CODE ENDS

END BEGIN

Обработчик прерывания INT 24h присваивает AL=1. Это означает, что все операции с файлами обрабатываются одинаково, т.е. повторяются до тех пор, пока не перестанут возникать ошибки (флаг С=1). При других значениях AL операции с файлами обрабатываются по-разному. Это необходимо будет проверить при выполнении данной лабораторной работы.

AL=0 – игнорировать ошибку;

AL=1 – повторить операцию;

AL=2 - снять (завершить через адрес INT 23h);

AL=3 - вернуться в приложение, инициируя сбившуюся функцию;

Следует заметить, что при входе в процедуру обработчик прерывания INT 24h содержит в стеке всю необходимую информацию, чтобы самостоятельно обработать возникшую ситуацию. Структура стека выглядит так:

  1. Адрес возврата в MS DOS (3 слова: IP,CS,Flags). Команда IRET использует эти данные.

  2. Значения регистров перед вызовом INT 21h: АХ,BX,CX,DX,SI,DI,BP,DS,ES.

  3. Адрес возврата к команде INT 21h (3 слова: IP,CS,Flags), т.е. непосредственно в приложение; в регистре флагов – состояние флагов приложения.

Эту информацию можно использовать, чтобы определить сбившуюся функцию (через регистр АН в стеке) и любые параметры (через другие регистры). Кроме того, ваш обработчик INT 24h может восстановить регистры и осуществить возврат непосредственно в прикладную программу.