Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Питер Абель. Ассемблер и программирование для IBM PC.doc
Скачиваний:
108
Добавлен:
02.05.2014
Размер:
2.4 Mб
Скачать

Глава 18 Дисковая память IV: Функции bios

__________________________________________________________________________

Ц е л ь: Показать основные требования к программированию функций bios

для создания и чтения дисковых файлов.

ВВЕДЕНИЕ

________________________________________________________________

Для дисковых операций можно программировать непосредственно на уровне

bios, хотя bios и не обеспечивает автоматически использование оглавления

или блокирование/деблокирование записей. Дисковая операция bios int 13h

рассматривает все "записи", как имеющие размер сектора, а адресацию диска

осуществляет в терминах действительных номера дорожки и номера сектора.

Для дисковых операций чтения, записи и верификации необходима

инициализация следующих регистров:

ah Определяет тип операции: чтение, запись, верификация или

форматирование.

al Определяет число секторов.

ch Определяет номер дорожки.

cl Определяет номер начального сектора.

dh Номер головки (стороны) : 0 или 1 для дискеты.

dl Номер дисковода: 0=a, 1=b и т.д.

es:bx Адрес буфера ввода/вывода в области данных (за исключением

операции верификации).

ДИСКОВЫЕ ОПЕРАЦИИ В bios

________________________________________________________________

Для указания необходимой дисковой операции необходимо перед int 13h

загрузить в регистр ah соответствующий код.

ah = 00: Сброс системы контролера дисковода

---------------------------------------------

Данная операция осуществляет полный сброс контролера дисковода и

требует для выполнения int 13h загрузку в регистр ah значение шест.00.

Операция используется в случаях, когда после других дисковых операций

возвращается код серьезной ошибки.

ah = 01: Определить состояние дисковода

-----------------------------------------

Данная операция возвращает в регистре al состояние дисковода после

последней операции ввода/вывода (см.Байт состояния в следующем разделе).

Операция требует только загрузки значения 01 в регистр ah.

ah = 02: Чтение секторов

--------------------------

Данная операция выполняет чтение в память определенного числа

секторов на одной дорожке. Число секторов обычно 1, 8 или 9. Адрес памяти

для области ввода должен быть загружен в регистр bx, причем следует

помнить, что реальный адрес зависит от содержимого регистра ex, так как в

данном случае используется регистровая пара es:bx. В следующем примере

выполняется чтение сектора в область insect, которая должна быть

достаточно большой, чтобы вместить все данные:

mov ah,02 ;Запрос на чтение

mov al,01 ; один сектор

lea bx,insert ;Буфер ввода в es:bx

mov ch,05 ;Дорожка 05

mov cl,03 ;Сектор 03

mov dh,00 ;Сторона (головка) 00

mov dl,01 ;Дисковод 01 (b)

int 13h ;Вызов bios

Число действительно прочитанных секторов возвращается в регистре al.

Регистры ds, bx, cx и dx сохраняют свои значения.

В большинстве случаев программа указывает только один сектор или все

сектора на дорожке. Для последовательного чтения секторов программа должна

увеличивать содержимое регистров ch и cl. Заметьте, что когда номер

сектора достигает максимального значения, его необходимо сбросить в 01, а

номер дорожки увеличить на 1 или изменить сторону 0 на 1 (для

двухсторонних дискет).

ah = 03: Запись секторов

--------------------------

Данная операция записывает данные из указанной области памяти (обычно

512 байтов или кратное 512) в один или несколько определенных секторов.

Управляющая информация загружается в регистры аналогично операции чтения

диска (код 02). Операция записи возвращает в регистре al число секторов,

которые действительно были записаны. Регистры dx, bx, cx и dx сохраняют

свои значения.

ah = 04: Верификация сектора

------------------------------

Данная операция проверяет, может ли быть найден указанный сектор, и

выполняет своего рода контроль на четность. Операцию можно использовать

после записи (код 03) для гарантии более надежного вывода, на что

потребуется дополнительное время ввода/вывода. Значения регистров

устанавливаются аналогично операции записи (код 03), за исключением

регистровой пары es:bx - их инициализация не требуется. Операция

возвращает в регистре al число обработанных секторов. Регистры dx, bx, cx

и dx сохраняют свои значения.

ah = 05: Форматирование дорожек

---------------------------------

Данная операция используется для форматирования определенного числа

дорожек в соответствии с одним из четырех размеров (стандарт для системы

pc - 512). Операции чтения и записи для локализации требуемого сектора

требуют информацию о формате. Для форматирования регистровая пара es:bx

должна содержать адрес, который указывает на группу адресных полей для

дорожки. Для каждого сектора на дорожке должен быть четырехбайтовый

элемент в виде t/h/s|b, где

t номер дорожки,

h номер головки,

s номер сектора,

b число байт на секторе, (00-128, 01-256, 02-512, 03-1024).

Например, для форматирования 03 дорожки, на стороне 00 и 512 байтов

на сектор, первый элемент должен иметь значение шест.03000102 и за ним

должны быть описаны элементы для остальных секторов на дорожке.

Техническое руководство по at содержит ряд дополнительных операций bios.

БАЙТ СОСТОЯНИЯ

________________________________________________________________

Для всех рассмотренных выше операций (02, 03, 04 и 05) в случае

нормального завершения флаг cf и регистр ah содержит 0. В случае ошибки

флаг cf устанавливается в 1, а регистр ah содержит код состояния,

идентифицирующий причину ошибки. Код состояния аналогичен значению в

регистре al после выполнения операции 01.

ah Причина

0000 0001 Ошибка команды для дискеты

0000 0010 Не найден адресный маркер на диске

0000 0011 Попытка записи на защищенный диск

0000 0100 Не найден сектор

0000 1000 Выход за границы dma (памяти прямого доступа)

0000 1001 Попытка доступа через границу 64k

0001 0000 Чтение сбойный участок на диске

0010 0000 Ошибка контролера дисковода

0100 0000 Ошибка установки (поиска)

1000 0000 Ошибка оборудования

В случае возникновения ошибки, обычным действием является сброс диска

(ah=00) и троекратное повторение операции. Если таким образом ошибка не

устраняется, то на экран выводится соответствующее сообщение и

пользователь может сменить дискету.

ПРОГРАММА: ИСПОЛЬЗОВАНИЕ bios ДЛЯ ЧТЕНИЯ СЕКТОРОВ

________________________________________________________________

__________________________________________________________________________

title bioread (com) Чтение дискового сектора через bios

codesg segment para 'code'

assume cs:codesg,ds:codesg,ss:codesg,es:codesg

org 100h

begin jmp main

; ---------------------------------------------------------

recdin db 512 dup(' ') ;Область ввода

endcde db 00

curadr dw 0304h ;Начало (дорожка/сектор)

endadr dw 0501h ;Конец (дорожка/сектор)

readmsg db '*** read error ***$'

side db 00

; ---------------------------------------------------------

main proc near

mov ax,0600h ;Функция прокрутки экрана

a20loop:

call q10scr ;Очистить экран

call q20curs ;Установить курсор

call c10addr ;Определить адрес на диске

mov cx,curadr

mov dx,endadr

cmp cx,dx ;Последний сектор?

je a90 ; да - выйти

call f10read ;Получить дисковую запись

cmp endcde,00 ;Ошибка чтения?

jnz a90 ; да - выйти

call g10disp ;Вывести сектор на экран

jmp a20loop ;Повторить

a90 ret ;Завершить программу

main endp

; Вычислить следующий адрес на диске:

; ----------------------------------

c10addr proc near

mov cx,curadr ;Последняя дорожка/сектор

cmp cl,10 ;Последний сектор?

jne c90 ; нет - выйти

cmp side,00 ;Обойти, если сторона = 0

je c20

inc ch ;Увеличить номер дорожки

c20:

xor side,01 ;Сменить сторону

mov cl,01 ;Установить сектор = 1

mov curadr,cx

c90: ret

c10addr endp

; Чтение дискового сектора:

; ------------------------

f10read proc near

mov al,01 ;Число секторов

mov ah,02 ;Функция чтения

lea bx,recdin ;Адрес буфера

mov cx,curadr ;Дорожка/сектор

mov dh,side ;Сторона

mov dl,01 ;Дисковод b

int 13h ;Выполнить ввод

cmp ah,00 ;Ошибка чтения?

jz f90 ; нет - выйти

mov endcde,01 ; да -

call x10err ; ошибка чтения

f90:

inc curadr ;Увеличить номер сектора

ret

f10read endp

; Вывод сектора на экран:

; ----------------------

g10disp proc near

mov ah,40h ;Функция вывода на экран

mov bx,01 ;Номер устройства

mov cx,512 ;Длина

lea dx,recdin

int 21h

ret

g10disp endp

; Очистка экрана:

; --------------

q10scr proc near

mov ax,0600h ;Полный экран

mov bh,1eh ;Установить цвет

mov cx,0000 ;Функция прокрутки

mov dx,184fh

int 10h

ret

q10scr endp

; Установка курсора:

; -----------------

q20curs proc near

mov ah,02 ;Функция установки

mov bh,00 ; курсора

mov dx,0000

int 10h

ret

q20curs endp

; Вывод сообщения об ошибке на диске:

; ----------------------------------

x10err proc near

mov ah,40h ;Функция вывода на экран

mov bh,01 ;Номер устройства

mov cx,18 ;Длина сообщения

lea dx,readmsg

int 21h

ret

x10err endp

codesg ends

end begin

__________________________________________________________________________

Рис.18.1. Использование bios для чтения дискового файла.

Рассмотрим программу, приведенную на рис.18.1, в которой используется

команда bios int 13h для чтения секторов диска. Программа базируется на

примере, приведенном на рис.16.3, со следующими изменениями:

1. Отсутствует описание fcb и подпрограмма открытия.

2. Программа расчитывает каждый дисковый адрес. После каждого

чтения происходит увеличение номера сектора. При достижении номера

сектора 10 процедура c10addr сбрасывает это значение в 01. Если номер

стороны = 1, программа увеличивает номер дорожки; затем меняется

номер стороны: 0 на 1 и 1 на 0.

3. Область curadr содержит начальные значения номеров дорожки и

сектора (их программа увеличивает), а область endadr - конечные

значения. Один из способов улучшения программы - предоставить

пользователю возможность указать начальные и конечные номера дорожки

и сектора с помощью соответствующего запроса.

Выполните данную программу под управлением отладчика debug.

Проделайте трассировку команд, которые инициализируют сегментные регистры,

и установите начальный и конечный номера секторов для файловой таблицы fat

(расположение таблицы fat различно в разных версиях операционной системы).

Используя команду g (до) для выполнения ввода с диска и проверки

считанного содержимого таблицы fat и элементов оглавления.

В качестве альтернативы отладчику debug можно преобразовать

ascii-символы в области ввода в их шест. эквиваленты и выдать на экран эти

значения, как это делает отладчик debug (см. программу на рис.14.5). Таким

образом можно проверить содержимое любого сектора (в том числе

"спрятанного"), а также предоставить пользователю возможность внести

изменения и записать измененный сектор на диск.

Следует помнить, что при создании файла dos может вносить записи на

любые доступные сектора, которые не обязательно будут смежными на диске.

Следовательно, с помощью команды bios int 13h нельзя выполнить

последовательное чтение файла.

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ

________________________________________________________________

- Команда bios int 13h обеспечивает прямой доступ к дорожкам и

секторам диска.

- Команда bios int 13h не поддерживает операции с оглавлением,

обнаружение конца файла, блокирование и деблокирование записей.

- Верификация сектора выполняет элементарную проверку записанных

данных, что приводит к увеличению времени обработки.

- Проверяйте байт состояния после каждой дисковой операции через

bios.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ

________________________________________________________________

18.1. Напишите команды для сброса дискового контролера.

18.2. Напишите команды для чтения байта состояния дискеты.

18.3. Напишите команды для bios int 13h, выполняющие чтение одного

сектора в область памяти indisk, с дисковода a, головки 0, дорожки 6 и

сектора 3.

18.4. Напишите команды для bios int 13h, выполняющие запись трех

секторов из области памяти outdisk, на дисковод b, головку 0, дорожку 8 и

сектор 1.

18.5. При записи данных в вопросе 18.4, как можно распознать попытку

записи на защищенный диск?

18.6. На основе вопроса 18.4 напишите команды контроля записи

(операция верификации).