Курсовая работа: Побудова дерева каталогів диску і реалізація можливості переходу у вибраний каталог
Название: Побудова дерева каталогів диску і реалізація можливості переходу у вибраний каталог Раздел: Рефераты по информатике, программированию Тип: курсовая работа |
Міністерство освіти та науки України Кіровоградський Державний Технічний університетКафедра програмного забезпечення Курсов ий проект з дисципліни «Програмування на мові ASM-86» на тему: «Побудова дерева каталогів дискуі реалізація можливості переходу у вибраний каталог» Зміст Завдання Вступ 1. Постановка задачі 2. Обґрунтування вибору методів розв’язку задачі 3. Алгоритм програми 4. Реалізація програми 5. Системні вимоги 6. Інструкція для користувача Висновки Використана література Лістинг програми Вступ Як відомо, дискова інформація в комп’ютерах записується у вигляді файлів. На дисках, крім файлів, існують також директорії. Завдяки цьому на диску можна групувати файли. Структура інформації на диску нагадує дерево. Так, кореневий каталог – це «вершина» дерева, а нижче ідуть «гілки» піддиректорій. Для перегляду дерева каталогів і «мандрів» по ньому можна використовувати засоби ДОС або програми-оболонки. Можна також створити спеціальні програми. У даній роботі розглянута програма побудови дерева каталогів диску, вона дає змогу вибрати і перейти в потрібний каталог. 1. Постановка задачі Використовуючи мову асемблера, написати програму, яка б дозволяла відобразити на екрані дерево каталогів на диску і перейти в потрібний користувачеві каталог. 2 . Обґрунтування вибору методів розв’язку задачі Для пошуку каталогів на диску доцільно використовувати функції DOS переривання 21. Перша з них (4еh) шукає перший файл, який підходить до шаблону і атрибутів, і 4fh, яка шукає наступний файл. При знайденні каталогу відбувається перехід в нього і знову викликається (рекурсивно) функція аналізу каталога. Таким чином, у пам’яті створюється структура, яка зберігає імена директорій та рівень їх вкладеності. Після сканування відбувається відображення першого кадру дерева. Керування клавіатурою здійснюється за допомогою переривання 16. Виведення на екран здійснюється також з використанням функцій ДОС 21 переривання. 3. Алгоритм програми 1. Виділити пам’ять 2. Перейти в кореневий каталог 3. Знайти каталог на диску. 4. Перейти в нього і зберегти в пам’яті його ім’я 5. Рекурентно перейти на пункт 3. 6. Якщо каталог не знайдено, то припинити сканування. 7. Очистити екран. 8. Вивести на екран 24 рядки каталогів 9. При натисканні клавіш «вгору», «вниз» прокручувати дерево. 10. При натисненні «ENTER» сформувати шлях і перейти в заданий каталог. 11. Кінець 4. Реалізація програми Після початку роботи програми виділяється пам’ять для зберігання дерева каталогів. Потім за наведеним алгоритмом відбувається рекурсивне сканування дерева каталогів. Для реалізації рекурсії використовується зменшення показника стеку і копіювання області DTAу стек. Після виходу з рекурсії – область DTAдля конкретного каталогу відновлюється. Після сканування екран очищується шляхом запису нулів у відеопам'ять. Після цього засобами 21 переривання у циклі з відступами виводяться назви каталогів в тому порядку, в якому вони записані в пам’яті. Виведення виводить процедура, починаючи з певної позиції. При натисканні клавіш відбувається зміна позиції і перемалювання екрану. Для переходу в заданий каталог використовується функція 3bh21 переривання. 5. Системні вимоги Програма працює на IBM-PC-сумісних комп’ютерах з мікропроцесором INTEL 8086 або старшим. Необхідно 640 КБайт пам’яті, монітор CGA або старший, а також накопичувач на жорстких чи гнучких магнітних дисках. Необхідна також операційна система MS-DOS або сумісна з нею (Windows). 6. Інструкція для користувачаДля роботи треба запустити програму tree.com. Після цього на екрані після деякої паузи (відбувається сканування дерева) виводиться дерево каталогів. По ньому можна переміщуватися клавішами «вгору» та «вниз». Верхній каталог виділено кольором. Якщо натиснути Enter, відбудеться перехід в заданий каталог. Вихід з програми здійснюється за допомогою клавіші ESC. ВисновкиОтже, створена програма, яка дозволяє працювати з деревом каталогів диску. Вона є прикладом для роботи на асемблері з функціями пошуку файлів в каталозі, а також роботи з пам’яттю. Використана література 1. Роберт Журден. Справочник программиста на персональном компьютере фирмы IBM 2. П. Абель. Ассемблер для IBMPC Лістинг програми modeltiny 386 code org 100h start: jmp begin mem_er db 'memory fault! $' scan_msg db 'Scanning…$' all_dir db '*.*', 0 up_dir db '..', 0 r_dir db '\', 0 recurse_level db 0 names_offset dw 0 dirnum dw 0 dirpos dw 0 path db '\', 100 dup(0); path change_dir proc mov si, word ptr [dirpos] mov al, byte ptr fs: [si]; level inc al xor ah, ah; counter mov di, offset path+1 next_level: cmp ah, al je stop_path ; шукаємо каталог позаду з рiвнем ah push si find_level: cmp byte ptr fs: [si], ah je found_level sub si, 14 jmp find_level found_level: inc si mov dl, byte ptr fs: [si] cmp dl, 0 je stop_dir mov byte ptr [di], dl inc di jmp found_level stop_dir: mov byte ptr [di], '\' inc di pop si inc ah jmp next_level stop_path: mov byte ptr [di-1], 0 ; chdir mov ah, 3bh mov dx, offset path int 21h ret change_dir endp scan_dir proc mov ah, 2fh int 21h ; findfirst mov ah, 4eh mov cx, 10h mov dx, offset all_dir int 21h findnext: jc stop_find cmp byte ptr [bx+15h], 10h jne skip_nodir cmp byte ptr [bx+1eh], '.' je skip_nodir mov di, word ptr cs: [names_offset] mov al, byte ptr cs: [recurse_level] mov byte ptr fs: [di], al inc di mov si, bx add si, 1eh cld mov cx, 13 push es push fs pop es rep movsb pop es ; chdir mov ah, 3bh mov dx, bx add dx, 1eh int 21h jc skip_nodir; error add word ptr cs: [names_offset], 14 add word ptr cs: [recurse_level], 1 add word ptr cs: [dirnum], 1 ; save dta sub sp, 2bh mov di, sp mov si, bx mov cx, 2bh rep movsb call scan_dir mov si, sp mov di, bx mov cx, 2bh rep movsb add sp, 2bh ; restore dta sub word ptr cs: [recurse_level], 1 ; chdir. mov ah, 3bh mov dx, offset up_dir int 21h skip_nodir: mov ah, 4fh int 21h jmp findnext stop_find: ret scan_dir endp show_dirs proc ; clrscr draw_screen: push es mov ax, 0b800h mov es, ax xor di, di mov ax, 1c00h mov cx, 80 rep stosw mov di, 80 mov cx, 2000–80 mov ax, 0700h rep stosw pop es mov ah, 2 xor dx, dx xor bh, bh int 10h mov cx, 24 mov di, word ptr cs: [dirpos] draw_name: mov si, di push cx xor cx, cx mov cl, byte ptr fs: [si] inc cx mov ah, 2 mov dl, ' ' set_spac: int 21h int 21h int 21h loop set_spac pop cx inc si next_let: mov dl, byte ptr fs: [si] cmp dl, 0 je next_name mov ah, 2 int 21h inc si jmp next_let next_name: mov ah, 2 mov dl, 10 int 21h mov dl, 13 int 21h add di, 14 loop draw_name xor ah, ah int 16h cmp ah, 50h jne no_50h ; down mov ax, word ptr cs: [dirpos] add ax, 14 mov word ptr cs: [dirpos], ax jmp draw_screen no_50h: cmp ah, 48h jne no_48h ; up mov ax, word ptr cs: [dirpos] cmp ax, 0 je draw_screen sub ax, 14 mov word ptr cs: [dirpos], ax jmp draw_screen no_48h: cmp ah, 1 je stop_s cmp ah, 1ch jne draw_screen ; chdir call change_dir jmp stop_s jmp draw_screen stop_s: ret show_dirs endp begin: mov bx, 4096 mov ah, 4ah int 21h mov ax, bx shl ax, 4 mov sp, ax mov ah, 48h mov bx, 1000h int 21h jc mem_errr mov fs, ax push es push fs pop es xor di, di mov cx, 0ffffh xor ax, ax rep stosb pop es mov dx, offset scan_msg mov ah, 9 int 21h mov ah, 3bh mov dx, offset r_dir int 21h call scan_dir call show_dirs push fs pop es mov ah, 49h int 21h mov ah, 4ch int 21h mem_errr: mov ah, 9 mov dx, offset mem_Er int 21h en db? end start |