mov bx,0Fh ; белым по черному
mov cx,1 ; один символ
int 10h
retf
;----------------------------------------------------------------------
end main
ГУАП
КАФЕДРА № 44
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
А.Б. Бубликов |
|||
должность, уч. степень, звание |
подпись, дата |
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4 |
Работа с дисководом |
по курсу: ИНТЕРФЕЙСЫ ПЕРИФЕРИЙНЫХ УСТРОЙСТВ |
РАБОТУ ВЫПОЛНИЛ(А)
СТУДЕНТ(КА) ГР. |
В8441 |
Тарасов Р.С. |
|||
подпись, дата |
инициалы, фамилия |
Санкт-Петербург 2011
С помощью прерываний BIOS получить состояния дисковода, вывести на экран результат. Получить с клавиатуры сектор и данные для записи. Записать данные в заданный сектор. Получить с клавиатуры сектор — прочитать его и вывести результат на экран.
Ниже перечислены использованные функции INT 13H стандартного дискового ввода-вывода:
AH сервис
--- ----------------------------------------------------------------------------
01H прочитать состояние диска
вход: DL = диск. DL < 80H = дискета; DL > 7FH = твердый диск
выход: AL содержит состояние диска
--- ----------------------------------------------------------------------------
02H читать секторы
вход: DL = номер диска (0=диск A...; 80H=тв.диск 0; 81H=тв.диск 1)
DH = номер головки чтения/записи
CH = номер дорожки (цилиндра)(0-n)
CL = номер сектора (1-n)
На сектор и цилиндр отводится соответственно 6 и 10 бит: старшие два бита CL используются как старшие биты номера цилиндра.
AL = число секторов (в сумме не больше чем один цилиндр)
ES:BX => адрес буфера вызывающей программы
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
ES:BX буфер содержит данные, прочитанные с диска
--- ----------------------------------------------------------------------------
03H писать секторы
вход: (аналогично подфункции 02H)
ES:BX => данные, записываемые на диск.
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
--- ----------------------------------------------------------------------------
08H ¦AT¦ ¦XT¦ дать параметры диска. возвращает информацию об устройстве.
вход: DL = диск
выход: DL = число тв. дисков на первом контроллере
DH = максимальный номер головки
CH = максимальный номер цилиндра (младшие 8 бит)
CL = максим. номер сектора (и старшие биты макс. номера цилиндра)
--- ----------------------------------------------------------------------------
Текст программы:
.MODEL SMALL
.STACK 100h
.DATA
Message1 DB 'Программа демонстрирует работу с контроллером дисковода',13,10,'$'
Message2 DB 'Текущий статус дисковода: ','$'
Message3 DB 'Введите номер цилиндра [0-','$'
Message4 DB ']: ','$'
Message5 DB 'Введите номер головки [0-','$'
Message6 DB 'Введите номер сектора [1-','$'
Message7 DB 'Введите 512 шестнадцатеричных байт для записи в сектор,',13,10
DB 'при вводе более двух цифр будут учтены две младшие:',13,10,'$'
Message8 DB 'Введите адрес сектора для записи:',13,10,'$'
Message9 DB 'Введите адрес сектора для чтения:',13,10,'$'
zero DW 0
head DB ?
cyl DB 2 dup(?)
sec DB ?
buf DB 512 dup (?)
.CODE
main:
; подготовительные действия
mov ax,@Data ; устанавливаем регистры DS и ES,
mov ds,ax ; чтобы они указывали на сегмент данных
mov es,ax
mov ah,09h
lea dx,Message1
int 21h ; выводим заголовок программы
; запрашиваем параметры дисковода для использования в качестве ограничений
push es
mov ah,8 ; запрашиваем параметры устройства
mov dl,0 ; дисковод A:
mov di,offset zero ; компенсируем известную ошибку BIOS
int 13h
mov head,dh ; фиксируем количество головок
push cx
mov cyl+1,ch ; вычисляем и фиксируем
shr cl,6 ; количество цилиндров
mov cyl,cl
pop cx
and cl,3Fh ; фиксируем количество секторов
mov sec,cl
pop es
; запрашиваем и выводим состояние дисковода
mov ah,09h
lea dx,Message2
int 21h ; выводим сообщение о состоянии
mov ah,1 ; запрашиваем состояние дисковода
mov dl,0
int 13h
mov al,ah
call OutHex ; выводим состояние дисковода
mov dl,0ah
mov ah,02
int 21h ; выводим перевод строки
; вводим значения буфера для записи в сектор дискеты
mov ah,09h
lea dx,Message7
int 21h ; выводим приглашение на ввод буфера
mov cx,512 ; предельное количество вводимых чисел
lea di,buf ; смещение буфера для цепочечной команды
cld ; сбрасываем флаг, направление слева-направо
input: ; цикл ввода значений
call InHex ; вводим значение
stosb ; размещаем очередной элемент буфера
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.