Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Подпрограммы, работа с файлами через описатели.
Цель. Получить навыки организации подпрограмм и навыки работы с файлами через описатели. Задание. Разработать программу в соответствии с вариантом задания, работающую с файлами, используя описатели. Таблица. Варианты заданий
Теоретические сведения Подпрограммы Как уже было сказано выше, программный сегмент может разбиваться на части директивами определения подпрограмм (процедур). Для определения процедур используются две директивы – директива начала 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
Ниже приведен перечень наиболее часто используемых функций прерывания 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, встретилась ошибка (скорее всего, переполнение). Некоторые функции в качестве параметра используют атрибут файла. Атрибут - это один байт битовых флагов, связанный с каждым файлом и находящийся в элементе оглавления для файла. В атрибуте определены следующие биты:
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; Нарушение авторского права страницы