Реферат: Разработка командного процессора, реализующего команды 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    

еще рефераты
Еще работы по программированию, базе данных