|
Побудова дерева каталогів диску і реалізація можливості переходу у вибраний каталог
Побудова дерева каталогів диску і реалізація можливості переходу у вибраний каталог
Міністерство освіти та науки України Кіровоградський Державний Технічний університетКафедра програмного забезпеченняКурсовий проект з дисципліни «Програмування на мові 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 переривання у циклі з відступами виводяться назви каталогів в тому порядку, в якому вони записані в пам'яті. Виведення виводить процедура, починаючи з певної позиції. При натисканні клавіш відбувається зміна позиції і перемалювання екрану. Для переходу в заданий каталог використовується функція 3bh 21 переривання. 5. Системні вимоги Програма працює на IBM-PC-сумісних комп'ютерах з мікропроцесором INTEL 8086 або старшим. Необхідно 640 КБайт пам'яті, монітор CGA або старший, а також накопичувач на жорстких чи гнучких магнітних дисках. Необхідна також операційна система MS-DOS або сумісна з нею (Windows). 6. Інструкція для користувачаДля роботи треба запустити програму tree.com. Після цього на екрані після деякої паузи (відбувається сканування дерева) виводиться дерево каталогів. По ньому можна переміщуватися клавішами «вгору» та «вниз». Верхній каталог виділено кольором. Якщо натиснути Enter, відбудеться перехід в заданий каталог. Вихід з програми здійснюється за допомогою клавіші ESC.ВисновкиОтже, створена програма, яка дозволяє працювати з деревом каталогів диску. Вона є прикладом для роботи на асемблері з функціями пошуку файлів в каталозі, а також роботи з пам'яттю.Використана література1. Роберт Журден. Справочник программиста на персональном компьютере фирмы IBM2. П. Абель. Ассемблер для IBM PCЛістинг програмиmodel tiny386codeorg 100hstart:jmp beginmem_er db 'memory fault! $'scan_msg db 'Scanning…$'all_dir db '*.*', 0up_dir db '..', 0r_dir db '\', 0recurse_level db 0names_offset dw 0dirnum dw 0dirpos dw 0path db '\', 100 dup(0); pathchange_dir procmov si, word ptr [dirpos]mov al, byte ptr fs: [si]; levelinc alxor ah, ah; countermov di, offset path+1next_level:cmp ah, alje stop_path; шукаємо каталог позаду з рiвнем ahpush sifind_level:cmp byte ptr fs: [si], ahje found_levelsub si, 14jmp find_levelfound_level:inc simov dl, byte ptr fs: [si]cmp dl, 0je stop_dirmov byte ptr [di], dlinc dijmp found_levelstop_dir:mov byte ptr [di], '\'inc dipop siinc ahjmp next_levelstop_path:mov byte ptr [di-1], 0; chdirmov ah, 3bhmov dx, offset pathint 21hretchange_dir endpscan_dir procmov ah, 2fhint 21h; findfirstmov ah, 4ehmov cx, 10hmov dx, offset all_dirint 21hfindnext:jc stop_findcmp byte ptr [bx+15h], 10hjne skip_nodircmp byte ptr [bx+1eh], '.'je skip_nodirmov di, word ptr cs: [names_offset]mov al, byte ptr cs: [recurse_level]mov byte ptr fs: [di], alinc dimov si, bxadd si, 1ehcldmov cx, 13push espush fspop esrep movsbpop es; chdirmov ah, 3bhmov dx, bxadd dx, 1ehint 21hjc skip_nodir; erroradd word ptr cs: [names_offset], 14add word ptr cs: [recurse_level], 1add word ptr cs: [dirnum], 1; save dtasub sp, 2bhmov di, spmov si, bxmov cx, 2bhrep movsbcall scan_dirmov si, spmov di, bxmov cx, 2bhrep movsbadd sp, 2bh; restore dtasub word ptr cs: [recurse_level], 1; chdir.mov ah, 3bhmov dx, offset up_dirint 21hskip_nodir:mov ah, 4fhint 21hjmp findnextstop_find:retscan_dir endpshow_dirs proc; clrscrdraw_screen:push esmov ax, 0b800hmov es, axxor di, dimov ax, 1c00hmov cx, 80rep stoswmov di, 80mov cx, 2000-80mov ax, 0700hrep stoswpop esmov ah, 2xor dx, dxxor bh, bhint 10hmov cx, 24mov di, word ptr cs: [dirpos]draw_name:mov si, dipush cxxor cx, cxmov cl, byte ptr fs: [si]inc cxmov ah, 2mov dl, ' 'set_spac:int 21hint 21hint 21hloop set_spacpop cxinc sinext_let:mov dl, byte ptr fs: [si]cmp dl, 0je next_namemov ah, 2int 21hinc sijmp next_letnext_name:mov ah, 2mov dl, 10int 21hmov dl, 13int 21hadd di, 14loop draw_namexor ah, ahint 16hcmp ah, 50hjne no_50h; downmov ax, word ptr cs: [dirpos]add ax, 14mov word ptr cs: [dirpos], axjmp draw_screenno_50h:cmp ah, 48hjne no_48h; upmov ax, word ptr cs: [dirpos]cmp ax, 0je draw_screensub ax, 14mov word ptr cs: [dirpos], axjmp draw_screenno_48h:cmp ah, 1je stop_scmp ah, 1chjne draw_screen; chdircall change_dirjmp stop_sjmp draw_screenstop_s:retshow_dirs endpbegin:mov bx, 4096mov ah, 4ahint 21hmov ax, bxshl ax, 4mov sp, axmov ah, 48hmov bx, 1000hint 21hjc mem_errrmov fs, axpush espush fspop esxor di, dimov cx, 0ffffhxor ax, axrep stosbpop esmov dx, offset scan_msgmov ah, 9int 21hmov ah, 3bhmov dx, offset r_dirint 21hcall scan_dircall show_dirspush fspop esmov ah, 49hint 21hmov ah, 4chint 21hmem_errr:mov ah, 9mov dx, offset mem_Erint 21hen db?end start
|
|