Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

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

КурсоваДопомога в написанніДізнатися вартістьмоєї роботи

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

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

ЗМІСТ

  • Вступ
  • Опис алгоритму
  • Опис програми
  • Програмна реалізація та тестування
  • Висновки
  • Література
  • Додаток А
  • Додаток Б
    • ВСТУП
      • В цій курсовій роботі я створив програму яка імітує виконання команди DOS «dir». Вся програма написана на мові низького рівня Assembler що дає найкращу швидкодію програмі. Програма не підтримує довгі імена файлів і тому вона їх скорочує по шаблону DOS. Щоб користуватися цією програмою потрібно добре ознайомитися з її можливостями. Для цього програма містить невеличку довіку в якій описані приклади завдання параметрів для роботи з програмою. Для того щоб вивести довідку просто необхідно запустити програму без будь-яких параметрів.
      • Курсовий проект містить такі розділи: опис алгоритму, опис програми, програмна реалізація та тестування.
      • В першому розділі чітко описується сам алгоритм реалізації та функціонування програми.
      • Другий розділ містить інформацію про засоби мови Assembler, які використовуються в програмі, тобто опис команд, директив, функцій, переривань і т.д.
      • В третьому розділі описується функціонування програми, тобто те як вона працює і який використовує інтерфейс при спілкуванні з користувачем.
      • В процесі розробки курсового проекту я користувався компілятором tasm. exe версія 3.1, лінкером tlink. exe версія 3.0. Використовував дуже часто для відладки програму turbo debuger версія 5.0.

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

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

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

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

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

Програма містить 11 процедур на базі яких і працює сама програма: WrtTime, ClrName, WrtDir, WrtFile, WLabel, crlf, curdir, Div1024, DecWrt, Decimal, des.

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— процедура що перетворює час створення файлу з двійкового коду в десятковий і виводить його на екран.

Decimal— процедура що обраховує розмір якого файлу потрібно виводити в байтах, а якого в кілобайтах. Викликає процедури: Div1024, des.

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

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

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

C:KYRSOV~1>kyrsova.com

KP v1.0, Copyright © 2011,

Pri zapuske bez parametrov vuvodit help

zapusk c parametrom doljen imet vid: kp drive: foldermaska [/D]

gde maska (pri vukorustani /D) — ljubue simvolu i imena, vkljuthaja * i ?

/D — vuvod direktorii po maske

pruklad:kp C: LANGBP*.* /D — vuvod vseh failof i katalogov iz

C:LANGBP

kp C:* /D — vuvod katalogov tolko iz kornevogo diska C:

kp /D — vuvod vseh failov i katalogov po danomy pyti

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

C:KYRSOV~1>kyrsova.com /s

vu ne ykazali kljuch

vu ykazali nevernui kljuch

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

C:KYRSOV~1>kyrsova.com /d

Tekyshi katalog C: KYRSOV~1

Metka Diska: WIN

.

    17:57:46

    .

      17:57:46

      kyrsova.asm 21:16:32 16/KB

      kyrsova.com 21:00:50 1/KB

      vc.com 12:05:38 63/KB

      vc.ini 08:57:24 458/B

      ВИСНОВКИ

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

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

      ЛІТЕРАТУРА

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

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

      3. Бек Л.

      Введение

      в системное программирование

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

      ДОДАТОК А

      .MODEL TINY

      .CODE

      .386

      ORG 100h

      begin: jmp start

      HelpStr db 13,10,'KP v1.0, Copyright © 2011,'

      db 13,10,13,10,'Pri zapuske bez parametrov vuvodit help'

      db 13,10,'zapusk c parametrom doljen imet vid: kp drive: foldermaska [/D]'

      db 13,10,'gde maska (pri vukorustani /D) — ljubue simvolu i imena,

      vkljuthaja * i ?'

      db 13,10,'/D — vuvod direktorii po maske '

      db 13,10,'pruklad:kp C: LANGBP*.* /D — vuvod vseh failof i katalogov iz

      C:LANGBP'

      db 13,10,' kp C:* /D — vuvod katalogov tolko iz kornevogo diska C:'

      db 13,10,' kp /D — vuvod vseh failov i katalogov po danomy pyti', 13,10,'$'

      stringU db 13,10,'Vuvod tekyshego kataloga $'

      db 13,10,'dlja vuvoda spravki zapystite programy bez parametrov.', 10,13,'$'

      str_f db 13,10,'vu ne ykazali kljuch $'

      str_k db 13,10,'vu ykazali nevernui kljuch $'

      space db ' $'; стрічка розділення

      temp dw 0; робоча змінна

      path db 65 dup (0); текущий каталог

      NewDTA db 21 dup (0); структур ДТА

      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,'D'; якщо введено /D

      je noparam

      cmp al, 64h; якщо введено /D (маленьке)

      je noparam

      jmp not_help

      help:

      mov ah, 9; вивід підказки

      lea dx, HelpStr

      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

      okk: lodsb ;завантажуємо ще один символ

      cmp al,'D' ;якщо це /D

      je Dire ;то виконуємо DirE

      cmpal, 64h

      jeDire

      mov ah, 9 ;інакше error

      lea dx, str_K

      int 21h

      int 20h

      DirE: pop ax

      mov al, 0; додаємо символ NUL в кінець стрічки параметрів

      mov [di], al

      mov ah, 9; функція виводу стрічки

      lea dx, stringU; В DX — адреса стрічки

      int 21h; виводимо стрічку «Vuvod tekyshego kataloga»

      mov ah, 40h; виводимо маску пошуку

      mov bx, 01

      mov cx, 50

      lea dx, path

      int 21h

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

      jmp skip_curdir; обходимо текущій каталог

      NoParam:; якщо не задані параметри

      call curdir ;знаходимо тєкущій каталог

      skip_curdir:

      lea dx, NewDTA; встановлюємо мітку на свою область DTA

      mov ah, 1Ah

      int 21h

      call WLabel; виводимо мітку диску

      mov ah, 4eh; функція знаходить перший каталог з маскою *.*

      mov cx, 10h; В CX — атрибут каталогу — 10h

      lea dx, path; В DX — шлях для пошуку

      int 21h

      jc NowFiles; якщо каталогу немає шукаємо файли

      call WrtDir; виводимо імя першого знайденого каталогу

      JMPFINDNEXTDIR

      FindNextDir:

      mov ah, 4fh; функція продовжує пошук функції 4eh

      int 21h

      jc NowFiles; якщо каталогу немає шукаємо файли

      call WrtDir; виводимо знайдений каталог

      jmp FindNextDir; переходимо на пошук іншого

      NowFiles:

      mov ah, 4eh; функція знаходить перший файл з маскою *.*

      mov cx, 27h; В CX — атрибут файла — 27h (RO+Hid+Sys+Arc)

      lea dx, path; В DX — шлях для пошуку файлів

      int 21h

      jc halt; якщо файлів немає то на вихід

      call WrtFile; якщо файл знайдено то виводимо його імя

      FindNextFile:

      mov ah, 4fh; функція продовжує пошук файлів

      int 21h

      jc halt; якщо більше файлів немає то на вихід

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

      jmp FindNextFile; переходимо на пошук наступного файлу

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

      ret; вихід в DOS

      ;:

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

      ;:

      WrtTime proc near

      mov ah, 9

      lea dx, space

      int 21h

      mov ax, TimeF

      shr ax, 11

      call DecWrt

      mov ax, 0e3ah

      int 10h

      mov ax, TimeF

      shl ax, 5

      shr ax, 10

      call DecWrt

      mov ax, 0e3ah

      int 10h

      mov ax, TimeF

      shl ax, 11

      shr ax, 10

      call DecWrt

      ret

      WrtTime endp

      ;:

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

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

      ;:

      ClrName proc near

      lea si, NameF; отримаємо адресу імені файлу

      mov cx, 1

      rp: cmp cx, 13; якщо CX=13, то імя опрацьовано повністю

      je vihod; тому виходимо

      mov al, 0; заносимо код символа 0 (пустий символ)

      mov [si], al; записуємо пустий символ у стрічку NameF

      inc si; збільшуємо адресу стрічки

      inc cx; збільшуємо лічильник записаних символів

      jmp rp; повторюємо цикл

      vihod: ret

      ClrName endp

      ;:

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

      ;:

      WrtDir proc near

      cmp AttrF, 10h; перевіряємо атрибут: якщо 10h, то це каталог

      jne exit1; Иначе на выход

      mov ah, 40h; функція виводу стрічки

      mov bx, 01

      mov cx, 12; виводимо 13 символів

      lea dx, NameF; В DX — адреса стрічки виводу

      int 21h

      mov ah, 9

      lea dx, dirstr

      int 21h

      call WrtTime

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

      exit1: call ClrName; чистимо поле виводу

      ret

      dirstr db '

        $'

        WrtDir endp

        ;:

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

        ;:

        WrtFile proc near

        cmp AttrF, 10h; перевіряємо атрибут: якщо це не файл то виходимо

        je exit2

        lea si, NameF; завантажуємо адресу стрічки в SI

        mov cx, 1

        loop1:

        cmp cx, 13; перевіряєм, якщо CX=13, то вивід закінчено

        je exit2; вихід

        mov al,[si]; заносимо в AL символ що потрібно вивести

        cmp al, 65; порівнюємо його з 'A'

        jl skip1; якщо менше, то не переводимо в нижній регістр

        cmp al, 90; порівнюємо AL з 'Z'

        jg skip1; якщо більше то не переводимо в нижній регістр

        add al, 32; переводимо симвіл в нижній регістр

        skip1:

        mov dl, al

        mov ah, 02; функція виводу символа на екран

        int 21h

        inc si; збільшуємо адресу

        inc cx; збільшуємо лічильник

        jmp loop1; переходимо на наступний симвіл

        exit2:

        call ClrName; чистимо поле виводу

        mov ah, 9

        lea dx, spk

        int 21h

        call WrtTime

        mov ah, 9

        lea dx, spk

        int 21h

        mov ax, word ptr SizeF

        mov dx, word ptr SizeF+2

        call Decimal

        call crlf

        ret

        spk db ' $'

        WrtFile endp

        ;:

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

        ;:

        WLabel proc near

        call ClrName; чистимо поле виводу

        mov ah, 9; функція виводу стрічки на екран

        lea dx, StringL; В DX — адреса стрічки

        int 21h

        lea si, path4

        mov ah, 19h; отримаємо активний диск

        int 21h

        add al, 41h; переводимо його в букву

        mov [si], al; заносимо в тимчасову стрічку

        lea si, path; шлях пошуку

        lea di, path4; тимчасова стрічка

        mov al,[si]; перемо перший символ шляху пошуку

        cmp al, 65; літера диску 'A'?

        jl not_xchg ;якшо менше, выходимо

        cmp al, 122; Буква диску 'z'?

        jg not_xchg; якщо більше, виходимо

        cmp al, 91; якщо '[' - вихід

        je not_xchg

        cmp al, 92; якщо '' - вихід

        je not_xchg

        cmp al, 93; якщо ']' - вихід

        je not_xchg

        cmp al, 94; якщо '^' - вихід

        je not_xchg

        cmp al, 95; якщо '_' - вихід

        je not_xchg

        cmp al, 96; якщо '`' - вихід

        je not_xchg

        mov [di], al

        not_xchg:

        mov ah, 4eh; шукаємо файл

        mov cx, 08h; с атрибутом 08h, т. е. мітку тому

        lea dx, path4; В DX — шлях для пошуку

        int 21h

        mov ah, 40h; функція виводу стрічки на екран

        mov bx, 01

        mov cx, 13; виводимо 13 символів

        lea dx, NameF; В DX — адреса стрічки

        int 21h

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

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

        call ClrName; чистим поле виводу

        ret

        StringL db 'Metka Diska: $'

        path4 db 'c:*.*', 0; перший симвіл буде замінений на активний диск

        WLabel endp

        ;:

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

        ;:

        crlf proc near

        mov ax, 0e0dh; функція виводу символа

        int 10h; виводимо симвіл 13 на екран

        mov ax, 0e0ah; функція виводу символа

        int 10h; виводимо символ 10 на екран

        ret

        crlf endp

        ;:

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

        ;:

        curdir proc near

        mov ah, 9; функція виводу стрічки

        lea dx, stringC; В DX — адреса стрічки

        int 21h; виводимо стрічку 'Tekyshi katalog'

        lea si, path

        mov ah, 19h; отримаємо активний диск

        int 21h

        add al, 41h; переводимо його в літеру

        mov [si], al

        inc si

        mov al, 58; додаємо симвіл ':'

        mov [si], al

        inc si

        mov al, 92; додаємо симвіл ''

        mov [si], al

        mov ah, 47h; функція отримання активного каталогу

        mov dl, 00

        lea si, path+3; додаємо до диску каталог

        int 21h

        lea si, path; посимвольно виводимо повний шлях

        a10loop:

        cmp byte ptr [si], 0

        je a20exit

        mov al,[si]

        mov dl, al

        mov ah, 02

        int 21h

        inc si

        jmp a10loop

        a20exit:

        ; додаємо до активного шляху маску *.* для пошуку каталогів і файлів

        dec si; зменшуємо адресу на 1 и отримуємо останній

        mov al,[si]; симвіл, а не NUL

        inc si; повертаємо назат SI

        cmp al, 92; перевіряємо якщо останій симвіл — слэш, то выхід

        je skip_slash

        mov al, 92; інакше додаємо симвіл ''

        mov [si], al

        inc si

        skip_slash:

        mov al, 42; додаємо симвіл '*'

        mov [si], al

        inc si

        mov al, 46; додаємо симвіл '.'

        mov [si], al

        inc si

        mov al, 42; додаємо симвіл '*'

        mov [si], al

        inc si

        mov al, 0; додаємо симвіл NUL

        mov [si], al

        call crlf

        ret

        stringC db 13,10,'Tekyshi katalog $'

        curdir endp

        Div1024 proc near

        mov cx, 10

        dd20: shr ax, 1

        shr dx, 1

        jnc dd30

        or ah, 1 000 0000b

        dd30: loop dd20

        ret

        Div1024 endp

        DecWrt proc near

        lea si, outst; очищаємо стрічку

        mov cl, 0

        mov [si], cl

        mov [si+1], cl

        lea si, outst

        mov cl, 48

        mov [si], cl

        mov cx, 0010

        lea si, outst+1

        a20: cmp ax, 0010

        jb a30

        xor dx, dx

        div cx

        or dl, 30h

        mov [si], dl

        dec si

        jmp a20

        a30: or al, 30h

        mov [si], al

        mov ah, 40h; виводимо стрічку

        mov bx, 01

        mov cx, 02

        lea dx, outst

        int 21h

        ret

        outst db ' '

        DecWrt endp

        Decimal proc

        cmp ax, 1024d

        ja do01

        calldes

        mov ah, 9

        lea dx, bite

        int 21h

        jmpexitr

        do01:

        call Div1024

        calldes

        mov ah, 9

        lea dx, kbite

        int 21h

        jmpexitr

        exitr:

        ret

        bite db '/B$'

        kbite db'/KB$'

        Decimal endp

        des proc near

        push ax

        push cs

        pop ds

        mov si, offset dodat+5

        do:

        mov cx, 10

        xor dx, dx

        div cx

        add dl, 48

        dec si

        mov cs:[si], dl

        cmp ax, 0

        jz do1

        jmp do

        do1:

        mov ah, 09

        mov dx, si

        int 21h

        pop ax

        ret

        dodatdb5 dup (' '),'$'

        des endp

        end begin

        ДОДАТОК Б

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

Показати весь текст
Заповнити форму поточною роботою