Реферат: Разработка командного процессора, реализующего команды dir и mkdir на ассемблере
Министерство образования и наукиРеспублики Беларусь
БелорусскийГосударственный Университет Информатики и Радиоэлектроники
______________________________________________________________________
Факультет Компьютерного Проектирования
Пояснительная записка
к курсовому проекту потеме
«Разработка коммандногопроцессора»
Выполнил
студент гр.410703
Федосенко Д.В.
Руководитель работы
ШиринскийВ.П.
Минск 1996
Содержание
Введение
1. Анализтехнического задания .................................
2. Разработкаалгоритма ........................................
3. Разработкаструктуры данных .................................
4. Кодированиеалгоритма .......................................
5. Тестирование иотладка программы ............................
Заключение.....................................................
Литература.....................................................
Приложение.....................................................
Введение
Появление микропроцессоров в 60-е годысвязано с разработкой ин-
тегральных схем(ИС). Интегральные схемы объединяли всебе различные
электронные компонентыв единый элемент на силиконовом чипе. Разработ-
чики установилиэтот крошечный чипв устройство, напоминающее сороко-
ножку, и включили его в функциональные системы. В начале 70-х годов
микрокомпьютерына процессоре Intel 8008 возвестили о первом поколе-
ниимикропроцессоров.
К 1974 г. появилось второе поколениемикропроцессоров общего наз-
начения Intel8080. Данный успех побудил другие фирмы к производству
процессоров Intel8080 или аналогичных.
В 1878 г. фирма Intel выпустила процессор третьего поколения -
Intel 8086, который обеспечивал некоторую совместимость с8080 и яв-
лялсязначительным продвижением вперед в данной области. Для поддер-
жки более простыхустройств и обеспечения совместимости с устройства-
ми ввода-выводатого времени Intel разработал разновидность процессо-
ра 8086 — процессор 8088, который в 1981 г. ьылвыбран фирмой IBM для
ее персональныхкомпьютеров.
Более развитыми версиями являются для процессора 8088 процессор
80186, а дляпроцессора 8086 — процессоры 80186, 80286, 80386, кото-
рые обеспечилидополнительные возможности и повысили мощность вычисле-
ний.
Распространение микропроцессоров послужилопричиной пересмотра от-
ношения к языкуФсскмблер по двум основным причинам. Во-первых, прог-
раммы, написанныена языке Ассемблер, требуют знаительноменьше обье-
ма памяти ивремени выполнения. Во-вторых, знание языка Ассемблер и
результирующегомашинного кода дыет понимание архитектуры машины, что
врядли обеспечиваетсяпри работе на языках высокого уровня. Хотя
большинствоспециалистов в области программного обеспечения ведут раз-
работки на языкахвысокого уровня, таких, как Паскаль или СИ, что про-
ще при написаниипрограмм, но наиболее мощное и эффективное програм-
мное обеспечениеполностью или частично написано на языке Ассемблер.
1. Анализ техническогозадания
В данном курсовом проекте необходиморазработать программу на язы-
ке Ассемблер дляМП Intel 8086 реализующую функции командного процес-
сора DIR иMKDIR. Т.е. наша программа должна создаватьподкаталог c
указанием диска имаршрута (функция MKDIR) и выводить, указанный
пользоватемкаталог. Вовремя создания подкаталога вносятся изменения в
таблицуразмещения файлов (FAT), с тем чтобысектора, используемые
этим подкаталогамбыли доступны другим файлам.
Для роботы с дисковой памятью в расширеннойверсии DOS нам понадо-
бятсяоперации, которые включают использованиестрок в формате ASCIIZ
для начальнойустановки дисковода, пути доступа и имени файла; файло-
вого номера длядоступу к файлу; специальных кодов возврата.
Для создания подкаталога методом дескриптора файла используется
функция 39Hпрерывания 21H. В DS:DX заносится строка ASCIIZ, содержа-
щей идентификациюфайла (все параметры необязательные), строка должна
завершаться 00H,например:
PATHNAME DB 'C:UTILNU.EXE',0
Обратная косая(или прямая косая) используется в качестве разделителя.
Hулевой байт(zero) завершает строку (отсюда название ASCIIZ).
При успешной операции создания подкаталога,флаг CF устанавливает-
ся в 0. При неуспешной операции флаг CFустанавливается в 1, а в ре-
гистр AX помещаетсякод ошибки, зависящий от операции (таблица 1.1), в
нашем случае,если не найден указанный диск или путь, то в AX возвра-
щается код ошибки03. В имени создаваемого подкаталога немогут быть
использованыследующие символы:
":; / |? * + = [ ].,< >
Таблица 1.1
┌────┬──────────────────────────────────────┐
│ N │ Описание ошибки │
├────┼──────────────────────────────────────┤
│ 01 │ Ошибка номерафункции │
│ 02 │ Файл ненайден │
│ 03 │ Путь доступа ненайден │
│ 04 │ Открыто слишкоммного файлов │
│ 05 │ Доступ неразрешен │
│ 06 │ Ошибка файловогономера │
│ 07 │ Блок управленияпамятью разрушен │
│ 08 │ Hедостаточнопамяти │
│ 09 │ Ошибка адреса блокапамяти │
│ 10 │ Ошибкаоборудования │
│ 11 │ Ошибкаформата │
│ 12 │ Ошибка кодадоступа │
│ 13 │ Ошибкаданных │
│ 15 │ Ошибкадисковода │
│ 16 │ Попытка удалитьоглавление │
│ 17 │ Hе тоустройтво │
│ 18 │ Hет большефайлов │
└────┴──────────────────────────────────────┘
Для организации работы, нам понадобится знание структуры записи
файла каталогов,которая приведена в таблице 1.2.
Таблица 1.2
┌───┬──────────┬───────┬───────────────────────────┐
│ N │ Смещение │Длина │ Значение поля │
│ │ (байт) │ (байт)│ │
├───┼──────────┼───────┼───────────────────────────┤
│1 │ 0 │ 8 │ Имя файла │
├───┼──────────┼───────┼───────────────────────────┤
│2 │ 8 │ 3 │ Расширение имени файла │
├───┼──────────┼───────┼───────────────────────────┤
│3 │ 11 │ 1 │ Байт атрибутов файлов │
├───┼──────────┼───────┼───────────────────────────┤
│4 │ 12 │ 10 │ Зарезервировано для DOS │
├───┼──────────┼───────┼───────────────────────────┤
│5 │ 22 │ 2 │ Время │
├───┼──────────┼───────┼───────────────────────────┤
│6 │ 24 │ 2 │ Дата │
├───┼──────────┼───────┼───────────────────────────┤
│7 │ 26 │ 2 │ Стартовый номер кластера │
├───┼──────────┼───────┼───────────────────────────┤
│8 │ 28 │ 4 │ Размер файла │
└───┴──────────┴───────┴───────────────────────────┘
Вторая функция курсового проекта (командаDIR), будет реализова-
на с помощью21-го прерывания. Функции 21-гопрерывания, которые мы
будемиспользовать, рассмотрены в 4 главе.
2. Разработка алгоритма
Разработаем алгоритм для разрабатываемойпрограммы. Данные в прог-
рамму будемпередавать в командной строке. Далеебудем анализировать
командную строкуследующим образом:
1. Если командная строка пуста, то выводимподсказку;
2. Если встречается первым ключ /D — товыводим текущий директорий;
3. Если встречается первым ключ /M - информируем пользователя о
том, что он забылуказать имя поддиректория, для его создания;
4. После этого записываем все до первогопробела в строку PATH -
это будет маскафайлов.
5. Анализируя далее, смотрим, если стоит /D — то выводим директо-
рий по маске,если стоит /M — то создаем подкаталог по маске.
Блок схема алгоритма приведена вприложении.
3. Разработка структурыданных
В курсовом проекте задействовано множествопеременных:
┌─────────┬────────────────────────────────────────────────────────────┐
│Hазвание│ Содержание переменной │
├─────────┼────────────────────────────────────────────────────────────┤
│ HelpStr│ Текст подсказки │
│ stringT│ К байт всего на данном диске │
│ stringF│ К байт свободно на диске │
│ stringU│ Вывод содержимого каталога │
│err_m1 │ Ошибка номерафункции! │
│err_m2 │ Файл не найден! │
│err_m3 │ Путь доступа ненайден! │
│err_m4 │ Открыто слишком многофайлов! │
│ ok_make│ Подкаталог создан! │
│ no_make│ Подкаталог не создан, т.к. вы не указали его имя! │
│ │ Для вывода подсказке запуститепрограмму без параметров. │
│str_f │ Вы не указали ключ! │
│str_k │ Вы указали неверныйключ! │
│ totalKB│ Ячейка для хранения объема диска │
│freeKB │ Ячейка для храненияразмера свободного места │
│ temp │ Рабочая переменная │
│ path │ Текущий каталог (пока не определен- пустой) │
│NewDTA │ Описываем структуруDTA │
│AttrF │ Атрибут файла │
│TimeF │ Время создания файла │
│DateF │ Дата создания файла │
│SizeF │ Размер файла │
│NameF │ Имя файла вместе срасширением │
└─────────┴────────────────────────────────────────────────────────────┘
Процедуры, входящие в курсовой проект:
┌─────────────────────────────────────────────────────────────────────────┐
│ Процедуравысчитывает и выводит время создания файла/каталога │
│WrtTime │
├─────────────────────────────────────────────────────────────────────────┤
│ Процедуравысчитывает и выводит дату создания файла/каталога │
│WrtDate │
├─────────────────────────────────────────────────────────────────────────┤
│ Забиваетпробелами поле, в которое записывается имя файла (NameF) │
│ Этонеобходимо для того, чтобы не было наложений имен файлов при выводе │
│ClrName │
├─────────────────────────────────────────────────────────────────────────┤
│ Выводитимя каталога на экран │
│WrtDir │
├─────────────────────────────────────────────────────────────────────────┤
│ Выводитимя файла на экран │
│WrtFile │
├─────────────────────────────────────────────────────────────────────────┤
│ Выводитметку текущего диска │
│WLabel │
├─────────────────────────────────────────────────────────────────────────┤
│Производит перевод строки и возврат каретки │
│ crlf │
├─────────────────────────────────────────────────────────────────────────┤
│ Выводитна экран текущий каталог │
│curdir │
├─────────────────────────────────────────────────────────────────────────┤
│ Получаетинформацию о диске. Номер диска берет из строки поиска │
│ Послевызова в AX — количество секторов в кластере │
│ в BX — число свободныхкластеров │
│ в CX — число байтов в секторе │
│ в DX — число кластеров надиске │
│GetInfo │
│ │
├─────────────────────────────────────────────────────────────────────────┤
│ Выводитразмер текущего диска в Килобайтах │
│totsize │
├─────────────────────────────────────────────────────────────────────────┤
│ Выводитразмер свободного пространства │
│ текущегодиска в Килобайтах │
│fresize │
├─────────────────────────────────────────────────────────────────────────┤
│ Процедуравывода числа в десятичном формате │
│Decimal │
└─────────────────────────────────────────────────────────────────────────┘
4. Кодирование алгоритма
Запишем разработанный нами алгоритм вмнемокоде на языке Ассемблер.
Далее более подробно опишем основныепрерывания, которые будем ис-
пользовать.
Основным прерыванием, используемым впрограмме, является прерыва-
ния INT 21H (DOSFunctions). Используемые функции этого прерывания
следующие:
Параметры Описание
Входные: AH 02H — Вывод на дисплей
DL символ для посылки на стандартное устройство
Выходные: нет
───────────────────────────────────────────────────────────────────────────
Входные: AH 09H — Вывод строки на дисплей
DS:DX Адрес строки, заканчивающаясязнаком '$' (ASCII 24H)
Выходные: нет
───────────────────────────────────────────────────────────────────────────
Входные: AH 1aH — Установка адреса DTA.
DS:DX адресс DTA области
Выходные: нет
───────────────────────────────────────────────────────────────────────────
Входные: AH 19H — Получить информацию отекущем диске
Выходные: AL DOS current default drive number (0=A, 1=B, и т.д.)
───────────────────────────────────────────────────────────────────────────
Входные: AH 36H — Получить информацию освободном месте на диске
DL drive number (0=default, 1=A, и т.д.)
Выходные: AX ffffH если DL было invalid drivenumber
иначе количество секторов верно
BX количество свободных секторов (allocation units)
CX байт на сектор (обычно 512)
DX общее количество секторов на диске
Доп.информация: Выходная информация обычноподсчитывается как
общий размер диска и количество свободногоместа на диске:
Если AX = ffffH, то вы не правильноуказали диск.
Иначе, свободного места в байтах = (AX * CX * BX)
общий размер в байтах = (AX * CX * DX)
Если сектора по 512 байт, более простоподсчитывать КБ:
свободного места в КБ = (AX * BX) / 2
общий размер в КБ = (AX * DX) / 2
───────────────────────────────────────────────────────────────────────────
Входные: AH 3fH — Создать подкаталог
Функция описывалась нами ранее.
───────────────────────────────────────────────────────────────────────────
Входные: AH 47H — Информация о текущем директории
DL drive number (0=default, 1=A, etc.)
DS:SI address of a local buffer tohold a pathname (64 bytes)
Выходные: AX передается ошибка (Таблица 1.1)
───────────────────────────────────────────────────────────────────────────
Входные: AH 4fH — Hайти следующий совпадающий файл
DS:DX адресс данных спредыдущего 4eH поиска файла
───────────────────────────────────────────────────────────────────────────
Входные: AH 4eH — Hвайти первый совпадающий файл
DS:DX строка пути к файлу ASCIIZ
CX атрибут файлы для поиска
───────────────────────────────────────────────────────────────────────────
Кроме 21h прерывания мы использовали функцию0eH прерывания INT 10H:
Данная функция обеспечивает вывод символана монитор в режиме те-
летайпа. Длявыполнения этой функции в AL помещают выводимый символ, в
BL цвет текста иномер строницы в BH. Hапример, символы: CR (0dH), LF
(0aH), звуковойсигнал (07H) и т.д. Данная функцияавтоматически кур-
сор, переводитсимволы на следующую строку, выполняетпрокрутку экра-
на и сохраняеттекущие атрибуты экрана.
Также мы использовали прерывание INT 20Hдля выхода в DOS. Оно не
имеет параметров.
Полный текст программы приведен вПриложении.
5. Тестирование и отладкапрограммы
D:ASM>kp.com <ВВОД>
KP v1.0,Copyright (c) 1997, БГУИР, Федосенко Д.В.
При запуске безпараметров выводит подказку
Запуск спараметром должен иметь вид: kpдиск: каталогмаска [/D] [/M]
Где маска (прииспользовании /D) — любые символы и имена, включая * и ?
(при использовании /M) — названиеподкаталога.
/D — выводдиректория по маске /M — созданиеподкаталога по маске
Например:kpC:LANGBP*.* /D — вывод всех файлов и каталогов из C:LANGBP
kp C:* /D — вывод только каталогов из корневогокаталога диска C:
kp C:UTIL /M — создание подкаталогаUTIL в корневом диска С:
kp /D - вывод всех файлов и каталогов по текущему пути
Если ВЫиспользуете /M, то указывать название подкаталога обязательно!
D:ASM>kpc:cd*.* /D <ВВОД>
Вывод содержимогокаталога c:cd*.*
Метка диска DIMKA
. <КАТАЛОГ> 29/01/97 18:18:44
.. <КАТАЛОГ> 29/01/97 18:18:44
read_me.txt 1834 19/11/96 17:58:40
rcdsim.com 6604 13/09/95 03:00:00
loadcd.exe 0352 13/09/95 03:00:00
rcdpc.sys 4231 13/09/95 03:00:00
run_me.bat 40 06/02/97 13:54:38
307240К байт всего на данном диске
6160К байт свободно на диске
D:ASM>kpc:cdutil /M <ВВОД>
c:cdutil
Подкаталогсоздан!
D:ASM>kpc:cd*.* /D
Вывод содержимогокаталога c:cd*.*
Метка диска DIMKA
. <КАТАЛОГ> 29/01/97 18:18:44
.. <КАТАЛОГ> 29/01/97 18:18:44
UTIL <КАТАЛОГ> 10/04/97 19:57:48
read_me.txt 1834 19/11/96 17:58:40
rcdsim.com 6604 13/09/95 03:00:00
loadcd.exe 0352 13/09/95 03:00:00
rcdpc.sys 4231 13/09/95 03:00:00
run_me.bat 40 06/02/97 13:54:38
307240К байт всего на данном диске
6152К байт свободно на диске
D:ASM>kp */D <ВВОД>
Вывод содержимогокаталога *
Метка диска NPACD
. <КАТАЛОГ> 19/02/97 19:20:34
.. <КАТАЛОГ> 19/02/97 19:20:34
THELP6<КАТАЛОГ> 07/04/97 22:08:48
483552К байт всего на данном диске
8928К байт свободно на диске
В процессе тестирования были замеченыпроблемы с выводом информа-
ции при работе всистеме WINDOWS95 (v4.0095). Авторнадеется, что с
выходом системыWINDOWS98 проблем не будет.
Заключение
В процессе выполнения курсового проекта яболее широко изучил фун-
кции прерыванийDOS и BIOS. Hаучился применять их на практике, а так-
же ознакомился соструктурой построения программы, реализующей фун-
кйии коммандногопроцессора. Hаучился пользоватьсясправочной и дру-
гой литературой.
Литература
1. Бек Л. Введение в системнойпрограммирование
2. Соловьев Г.H. Операционная система ЭВМ,Высшая школа, 1989г
3. Краковяк С. Основы организации и функционирования операционной
системы ЭВМ
4. Вишняков В.А., Петровский А.А. Системноеобеспечение микроЭВМ
5. Hортон П. Персональный компьютер фирмы IBM и операционная система
MS-DOS
6. Финогенов К.Г. Самоучитель по системнымфункциям MS-DOS
7. Абель П. Язык ассемблер для IBM PC ипрограммирования, Высшая шко-
ла, 1992г
Приложение
;----------------------------------------
; Курсовой проект по дисциплине
; «Системноепрограммное обеспечение»
; студента гр.410703 Федосенко Д.В.
; (c)1997 БГУИР
;----------------------------------------
.MODEL TINY
.CODE
ORG 100h
begin: jmp start
HelpStr db 13,10,'KP v1.0, Copyright (c) 1997,БГУИР, Федосенко Д.В.'
db 13,10,13,10,'При запуске без параметров выводит подказку'
db 13,10,'Запуск с параметром должен иметь вид: kp диск:
каталогмаска[/D] [/M]'
db 13,10,'Где маска (при использовании /D) — любые символы и
имена, включая * и ?'
db 13,10,' (прииспользовании /M) — название
подкаталога.'
db 13,10,'/D — вывод директория по маске
/M — создание подкаталога по маске'
db 13,10,'Например:kpC:LANGBP*.* /D — вывод всех файлов
и каталогов из C:LANGBP'
db 13,10,' kp C:* /D — вывод только каталогов из
корневого каталога диска C:'
db 13,10,' kp C:UTIL /M — создание подкаталога UTIL
в корневомкаталоге диска С:'
db 13,10,' kp /D — вывод всех файлов и каталогов по
текущему пути'
db 13,10,'Если ВЫ используете /M, то указывать название
подкаталога обязательно!',13,10,'$'
stringT db 'К байт всего на данном диске',13,10,'$'
stringF db 'К байт свободно на диске',13,10,'$'
stringU db 13,10,'Вывод содержимого каталога $'
err_m1 db 13,10,'Ошибка номера функции! $'
err_m2 db 13,10,'Файл не найден! $'
err_m3 db 13,10,'Путь доступа не найден! $'
err_m4 db 13,10,'Открыто слишком много файлов! $'
ok_make db 13,10,'Подкаталог создан! $'
no_make db 13,10,'Подкаталог не создан, т.к. вы неуказали его имя!'
db 13,10,'Для вывода подсказке запустите программу без
параметров.',10,13,'$'
str_f db 13,10,'Вы не указали ключ! $'
str_k db 13,10,'Вы указали неверный ключ! $'
totalKB dd 0 ; Ячейка для хранения объема диска
freeKB dd 0 ; Ячейка для храненияразмера свободного места
space db ' $' ; Строка разделения
temp dw 0 ; Рабочая переменная
path db 65 dup (0) ; Текущий каталог(пока не определен — пустой)
NewDTA db 21 dup (0) ; Описываем структуру DTA
AttrF db 0 ; Атрибут файла
TimeF dw 0 ; Время созданияфайла
DateF dw 0 ; Дата созданияфайла
SizeF dd 0 ; Размер файла
NameF db 13 dup (0) ; Имя файла вместес расширением
start:
push cs ; Заносим во всерегистры сегмент кода
pop ds ;
push cs ;
pop es ;
; Проверяем строкупараметров
mov cl,ds:[80h] ; Число символовпараметров
cmp cl,0 ; Не равно-личисло параметров нулю ?
je help ; Если параметровнет, переходим
cmp cl,1 ; Если один параметр,например файл запущен
je help ; по Ctrl-Enter вNC, то тоже выходим
mov al,ds:[82h] ; Проверяем наввод без маски
cmp al,'/' ; Наклонная черта?
jne not_help ; Нет — выходим
mov al,ds:[83h] ; Да — смотримдальше
cmp al,'M' ; Если введено /M
je not_m
cmp al,'D' ; Если введно /D
je noparam
jmp not_help
help:
mov ah,9 ; Вывод подсказки
lea dx,HelpStr
int 21h
ret ; Выход в DOS
not_m:
mov ah,9 ; Подкаталог несозданб т.к. вы не
lea dx,no_make ; указали имя
int 21h
ret ; Выход в DOS
not_help: ; Если маска введена
mov ch,0
mov di,81h ; Адрес первогосимвола параметра
mov al,' ' ; Сканироватьбудем до первого пробела
CheckParam:
repe scasb ; Запускаемсканирование строки
jne IsParam
IsParam: ; Если пробел найден
mov si,di ; Запоминаем адрес
dec si ; Уменьшаем наединицу
lea di,path ; Устанавливаемадрес строки параметров
inc cl
MoveParam:
lodsb ; Загружаем один символстроки параметров
cmp al,' ' ; Проверяем, не равен ли он пробелу
je EndMoveParam ; Если равен,значит конец строки
stosb ; Иначе пересылаем в строкупараметров — path
loop MoveParam ; Цикл до концастроки
EndMoveParam:
push ax ; сохраним навсякий случай
lodsb ; загружаем еще один символ
cmp al,'/' ; если это /
je okk
mov ah,9 ; иначевываливаемся с error
lea dx,str_F
int 21h
int 20h
okk: lodsb ; загружаем еще один символ
cmp al,'D' ; если это /D
je Dire ; то запуск DirE
cmp al,'M' ; если это /M
je MakeE ; то запускаемMakeE
mov ah,9 ; иначевываливаемся с error
lea dx,str_K
int