
- •Архитектура пк
- •Псевдооператоры
- •Режимы адресации и форматы машшиных команд
- •1) Формат "регистр-регистр" (2байта):
- •2) Формат "регистр-память" (2-4 байта):
- •3) Формат "регистр-непосредственный операнд" (3-4 байта):
- •4) Формат "память-непосредственный операнд" (3-6 байтов):
- •Арифметические команды
- •Дисковая память.
- •Ассемблирование и компановка программы
- •Логика и организация программы
- •Операции ввода-вывода на диск
- •Команды пересылки данных
- •Сдвиг и циклические сдвиги
- •Прерывания int
- •Работа с клавиатурой
- •Строковые операции
- •Макроопределения
Операции ввода-вывода на диск
Управление вводом и выводом осуществляется специальными прерываниями. Запись файла на диск требует, чтобы прежде он был "создан" и DOS смогла сгенерировать соответствующий элемент в оглавлении. Когда все записи файла будут записаны, программа должна "закрыть" файл, так, чтобы DOS завершила обработку оглавления. Чтение файла требует, чтобы он был сначала "открыт" для того, чтобы убедиться в его существовании. Так как записи имеют фиксированную длину и в силу соответствующей организации оглавления, обработка записей дискового файла может осуществляться как последовательно, так и произвольно.
Метод доступа к дисковой памяти, поддерживающий использование оглавления, "блокирование" и "разблокирование" записей, обеспечивается прерыванием DOS 21H. Более низкий уровень, обеспечивающий абсолютную адресацию дисковых секторов, также через DOS, выполняется посредством прерываний 25H и 26H. Самый низкий уровень обеспечивается прерыванием BIOS 13H, которое позволяет выполнить произвольную адресацию в дисковой памяти по номеру дорожки и сектора. Методы DOS осуществляют некоторую предварительную обработку до передачи управления в BIOS.
Запись файла на диск
Данные в формате ASCIIZ
Для создания файла необходимо сообщить DOS адрес строки в формате ASCIIZ, содержащей идентификацию файла в виде номера дисковода, пути доступа и имени файла (все параметры необязательные) и строка должна завершаться шестнадцатеричным нулем, например:
PATHNM1 DB 'B:\TEST.ASM',0
PATHNM2 DB 'C:\UTILITY\NU.EXE',0
Обратная косая (или прямая косая) используются в качестве разделителя. Нулевой байт (zero) завершает строку (отсюда название ASCIIZ формата). Для прерываний, использующих в качестве параметра ASCIIZ строку, адрес этой строки загружается в регистр DX, например, командой LEA DX,PATHNM1.
Файловый номер
Операции создания и открытия файла требуют загрузки в регистр AX двухбайтового числа, представляющего собой файловый номер. Стандартные устройства не нуждающиеся в операции открытия и могут использовать непосредственно файловые номера: 0 - ввод, 1 - вывод, 2 - вывод сообщений об ошибках, 3 - внешнее устройство, 4 - принтер.
Для доступа к диску при создании или открытии файла используется ASCIIZ строка и функция 3Ch или 3Dh прерывания DOS INT21h . Успешная операция устанавливает флаг CF в 0 и помещает файловый номер в регистр AX. Этот номер необходимо сохранить в элементе данных DW и использовать его для всех последующих операций над дисковым файлом. При неуспешной операции флаг CF устанавливается в 1, а в регистр AX помещается код ошибки, зависящий от операции.
Создание дискового файла
Для создания нового файла или переписывания старого файла используется функция 3Ch. При этом регистр DX должен содержать адрес ASCIIZ-строки, а регистр CX - необходимый атрибут; для обычного файла значение атрибута - 0.
Рассмотрим пример создания обычного файла:
MOV AH,3CH ; Запрос на создание
MOV CX,00 ; обычного файла
LEA DX,PATHNM1 ; ASCIIZ строка
INT 21H ; Вызов DOS
JC error ; Переход по ошибке
MOV HANDLE1,AX ; Сохранение файлового номера в DW
При правильном открытии операция создает элемент оглавления с данным атрибутом, очищает флаг CF и устанавливает файловый номер в регистре AX. Этот номер должен использоваться для всех последующих операций. Если создаваемый файл уже существует (т.е. имя файла присутствует в оглавлении), то длина этого файла устанавливается в 0 для перезаписи.
В случае возникновения ошибки операция устанавливает флаг CF в 1 и помещает в регистр AX код возврата: 03, 04 или 05. Код 05 свидетельствует либо о переполнении оглавления, либо о защите существующего файла атрибутом "только чтение". При завершении операции необходимо сначала проверить флаг CF, так как при создании файла возможна установка в регистре AX файлового номера 0005, который можно легко спутать с кодом ошибки 05 (нет доступа).
Для записи файла используется функция 40h. При этом в регистре BX должен быть установлен файловый номер, в регистре CX - число записываемых байт, а в регистре DX - адрес области вывода. В следующем примере происходит запись 256 байт из области OUTREC:
HANDLE1 DW ?
OUTREC DB 256 DUP (' ')
MOV AH,40H ; Запрос записи
MOV BX,HANDLE1 ; Файловый номер
MOV CX,256 ; Длина записи
LEA DX,OUTREC ; Адрес области вывода
INT 21H ; Вызов DOS
JC error2 ; Проверка на ошибку
CMP AX,256 ; Все байты записаны?
JNE error3
Правильная операция записывает из памяти на диск все данные (256 байт), очищает флаг CF и устанавливает в регистре AX число действительно записанных байтов. Если диск переполнен, то число записанных байтов может отличаться от заданного числа. В случае неправильной операции флаг CF устанавливается в 1, а в регистр AX заносится код 05 (нет доступа) или 06 (ошибка файлового номера).
После завершения записи файла необходимо установить файловый номер в регистр BX и, используя функцию 3Eh, закрыть файл. Эта операция записывает все оставшиеся еще данные из буфера на диск и корректирует оглавление и таблицу FAT.
MOV AH,3EH ; Запрос на закрытие файла
MOV BX,HANDLE1 ; Файловый номер
INT 21H ; Вызов DOS
В случае ошибки в регистре AX устанавливается код 06 (неправильный файловый номер).
Чтение дискового файла
Если в программе требуется прочитать дисковый файл, то прежде необходимо открыть его, используя функцию 3Dh.
Эта операция проверяет правильность имени файла и его наличие на диске. При открытии регистр DX должен содержать адрес необходимой ASCIIZ-строки, а регистр AL - код доступа:
0 Открыть файл только для ввода
1 Открыть файл только для вывода
2 Открыть файл для ввода и вывода
Обратите внимание, что для записи файла используется функция создания (3Ch), но не функция открытия файла.
Ниже приведен пример открытия файла для чтения:
MOV AH,3DH ; Запрос на открытие
MOV AL,00 ; Только чтение
LEA DX,PATHNM1 ; Строка в формате ASCIIZ
INT 21H ; Вызов DOS
JC error4 ; Выход по ошибке
MOV HANDLE2,AX ; Сохранение номера в DW
Если файл с необходимым именем существует, то открытия устанавливает длину записи равной 1, принимает существующий атрибут, сбрасывает флаг CF и заносит файловый номер в регистр AX. Файловый номер используется в дальнейшем для всех последующих операций.
Если файл отсутствует, то операция устанавливает флаг CF и заносит в регистр AX код ошибки. Не забывайте проверять флаг CF. При успешном создании файла система может установить в регистре AX файловый номер 0005, что легко можно спутать с кодом ошибки 05 (нет доступа).
Для чтения записей файла используется функция 3Fh. При этом необходимо установить в регистре BX файловый номер, в регистре CX - число байтов и в регистре DX - адрес области ввода. В следующем примере происходит считывание 512-байтовой записи:
HANDLE2 DW ?
INPREC DB 512 DUP (' ')
MOV AH,3FH ; Запрос на чтение
MOV BX,HANDLE2 ; Файловый номер
MOV CX,512 ; Длина записи
LEA DX,INPREC ; Адрес области ввода
INT 21H ; Вызов DOS
JC error5 ; Проверка на ошибку
CMP AX,00 ; Прочитано 0 байтов?
JE endfile
Правильно выполненная операция считывает запись в память, сбрасывает флаг CF и устанавливает в регистре AX действительно прочитанных байтов. Нулевое значение в регистре AX обозначает попытку чтения после конца файла. Ошибочная операция устанавливает флаг CF и возвращает в регистре AX код ошибки 05 (нет доступа) или 06 (ошибка файлового номера).
Так как DOS ограничивает число одновременно открытых файлов, то программа, успешно отработавшая с несколькими файлами, должна закрывать их.