Командний процесор для реалізації функції DOS: dir

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    10,11 Кб
  • Опубликовано:
    2013-01-18
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Командний процесор для реалізації функції DOS: dir

ЗМІСТ

Вступ

Опис алгоритму

Опис програми

Програмна реалізація та тестування

Висновки

Література

Додаток А

Додаток Б

ВСТУП

В цій курсовій роботі я створив програму яка імітує виконання команди DOS «dir». Вся програма написана на мові низького рівня Assembler що дає найкращу швидкодію програмі. Програма не підтримує довгі імена файлів і тому вона їх скорочує по шаблону DOS. Щоб користуватися цією програмою потрібно добре ознайомитися з її можливостями. Для цього програма містить невеличку довіку в якій описані приклади завдання параметрів для роботи з програмою. Для того щоб вивести довідку просто необхідно запустити програму без будь-яких параметрів.

Курсовий проект містить такі розділи: опис алгоритму, опис програми, програмна реалізація та тестування.

В першому розділі чітко описується сам алгоритм реалізації та функціонування програми.

Другий розділ містить інформацію про засоби мови Assembler, які використовуються в програмі, тобто опис команд, директив, функцій, переривань і т.д.

В третьому розділі описується функціонування програми, тобто те як вона працює і який використовує інтерфейс при спілкуванні з користувачем.

В процесі розробки курсового проекту я користувався компілятором tasm.exe версія 3.1, лінкером tlink.exe версія 3.0. Використовував дуже часто для відладки програму turbo debuger версія 5.0.

 

ОПИС АЛГОРИТМУ


Алгоритм реалізації програми дуже легкий та зрозумілий. Спочатку програма обробляє данні які були введені тобто параметри з якими була запущена програма до таких параметрів відносяться повний шлях до каталогу вміст якого нам потрібно вивести на екран та маску за якою відбуваються пошук файлів. Потім програма заповнює область DTA за введеними параметрами і розпочинає пошук каталогів та файлів, при цьому спочатку виводяться всі знайдені каталоги а потім вже файли. Всі назви файлів переводяться у нижній регістр для більшої зручності. Крім того що програма виводить вміст каталогів на екран вона також виводить час створення каталогів і файлів. Сама програма виводить також розмір файлів, якщо файл менший 1024 байти то його розмір виводиться в байтах а якщо більший то в кілобайтах. Всі обрахунки розміру файлу, час його створення та вивід самого файлу чи каталогу на екран виконують в окремих процедурах що робить програмний код більш легшим для розуміння.

А тепер розглянемо те що робиться в середині програми при її запуску спочатку програма перевіряє наявність введених параметрі, якщо вони відсутні то на екран виводиться текст в якому чітко описано на прикладах як правильно вводити потрібні параметри і як саме користуватися програмою. Якщо параметри були введені неправильно то програма виводить на екран повідомлення про помилку. Коли програма отримує правильні параметри вона розпочинає пошук файлів за вказаною маскою. Після знаходження файлу програма викликає процедуру виводу на екран ім‘я відповідного файлу чи каталогу. Сама ж процедура також викликає інші процедури які виводять на екран час створення файлу та його розмір в зручний для користувача спосіб. Закінчивши вивід всіх даних по знайденому файлу програма викликає процедуру яка виконує перехід на новий рядок . після чого починається пошук наступного файлу і все відбувається як і в попередньому разі доки не закінчаться файли. Тоді програма закінчує свою роботу і повертає керування DOS.

ОПИС ПРОГРАМИ

Як вже було сказано вище, програма написана на мові Assembler. Лістинг будь-якої програми досить важкий для розуміння. Тому текст програми містить багато коментарів, що полегшує її читання, а також можливість вдосконалити.

WrtTime- процедура яка виводить час створення файлу чи каталогу вона використовує зміну TimeF яка заповнюється DTA і містить в собі час створення файлу. За допомогою побітового зміщення процедура витягує дані з змінної і викликає процедуру DecWrt що переводить двійкові значення в десяткові і виводить їх на екран.

ClrName- ця процедура забиваємо пробілами поле, в якому записується ім‘я файлу (NameF) це потрібно для того щоб не було накладань імен файлів при виводі. Поле NameF складається з 13 символів цього цілком достатньо для того щоб вмістити в собі ім‘я файлу та його розширення. Вільне місце в полі забивається пустим символом (0).

WrtDir- це процедура яка виводить ім‘я каталогу на екран. Використовує змінну NameF в ній описано назву файлу з розширенням. Процедура використовує Функцію виводу цілої стрічки на екран і за раз виводить 13 символів. В процедурі викликаються такі інші процедури: ClrName, WrtTime, crlf.

WrtFile- процедура виводить ім‘я файлу на екран разом з розширенням на відміну від попередньої процедури вона використовує по символьний вивід імені файлу на екран для того щоб перевести кожен символ в нижній регістр. Також використовує змінну NameF і викликає в собі такі процедури: ClrName, WrtTime, crlf, Decimal.

WLabel- процедура яка виводить мітку активного диску . вона шукає вайл з атрибутом 08h тобто мітку активного диску . використовує такі змінні: path , NameF. Викликає такі процедури: ClrName , crlf.

Crlf- процедура що виконує функцію переводу стрічки тобто виводить символи 10 і 13.

Curdir- дана процедура виодить на екран активний каталог. Використовує зміну path з якої і бере саму назву активного каталогу потім додає до не символи «:» «\» а також паску для пошуку «*.*» і виводить повний шлях на екран. Викликає таку процедуру crlf.

Div1024- процедура яка виконує операцію ділення числа що знаходиться в регістрі ax на 1024 це потрібно для того щоб перевести розмір файлу з байт в кілобайти.

DecWrt- процедура що перетворює час створення файлу з двійкового коду в десятковий і виводить його на екран.- процедура що обраховує розмір якого файлу потрібно виводити в байтах а якого в кілобайтах. Викликає процедури: Div1024, des.

Des- процедура переводу двійкового числа в десяткове. Використовується для переведення розміру файлу в десятковий формат.

ПРОГРАМНА РЕАЛІЗАЦІЯ ТА ТЕСТУВАННЯ

Програма містить стандартний інтерфейс DOS . якщо наприклад запустити програму без будь яких параметрів то на екран виводиться довідка з прикладами користування програми.

:\KYRSOV~1>kyrsova.comv1.0, Copyright (c) 2011,zapuske bez parametrov vuvodit helpc parametrom doljen imet vid: kp drive:\folder\maska [/D]maska (pri vukorustani /D) - ljubue simvolu i imena, vkljuthaja * i ?

/D - vuvod direktorii po maske:kp C:\LANG\BP\*.* /D - vuvod vseh failof i katalogov iz

C:\LANG\BPC:\* /D - vuvod katalogov tolko iz kornevogo diska C:/D - vuvod vseh failov i katalogov po danomy pyti

Якщо параметр буде введений невірно то виводиться повідомлення пр помилку.

:\KYRSOV~1>kyrsova.com /sne ykazali kljuchykazali nevernui kljuch

При введені вірних параметрів програма виводить на екран вміст заданого або поточного каталогу на екран також програма вираховує час створення файлу та його розмір.

:\KYRSOV~1>kyrsova.com /dkatalog C:\KYRSOV~1Diska: WIN

. <DIR> 17:57:46

ВИСНОВКИ

Дана курсова робота реалізує програму, яка імітує команду DOS dir. Програму реалізовано на машино-орієнтованій мові програмування Assembler. Був розроблений алгоритм, який повністю імітує потрібну команду.

Для написання цієї програми потрібно було ознайомитися з великим обсягом матеріалу по можливостях даної мови програмування та роботи файлової системи комп’ютера. Дана програма не є аналогом команди DOS dir вона відрізняється від неї меншою кількістю можливостей , але вона в деяких випадках може бути використана як заміна їй.

ЛІТЕРАТУРА

1. Зубков для DOS, Windows и Unix. - М.: ДМК Пресс, 2000. - 608 с.: ил. (Серия «Для программистов»).

2.      Абель П. Язык Ассемблера для IBM PC и программирования / Пер. с англ. Ю.В. Сальникова. - М.: Высш. Шк., 1992. - 447 с.: ил.

3. Бек Л. Введение в системное программирование

програма dosdir assembler інтерфейс

ДОДАТОК А


.MODEL TINY

.CODE

.386100h: jmp startdb 13,10,'KP v1.0, Copyright (c) 2011,'13,10,13,10,'Pri zapuske bez parametrov vuvodit help'13,10,'zapusk c parametrom doljen imet vid: kp drive:\folder\maska [/D]'13,10,'gde maska (pri vukorustani /D) - ljubue simvolu i imena,

vkljuthaja * i ?'13,10,'/D - vuvod direktorii po maske '13,10,'pruklad:kp C:\LANG\BP\*.* /D - vuvod vseh failof i katalogov iz

C:\LANG\BP'13,10,' kp C:\* /D - vuvod katalogov tolko iz kornevogo diska C:'13,10,' kp /D - vuvod vseh failov i katalogov po danomy pyti',13,10,'$'db 13,10,'Vuvod tekyshego kataloga $'13,10,'dlja vuvoda spravki zapystite programy bez parametrov.',10,13,'$'_f db 13,10,'vu ne ykazali kljuch $'_k db 13,10,'vu ykazali nevernui kljuch $'db ' $' ; стрічка розділенняdw 0 ; робоча зміннаdb 65 dup (0) ; текущий каталогdb 21 dup (0) ; структур ДТАdb 0 ; атрибут файлуdw 0 ; час створення файлуdw 0 ; дата створення файлуdd 0 ; розмір файлуdb 13 dup (0) ; імя файлу з розширенням:cs ; зоносимо у всі регістри сегмент кодуds ;cs ;es ;

;перевіряємо стрічку параметрівcl,ds:[80h] ; число символів параметрівcl,0 ; чи не дорівнює число параметрів нулю ?help ; якщо параметрів нема то переходимоcl,1 ; якщо один параметерhelp ; по Ctrl-Enter в NC, то також виходимal,ds:[82h] ; перевіряємо на ввід без маскиal,'/' ; слеш ?not_help ; ні - виходимоal,ds:[83h] ; так - дивимося даліal,'D' ; якщо введено /Dnoparamal,64h ; якщо введено /D(маленьке)noparamnot_help:ah,9 ; вивід підказкиdx,HelpStr21h; вихід в DOS_help:; якщо маска введенаch,0di,81h ; адреса першого символа параметраal,' ' ; сканувати будемо до першого пробілу:scasb ; запускаємо сканування стрічкиIsParam: ; якщо пробіл знайденоsi,di ; запамятовуємо адресуsi ; зменшуємо на одиницюdi,path ; встановлюємо адресу стрічки параметрівcl:; завантажуємо один символ стрічки параметрівal,' ' ; перевіряємо чи він не дорівнює пробілуEndMoveParam ; якщо дорівнює тоді кінець стрічки; інакше пересилаємо стрічку параметрів - pathMoveParam ; цикл до кінця стрічки:ax ;збережимо на всяк випадок;завантажуємо ще один символal,'/' ;якщо це /okkah,9 ;інакше errordx,str_F21h: lodsb ;завантажуємо ще один символal,'D' ;якщо це /DDire ;то виконуємо DirE,64hah,9 ;інакше errordx,str_K21h20h: pop axal,0 ; додаємо символ NUL в кінець стрічки параметрів[di],alah,9 ; функція виводу стрічкиdx,stringU ; В DX - адреса стрічки21h ; виводимо стрічку "Vuvod tekyshego kataloga"ah,40h ; виводимо маску пошукуbx,01cx,50dx,path21hcrlf ; перевід стрічкиskip_curdir ; обходимо текущій каталог: ; якщо не задані параметриcurdir ;знаходимо тєкущій каталог_curdir:dx,NewDTA ; встановлюємо мітку на свою область DTAah,1Ah21hWLabel ; виводимо мітку дискуah,4eh ; функція знаходить перший каталог з маскою *.*cx,10h ; В CX - атрибут каталогу - 10hdx,path ; В DX - шлях для пошуку21hNowFiles ; якщо каталогу немає шукаємо файлиWrtDir; виводимо імя першого знайденого каталогу:ah,4fh ; функція продовжує пошук функції 4eh21hNowFiles ; якщо каталогу немає шукаємо файлиWrtDir ; виводимо знайдений каталогFindNextDir ; переходимо на пошук іншого:ah,4eh ; функція знаходить перший файл з маскою *.*cx,27h ; В CX - атрибут файла - 27h (RO+Hid+Sys+Arc)dx,path ; В DX - шлях для пошуку файлів21hhalt ; якщо файлів немає то на вихідWrtFile ; якщо файл знайдено то виводимо його імя:ah,4fh ; функція продовжує пошук файлів21hhalt ; якщо більше файлів немає то на вихідWrtFile ; виводимо імя файлу на екранFindNextFile ; переходимо на пошук наступного файлу: call crlf ; перевід стрічки; вихід в DOS

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;::прцедура обраховує і виводить час створення файлу чи каталогу :::

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::proc nearah,9dx,space21hax,TimeFax,11DecWrtax,0e3ah10hax,TimeFax,5ax,10DecWrtax,0e3ah10hax,TimeFax,11ax,10DecWrtendp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;: забиваємо пробілами поле, в якому записується імя файлу (NameF) ::

;: це потрібно для того щоб не було накладань імен файлів при виводі ::

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::proc nearsi,NameF ; отримаємо адресу імені файлуcx,1: cmp cx,13 ; якщо CX=13, то імя опрацьовано повністюvihod ; тому виходимоal,0 ; заносимо код символа 0 (пустий символ)[si],al ; записуємо пустий символ у стрічку NameFsi ; збільшуємо адресу стрічкиcx ; збільшуємо лічильник записаних символівrp ; повторюємо цикл: retendp

;::: вивід імя каталогу на екран ::::

;::::::::::::::::::::::::::::::::::::::proc nearAttrF,10h ; перевіряємо атрибут: якщо 10h, то це каталогexit1 ; Иначе на выходah,40h ; функція виводу стрічкиbx,01cx,12 ; виводимо 13 символівdx,NameF ; В DX - адреса стрічки виводу21hah,9dx,dirstr21hWrtTimecrlf ; перевід стрічки: call ClrName ; чистимо поле виводуdb '<DIR>$'endp

;:::::::::::::::::::::::::::::::::::::::

;::: виводимо імя файлу на екран :::::::

;:::::::::::::::::::::::::::::::::::::::proc nearAttrF,10h ; перевіряємо атрибут: якщо це не файл то виходимоexit2si,NameF ; завантажуємо адресу стрічки в SIcx,1:cx,13 ; перевіряєм, якщо CX=13, то вивід закінченоexit2 ; вихідal,[si] ; заносимо в AL символ що потрібно вивестиal,65 ; порівнюємо його з 'A'skip1 ; якщо менше,то не переводимо в нижній регістрal,90 ; порівнюємо AL з 'Z'skip1 ; якщо більше то не переводимо в нижній регістрal,32 ; переводимо симвіл в нижній регістр:dl,alah,02 ; функція виводу символа на екран21hsi ; збільшуємо адресуcx ; збільшуємо лічильникloop1 ; переходимо на наступний симвіл:ClrName ; чистимо поле виводуah,9dx,spk21hWrtTimeah,9dx,spk21hax,word ptr SizeFdx,word ptr SizeF+2Decimalcrlfdb ' $'endp

;:::::::::::::::::::::::::::::::::::::::

;::: виводимо мітку активного диску ::::

;:::::::::::::::::::::::::::::::::::::::proc nearClrName ; чистимо поле виводуah,9 ; функція виводу стрічки на екранdx,StringL ; В DX - адреса стрічки21hsi,path4ah,19h ; отримаємо активний диск21hal,41h ; переводимо його в букву[si],al ; заносимо в тимчасову стрічкуsi,path ; шлях пошукуdi,path4 ; тимчасова стрічкаal,[si] ; перемо перший символ шляху пошукуal,65 ; літера диску 'A'?not_xchg ;якшо менше, выходимоal,122 ; Буква диску 'z'?not_xchg ; якщо більше, виходимоal,91 ; якщо '[' - вихідnot_xchgal,92 ; якщо '\' - вихідnot_xchgal,93 ; якщо ']' - вихідnot_xchgal,94 ; якщо '^' - вихідnot_xchgal,95 ; якщо '_' - вихідnot_xchgal,96 ; якщо '`' - вихідnot_xchg[di],al_xchg:ah,4eh ; шукаємо файлcx,08h ; с атрибутом 08h, т.е. мітку томуdx,path4 ; В DX - шлях для пошуку21hah,40h ; функція виводу стрічки на екранbx,01cx,13 ; виводимо 13 символівdx,NameF ; В DX - адреса стрічки21hcrlf ; перевід стрічкиcrlf ; перевід стрічкиClrName ; чистим поле виводуdb 'Metka Diska: $'db 'c:\*.*',0 ; перший симвіл буде замінений на активний дискendp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::

;:::: перевід стрічки :::::

;::::::::::::::::::::::::::::::::::::::::::::::::::::::proc nearax,0e0dh ; функція виводу символа10h ; виводимо симвіл 13 на екранax,0e0ah ; функція виводу символа10h ; виводимо символ 10 на екранendp

;::::::::::::::::::::::::::::::::::::::::::

;::: вивід на екран активного каталогу ::::

;::::::::::::::::::::::::::::::::::::::::::proc nearah,9 ; функція виводу стрічкиdx,stringC ; В DX - адреса стрічки21h ; виводимо стрічку 'Tekyshi katalog'si,pathah,19h ; отримаємо активний диск21hal,41h ; переводимо його в літеру[si],alsial,58 ; додаємо симвіл ':'[si],alsial,92 ; додаємо симвіл '\'[si],alah,47h ; функція отримання активного каталогуdl,00si,path+3 ; додаємо до диску каталог21hsi,path ; посимвольно виводимо повний шляхloop:byte ptr [si],0a20exital,[si]dl,alah,0221hsia10loopexit:

; додаємо до активного шляху маску *.* для пошуку каталогів і файлівsi ; зменшуємо адресу на 1 и отримуємо останнійal,[si] ; симвіл, а не NULsi ; повертаємо назат SIal,92 ; перевіряємо якщо останій симвіл - слэш, то выхідskip_slashal,92 ; інакше додаємо симвіл '\'[si],alsi_slash:al,42 ; додаємо симвіл '*'[si],alsial,46 ; додаємо симвіл '.'[si],alsial,42 ; додаємо симвіл '*'[si],alsial,0 ; додаємо симвіл NUL[si],alcrlfdb 13,10,'Tekyshi katalog $'endpproc nearcx,10: shr ax,1dx,1dd30ah,10000000b: loop dd20endpproc nearsi,outst ; очищаємо стрічкуcl,0[si],cl[si+1],clsi,outstcl,48[si],clcx,0010si,outst+1: cmp ax,0010a30dx,dxcxdl,30h[si],dlsia20: or al,30h[si],alah,40h ; виводимо стрічкуbx,01cx,02dx,outst21hdb ' 'endpprocax,1024ddo01ah,9dx,bite21h:Div1024ah,9dx,kbite21h:db '/B$'db'/KB$'endpproc nearaxcsdssi,offset dodat+5:cx,10dx,dxcxdl,48sics:[si],dlax,0do1do:ah,09dx,si21haxdup(' '),'$'endpbegin

 

ДОДАТОК Б

Блок-схема програми


Похожие работы на - Командний процесор для реалізації функції DOS: dir

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!