Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Подпрограммы, работа с файлами через описатели.



Цель. Получить навыки организации подпрограмм и навыки работы с файлами через описатели.

Задание. Разработать программу в соответствии с вариантом задания, работающую с файлами, используя описатели.

Таблица. Варианты заданий

Вариант Задание
Вывести на экран содержимое файла. Имя вводится с клавиатуры, если файл с указанным именем не существует, то выдать соответствующее сообщение.
Произвести копирование одного файла в другой, имена файлов вводятся пользователем с клавиатуры, если файл с указанным именем не существует, то выдать соответствующее сообщение.
Произвести переименование файла. Старое и новое имя вводится с клавиатуры, если файл с указанным именем не существует, то выдать соответствующее сообщение.
Произвести слияние файлов, имена которых вводятся с клавиатуры. Если файлы с указанными именами не существуют, то выдать соответствующие сообщения.
Произвести сравнение файлов, имена которых вводятся с клавиатуры. Если файлы с указанными именами не существуют, то выдать соответствующие сообщения.
Вычислить размер файла и вывести его на экран в десятичной форме. Имя файла вводится с клавиатуры, если файл с указанным именем не существует, то выдать соответствующее сообщение.
Подсчитать количество слов в файле и вывести на экран результат в десятичной форме. Имя файла задается пользователем, если файл с указанным именем не существует, то выдать соответствующее сообщение.
Произвести запись информации из одного файла в другой в обратной последовательности. Имена файлов вводятся с клавиатуры, если файлы с указанными именами не существуют, то выдать соответствующие сообщения.
Произвести запись введенной пользователем с клавиатуры информации в файл, имя которого вводится с клавиатуры.
Подсчитать количество цифр в файле и вывести на экран результат в шестнадцатеричной форме. Имя файла задается пользователем, если файл с указанным именем не существует, то выдать соответствующее сообщение.

 

Теоретические сведения

Подпрограммы

Как уже было сказано выше, программный сегмент может разбиваться на части директивами определения подпрограмм (процедур). Для определения процедур используются две директивы – директива начала PROC и директива конца ENDP. Процедура должна иметь имя, которое включается в обе директивы. В сегменте кода процедуры могут располагаться последовательно, а могут быть вложенными одна в другую. Определение подпрограмм имеет следующий синтаксис:

имя_процедуры PROC параметр

тело_процедуры

имя_процедуры ENDP

 

Передавать фактические параметры процедуре можно несколькими способами. Простейший способ – передача параметров через регистры: основная программа записывает параметры в какие-либо регистры, а процедура по мере необходимости извлекает их из этих регистров и использует в своей работе. Такой способ имеет один основной недостаток: передавать параметры через регистры можно если их немного (если много, то просто не хватит регистров). Решить это проблему можно, передавая параметры через стек. В этом случае основная программа записывает параметры в стек и вызывает подпрограмму, подпрограмма работает с параметрами и, возвращая управление, очищает стек.

Существует несколько разновидностей команды вызова процедуры CALL. Все команды вызова безусловны и используются для передачи управления процедуре. Внутрисегментный вызов NEAR CALL используется для передачи управления процедуре, находящейся в том же сегменте. Межсегментный вызов FAR CALL используется для передачи управления процедуре, находящейся в другом сегменте или даже программном модуле.

Командам CALL соответствуют команды возврата RET. Все возвраты – косвенные переходы, поскольку извлекают адрес перехода из вершины стека. Внутрисегментный возврат извлекает из стека одно слово и помещает его в регистр IP, а межсегментный возврат извлекает из стека два слова, помещая слова из меньшего адреса в регистр IP, а слово из большего адреса – в регистр CS. Оператор RET может иметь операнд, который представляет собой значение, прибавляемое микропроцессором к содержимому указателя стека SP после извлечения адреса возврата.

Ниже приведен пример программы, в которой передача параметров в подпрограмму выполняется через стек.

CODE SEGMENT

...

PROC1 PROC

MOV BP, SP; загрузка в BP текущего адреса стека

MOV BX, [BP+4]; выборка из стека 1 параметра (ca)

...

MOV BX, [BP+2]; выборка из стека 2 параметра (ll)

...

RET 4; Возврат с удалением 4 слов из стека

PROC1 ENDP

START:

...

MOV AX, ’ca’; Загрузка в AX символов

MOV CX, ’ll’; Загрузка в CX символов

PUSH AX; Сохранение AX в стек

PUSH CX; Сохранение CX в стек

CALL PROC1

...

CODE ENDS

 

Работа с файлами

Используется два метода доступа к файлам: метод управляющего блока файла (FCB) и метод дескриптора файла. С помощью метода FCB можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим.

Начиная с DOS версии 2.0, в набор функций прерывания 21h включены UNIX-подобные файловые функции. Идея их состоит в том, что, когда программа открывает файл, DOS возвращает 16-битовое значение «описателя файла» (дескриптора файла) (handle). После этого, когда программа читает, позиционирует, пишет или закрывает файл, она ссылаетесь на него через описатель. Одно из самых больших удобств – то, что можно обращаться к некоторым устройствам так, как будто это дисковые файлы, через зарезервированные описатели DOS:

Таблица.Предопределенные описатели DOS

Handle Наименование и описание
Стандартное устройство ввода (обычно клавиатура)
Стандартное устройство вывода (обычно экран)
Стандартное устройство ошибок (всегда CON - экран. Для сообщений)
Стандартное устройство AUX (асинхронный адаптер; 1-й послед. порт - COM1)
Стандартный принтер (1-й параллельный порт принтера- LPT1)

Ниже приведен перечень наиболее часто используемых функций прерывания 21h для работы с файлами через описатели.

Функция 3cH

Создать файл.

Вход. AH=3ch

DS: DX=адрес строки ASCIIZ с именем файла

CX=атрибут файла

Выход. AX=код ошибки, если CF установлен и описатель файла,

если ошибки нет.

 

Описание. Файл создается в указанном (или умалчиваемом) оглавлении и открывается в режиме доступа «чтение/запись». Если файл уже существует, то при открытии файл усекается до нулевой длины. Если атрибут файла – «только чтение», открытие отвергается (атрибут можно изменить функцией 43H).

 

Функция 5bH

Создать новый файл (не должен существовать).

Вход. AH=5bh

DS: DX=адрес строки ASCIIZ с именем файла

CX=атрибут файла

Выход. AX=код ошибки, если CF установлен и описатель файла,

если ошибки нет

 

Описание. Этот вызов идентичен функции 3ch, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.

 

Функция 5aH

Создать уникальный файл.

Вход. AH=5ah

DS: DX=адрес строки ASCIIZ с путем (заканчивается \)

CX=атрибут файла

Выход. AX=код ошибки, если CF установлен и описатель файла,

если ошибки нет

DS: DX (не изменяется) становится полным

ASCIIZ-именем нового файла.

 

Описание. Открывает (создает) файл с уникальным именем в оглавлении, указанном строкой ASCIIZ, на которую указывает DS: DX. Описание пути должно быть готово к присоединению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. После возврата строка DS: DX будет дополнена именем файла. DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Если имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя.

 

Функция 3dH

Открыть файл.

Вход. AH=3dh

DS: DX=адрес строки ASCIIZ с именем файла

AL=режим открытия

Выход. AX=код ошибки, если CF установлен и описатель файла,

если ошибки нет

 

Описание. В момент открытия файл должен существовать. Файл открывается в выбранном режиме доступа (AL = 0 – для чтения; AL = 1 – для записи; AL = 2 – для чтения и записи) и указатель «чтения/записи» устанавливается в 0.

 

Функция 3eH

Закрыть файл.

Вход. AH=3eh

BX=описатель файла

Выход. AX= код ошибки, если CF установлен

 

Описание. BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфер сбрасываются, а оглавление обновляется корректными размером, временем и датой.

 

Функция 41H

Удалить файл.

Вход. AH=41h

DS: DX=адрес строки ASCIIZ с именем файла

Выход. AX=код ошибки, если CF установлен

 

Описание. Имя файла не может содержать обобщенные символы («? » и «*»). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H.

 

Функция 42H

Установить указатель чтения/записи (можно также узнать размер файла).

Вход. AH=42h

BX=описатель файла

CX: DX=смещение указателя: (CX * 65536) + DX

AL=0 переместить к началу файла + CX: DX

AL=1 переместить к текущей позиции + CX: DX

AL=2 переместить к концу файла - CX: DX

Выход. AX=код ошибки, если CF установлен

DX: AX=новая позиция указателя файла (если нет

ошибки)

 

Описание. Перемещает логический указатель чтения/записи к нужному адресу, с которого начнется очередная операция чтения или записи. Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX: AX. DX здесь старшее значащее слово: действительная длина (DX * 65536) + AX.

 

Функция 3fH

Читать из файла/устройства.

Вход. AH=3fh

BX=описатель файла

DS: DX=адрес буфера для чтения данных

CX=число считываемых байт

Выход. AX=код ошибки, если CF установлен

AX=число действительно прочитанных байт

 

Описание. CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS: DX.

Всегда необходимо сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

- если AX=CX, (и CF сброшен) – чтение было корректным без ошибок;

- если AX=0 – достигнут конец файла (EOF);

- если AX< CX (но ненулевой), то возможны два варианта: при чтении с устройства – входная строка имеет длину AX байт; при чтении из файла – в процессе чтения достигнут EOF.

Функция 40H

Писать в файл/устройство.

Вход. AH=40h

BX=описатель файла

DS: DX=адрес буфера, содержащего данные

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

Выход. AX=код ошибки, если CF установлен

AX=число действительно записанных байт

 

Описание. CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS: DX и записываются, начиная с текущей позиции указателя чтения/записи файла. Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи): если AX = CX, запись была успешной; если AX < CX, встретилась ошибка (скорее всего, переполнение).

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

x x A D V S H R

R- только чтение (нельзя обновлять или удалять);

H- скрытый;

S- системный;

V- метка тома;

D- элемент подоглавления;

A- архивный;

x- не используются.

 

ASCIIZ строка, содержащая имя файла, имеет вид:

«‘d: \путь\имя_файла’, 0»

 

Если диск и/или путь опущены, они принимаются по умолчанию. После вызова функции описатель файла должен быть сохранен для последующих операций. Количество описателей в системе регламентируется файлом CONFIG.SYS.

Приведенный ниже пример иллюстрирует процесс работы с файлом через описатели в ассемблерной программе.

; Создание файла

MOV AH, 3CH

MOV CX, 0

LEA DX, BUF; DS: DX – адрес ASCIIZ строки с именем

INT 21H

JC NO_CREATE; Проверка флага переноса

...; Работа с файлом

NO_CREATE:

...

BUF DB ‘d: \Users\1.txt’, 0

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-08-31; Просмотров: 607; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.043 с.)
Главная | Случайная страница | Обратная связь