- •Глава 14 Элементы программирования на языке ассемблера После изучения данной главы вы должны знать:
- •Основные компоненты языка ассемблер Алфавит языка
- •Константы (числа и строки) Числа — только целые
- •Строки (литералы)
- •Команды (операторы)
- •Директивы (псевдооператоры)
- •Модификаторы
- •Адресация регистров и ячеек памяти в ассемблере
- •Непосредственная адресация
- •Прямая адресация регистров мпп
- •Адресация ячеек оп
- •Основные команды языка ассемблер
- •Команды пересылки данных
- •Арифметические команды
- •Команды сложения, вычитания и сравнения
- •Команды приращения
- •Команды умножения
- •Команды деления
- •Логические команды
- •Команды безусловной передачи управления
- •Команды перехода к подпрограмме и выхода из подпрограммы
- •Команда перехода к подпрограмме: call opr
- •Команда выхода из подпрограммы
- •Команды условной передачи управления
- •Команды условной передачи управления для беззнаковых данных
- •Команды условной передачи управления для знаковых данных
- •Команды условной передачи управления для прочих проверок
- •Команды управления циклами
- •Команды прерывания
- •Основные директивы ассемблера
- •Директивы определения идентификаторов
- •Директивы определения данных
- •Директивы определения сегментов и процедур
- •Видеооперации с прерыванием 21h dos
- •Программирование работы с клавиатурой
- •Программирование работы с принтерами
- •Печатающие устройства параллельного типа
- •Печатающие устройства последовательного типа
- •Программирование работы с файлами
- •Прерывания, используемые при работе с файлами на дисках
- •Некоторые аспекты создания исполняемых программ
- •Процедуры формирования программы
- •Структура программы на языке ассемблера для получения исполняемого файла формата exe
- •Основные сведения о листинге и его структуре
- •Особенности структуры машинных команд
- •Последовательность работы пк при выполнении программы
- •Краткие сведения об отладчике программ debug
- •Основные команды отладчика debug
- •Вопросы для самопроверки
Прерывания, используемые при работе с файлами на дисках
Прерывания BIOS:
13Н — обмен данными с жестким диском (при его отсутствии — с гибким диском);
40Н — обмен данными с гибким диском (если есть жесткий диск).
Эти прерывания обеспечивают выполнение многих функций, определяемых содержимым регистра AH, и полезных при разработке вспомогательных программ и средств защиты от копирования, поскольку они позволяют выполнять операции с отдельными дорожками и секторами диска.
Прерывание DOS 21H.
Имеется несколько десятков различных вариантов прерывания 21Н (определяемых содержимым регистра AH), реализующих так называемые универсальные функции управления файлами при наличии любых версий MS DOS (использующих при обращении к файлам FСB) и несколько десятков вариантов прерывания, предоставляющих так называемые расширенные функции управления файлами при наличии версии MS DOS 2.0 и выше (через строку ASCIIZ).
Ниже обсуждаются лишь наиболее популярные варианты прерывания 21H DOS, реализующие расширенные функции управления файлами.
При прерываниях этого типа файл полностью идентифицируется ASCIIZ-строкой, а после открытия файла — логическим номером, присваиваемым файлу при его создании и открытии (после закрытия файла его логический номер освобождается).
Вот сводка некоторых служебных функций DOS прерывания 21Н.
AH = 3Ch — создание файла: формируются ASCIIZ-строка, идентифицирующая файл, и атрибут файла; вектор-адрес ASCIIZ-строки файла помещают в регистры DS:DX, в регистр CX помещают атрибут файла; в регистре AX возвращается логический номер файла.
AH = 3Dh — открытие файла: вектор-адрес ASCIIZ-строки помещают в регистры DS:DX, в регистр AL записывается признак возможной работы с файлом (AL = 0 — файл открывается только для чтения, AL = 1 — только для записи, AL = 2 — и для чтения, и для записи); в регистре AX возвращается логический номер файла.
AH = 3Eh — закрытие файла (высвобождение его логического номера): логический номер помещают в регистр ВX.
AH = 3Fh — чтение из файла: в регистр BX помещают логический номер, в CX — число считываемых байтов, в DS:DX — вектор-адрес буфера (поля ОЗУ), отведенного для записи считываемой информации; число фактически считанных байтов возвращается в регистре AX.
AH = 40h — запись в файл: в регистр BX помещают логический номер, в CX — число записываемых байтов, в DS:DX — вектор-адрес буфера (поля ОЗУ), хранящего записываемую информацию; в AX возвращается число фактически записанных байтов.
AH = 41h — удаление файла: в регистры DS:DX заносится вектор-адрес ASCIIZ-строки файла.
AH = 42h — установка указателя текущей записи в файле: в регистр BX заносится логический номер, в регистр AL — указание на базовую установку указателя текущей записи (AL = 0 — начало файла, AL = 1 — прежнее значение текущей записи, AL = 2 — конец файла), в регистры CX:DX — смещение указателя относительно базовой позиции (чаще всего 0); в регистрах DX:AX возвращается смещение текущей записи файла относительно начала файла.
AH = 43h — установка новых атрибутов файла: в регистры DS:DX заносится адрес ASCIIZ-строки файла, в CX — значения атрибутов, в AL находится «1» (если в AL — «0», то происходит чтение атрибутов, которые возвращаются в CX).
AH = 56h — переименование файла: в регистровой паре DS:DX указывается адрес ASCIIZ-строки со старым именем файла, в регистры ES:DI заносится адрес ASCIIZ-строки с новым именем файла.
Во всех перечисленных случаях при появлении ошибки в выполнении процедуры в регистре FL флаг CF устанавливается в «1»; код ошибки возвращается в регистре AX.
Ниже приводятся фрагменты программ работы с файлами по ASCIIZ-строке:
path db C:filename.ext, 0 ; ASCIIZ-строка
buf db 1000 dup(?) ; буфер обмена
handle dw ? ; логический номер
size dw ? ; размер файла
Чтение из файла:
; Открытие файла
mov DX, offset path ; адрес ASCIIZ-строки в DX
mov AL, 0 ; открываем только для чтения
mov AH, 3DH ; функция открытия файла
int 21H ; выполнение прерывания
jc open_error ; если CF=1, обработка ошибки открытия файла
mov handle, AX ; запись логического номера
Определение размера файла:
mov AH, 42H ; установка указателя текущей позиции
mov AL, 2 ; код установки в конец файла
mov BX, handle ; запись логического номера
mov CX, 0 ; смещение = 0
mov DX, 0 ; смещение = 0
int 21H ; выполнение прерывания
jc point_error1 ; если CF=1, обработка ошибки установки указателя
mov size, AX ; запись размера файла
Установка указателя в начало файла:
mov AH, 42H ; установка указателя текущей позиции
mov AL, 0 ; код установки в начало файла
mov CX, 0 ; смещение = 0
mov DX, 0 ; смещение = 0
int 21H ; выполнение прерывания
jc point_error2 ; если CF=1, обработка ошибки установки указателя
Чтение файла:
mov AH, 3FH ; функция чтения из файла
mov BX, handle ; запись логического номера
mov CX, size ; запись размера файла
mov DX, offset buf ; запись адреса буфера обмена
int 21H ; выполнение прерывания
jc read_error ; если CF=1, обработка ошибки чтения из файла
Закрытие файла:
mov BX, handle ; запись логического номера
mov AH, 3EH ; функция закрытия файла
int 21H ; выполнение прерывания
jc close_erro r ; если CF=1, обработка ошибки закрытия файла
Запись в файл:
Полная перезапись файла.
; Открытие (создание) файла
mov DX, offset path
mov CX, 0
mov AH, 3CH
int 21H
jc open_error
mov han, AX
; Запись в файл 500 байтов
mov AH, 40H
mov BX, handle
mov CX, 500
mov DX, offset buf
int 21H
jc write_error
Добавление записей в файл.
; Открытие файла
mov DX, offset path
mov AL, 1
mov AH, 3DH
int 21H
jc open_error
mov handle, AX
; Перемещение указателя в конец файла
mov BX, AX
mov CX, 0
mov DX, 0
mov AL, 2
mov AH, 42H
int 21H
jc point_error
; Запись в файл 300 байтов
mov AH, 40H
mov BX, handle
mov CX, 300
mov DX, offset buf
int 21H
jc write_error