Разработка программы записи информации на гибкий диск
Содержание
1. Постановка задачи
. Описание программы
. Теория вопроса
. Описание используемых
функций
. Блок-схема программы
. Текст программы
Список литературы
1. Постановка задачи
Разработать программу, осуществляющую запись информации в указанное место
(головка, дорожка, сектор) гибкого диска.
2. Описание программы
После запуска программа спрашивает оператора о номере головки, дорожки и
сектора гибкого диска, куда нужно произвести запись. При указании неправильного
номера выводится сообщение об ошибке. При удачном вводе программа запрашивает
текстовую информацию, которая вводится с клавиатуры. При нажатии клавиши Enter программа закрывается.
3. Теория вопроса
Метод доступа к дисковой памяти, поддерживающий использование оглавления,
"блокирование" и "разблокирование" записей, обеспечивается
прерыванием DOS 21H. Более низкий уровень, обеспечивающий абсолютную адресацию
дисковых секторов, также через DOS, выполняется посредством прерываний 25H и
26H. Самый низкий уровень обеспечивается прерыванием BIOS 13H, которое
позволяет выполнить произвольную адресацию в дисковой памяти по номеру дорожки
и сектора Для дисковых операций можно программировать непосредственно на уровне
BIOS, хотя BIOS и не обеспечивает автоматически использование оглавления или
блокирование/деблокирование записей. Дисковая операция BIOS INT 13H
рассматривает все "записи", как имеющие размер сектора, а адресацию
диска осуществляет в терминах действительных номера дорожки и номера сектора.
Для дисковых операций чтения, записи и верификации необходима
инициализация следующих регистров:Определяет тип операции: чтение, запись,
верификация или форматирование.Определяет число секторов.Определяет номер
дорожки.Определяет номер начального сектора.Номер головки (стороны) : 0 или 1
для дискеты.Номер дисковода: 0=A, 1=B и т.д.:BX Адрес буфера ввода/вывода в
области данных (за исключением операции верификации).
4. Описание используемых функций
дисковый
верификация память адресация
Функция 03h прерывания 13h - запись на диск.
Функция 08h прерывания 13h - получить информацию о носителе.
Функция 00h прерывание 16h - ожидание нажатия клавиши.
Функция 08h прерывание 21h - Ввод с клавиатуры без эха с проверкой
Ctrl/Break.
Функция 09h прерывание 21h - Вывод строки символов на экран.
Функция 4сh прерывание 21h - Завершение подпроцесса с возвратом
управления.
5. Блок-схема программы
Блок-схема программы представлена на рис.1
Рис.
1. Блок-схема программы
6. Текст программы
model small
.stack
.data1
db 'номер головки, 0 или 1',13,10,'$'
headdb
0
mes2 db 'номер дорожкиб максимум
80',13,10,'$'db 0db 'номер сектораб максимум 18',13,10,'$'0db 'неправильное
значение',13,10,'$'db 'неизвесный тип дискеты',13,10,'$'db 'неизвестная
ошибка',13,10,'$'db 'дисск защищен от записи',13,10,'$'db 'Сектор не
найден',13,10,'$'db 'повреждена таблица параметров дисковода',13,10,'$'a db
'обнаружен дефектный сектор',13,10,'$'b db 'обнаружена дефектная
дорожка',13,10,'$'c db 'нестандартный формат носителя или дорожки',13,10,'$'db
'всё нормально',13,10,'$'db 'не мешало бы вставить дискету!!!',13,10,'$'
meseos db '',13,10,'$'db 'write please:',13,10,'$'
message db 512 dup (0)
.code
.startupah, 08h ; 8-я функция 13-го прерывания - получить информацию о
носителеdl, 0 ; в dl - номер диска (0-A, 1-B b и т.д.)13h ; прерывание 13 -
дисковый ввод-выводal, 4 ; если дискета 1.44 Mb - идем дальше, если любая
другая - выдаем сообщение об ошибкеnextah, 9h ; выдается сообщение о том, что
дискета "неправильная"
mov dx, offset derror21h
mov ah, 0 ; сразу завершение и выход, чтобы не использовать far
jump21h:ah, 9h ; 9-я функция 21-го прерывания - вывод строки на экран
mov dx, offset mes1 ; в dx - адрес строки "number of head, 0 or 1"
int 21h ; прерывание 21 - функции DOSah, 08h ; 8-я функция 21-го
прерывания - ждать символ, считать его в al21h ; прерывание 21 - функции DOSal,
30h ; al=al-30h, 30h - смещение в ASCII, чтобы взять значение цифрыhead, al ;
значение - в переменную head, тут будет храниться номер головки флоппикаah, 9h
; 9-я функция 21-го прерывания - вывод строки на экран
mov dx, offset mes2 ; в dx - адрес строки "number of way, max 80"
int 21h ; прерывание 21 - функции DOSah, 08h ; считываем первый символ
int 21h ;al, 30h ; al=al-30h
mov bx, 10 ; в bx - основа десятичной системыah, 0 ; в ah - 0, чтобы не
было ошибокbx ; умножаем al на 10 - получаем значение старшего десятичного
разрядаway, al ; полученное значение - в переменную way, тут будет храниться
номер дорожкиah, 08h ; считываем второй символ21h ;al, 30h ; также получаем
значение младшего разрядаway, al ; добавляем его к старшему, получаем число
дорожек (напр. 5*10+8=58)way, 80 ; смотрим, не превышает ли оно максимума для
дискеты 1.44Mbnext2ah, 9h ; если были ошибки в процессе ввода - выдаем
сообщение
mov dx, offset inperr ;21h ;ah, 8h21hah, 4ch
int 21h:ah, 9h ; следующее сообщение - ввод номера сектора
mov ah, 08h ; аналогично считываем и получаем номер сектора
int 21h ;al, 30h ;bx, 10 ;ah, 0 ;bx ;sect, al ;ah, 08h ;21h
;al, 30h ;
add sect, al ; номер сектора находится в переменной sectsect, 18 ;
максимальное значение для дискеты 1.44Mb - 18next3ah, 9h ; если были ошибки в
процессе ввода - выдаем сообщение
mov dx, offset inperr ;21h ;ah, 8h21hah, 4ch21h:ah, 9h
mov dx, offset welkome ; приглашение к набору записываемых символов
int 21hcx, 0:
mov ah, 8h ; читаем символ21hsi, cxmessage[si], al ; пишем символ в
массивdl, alah, 02h ; выводим символ на экран21hcx ; сx - счетчик для массива
messagedl, 0Dh ; если нажата кнопка ENTER, прекращаем запись массива символов,
идем дальше.nextMFcx, 64 ; если превышена емкость массива - идем
дальшеintxt:ah, 03h ; получить текущую позицию курсораbh, 0 ; экран №010h ;
прерываниеch, 1h ; увеличим номер строки курсора на 1dh, ch ;dl, 0 ; столбец
тот жеah, 02h ; установить положение курсора10h
чтения с диска - 02hdx, ds ; в dx - содержимое сегмента данныхes, dx ; из
dx содержимое ds в es, напрямую работать с сегментными регистрами нельзяdl, 0 ;
в dl - 0, это номер дискаdh, head ; в dh - номер головкиch, way ; в ch - номер
дорожкиcl, sect ; в cl - номер сектораal, 64 ; в al - объем считываемой
информацииbx, offset message ; в bx - адрес буфера данных, [es]:[bx]ah, 03h ;
3-я функция 13-го прерывания - запись на диск13h ;ah, 0 ; ищем ошибки, при
удачном завершении в ah остается 0noer ;ah, 03h ; 03 - диск защищен от
записиerr03 ;ah, 04h ; 04 - сектор не найденerr04 ;ah, 07h ; 07 - повреждена
таблица параметров дисководаerr07 ;ah, 0ah ; 0А - дефектный секторerr0a ;ah,
0bh ; 0В - дефектная дорожкаerr0b ;ah, 0ch ; 0С - нестандартный формат носителя
je err0c ;ah, 80herr80
mov ah, 9h ; Если какая-то неизвестная ошибка
mov dx, offset xzerror ;21h ;
jmp exit ; на выход:ah, 9hdx, offset noerr ; ошибок нет
int 21hexit:ah, 9hdx, offset err0321hexit:ah, 9hdx, offset
err0421hexit:ah, 9hdx, offset err0721hexita:ah, 9hdx, offset err0a21hexitb:ah,
9hdx, offset err0b21hexitc:ah, 9hdx, offset err0c21hexit:
mov ah, 9hdx, offset errnd ; нет диска (превышен таймаут
обращения)21hexit: ; выход из программыah, 0 ; ждем нажатия любой кнопки
клавиатуры16hax, 3h ; очистка экрана
int 10hah, 4Ch ; выход в DOS21h
end ; конец :)
Список литературы
1. Питер
Абель. Ассемблер. Язык и программирование для IBM PC: пер. с англ. - К.: Век+,
М.: ЭНТРОП, К.: НТИ, 2003 - 736 с.
. Джордан.
Программирование на ассемблере. М.:
. Ризаев
И.С. Лекционный курс по дисциплине: «Системное программное обеспечение».
Казань: КАИ, 2004.
. Кулаков
В. Программирование на аппаратном уровне. Специальный справочник. Питер, 2003.