Курсовая работа: Переглядач для файлів різних типів з визначенням типу файлу по розширенню і відповідно способу перегляду 2
Название: Переглядач для файлів різних типів з визначенням типу файлу по розширенню і відповідно способу перегляду 2 Раздел: Рефераты по информатике Тип: курсовая работа | |
Міністерство освіти та науки України Кіровоградський Державний Технічний університетКафедра програмного забезпечення Курсова робота з дисципліни “Програмування на мові ASM-86” на тему: “Переглядач для файлів різних типів, з визначенням типу файлу по розширенню і, відповідно, способу перегляду (txt, hex,bin)” Зміст Вступ 1. Постановка задачі 2. Обґрунтування вибору методів розв’язку задачі 3. Алгоритм програми 4. Реалізація програми 5. Системні вимоги 6. Інструкція для користувача Висновки Використана література Лістинг програми Вступ При роботі з файлами їх буває необхідно переглянути. Для цього необхідно використовувати програми-переглядачі, які забезпечують прокрутку тексту у вікні перегляду. Іноді виникає потреба переглядати файли не лише в текстовому, а в інших форматах, зокрема в шістнадцятеричному та бінарному. Переглядач, який розроблено в роботі, дозволяє переглядати файли у вказаних трьох режимах. 1. Постановка задачі Необхідно розробити програму-переглядач файлів у різному вигляді – війковому, шістнадцятеричному або текстовому, тип перегляду повинен визначатися за розширенням файлу. 2 . Обґрунтування вибору методів розв’язку задачі Для роботи з відео зручно використовувати прямий доступ до відеопам’яті, оскільки такий спосіб має високу ефективність. Для роботи з файлами – функції ДОС (21 переривання). Для обробки клавіатури будемо використовувати функції прокрутки зображення. Ці функції для спрощення будуть різними для різних типів файлів, оскільки необхідно по-різному обчислювати зміщення при прокрутці і по-різному відображати інформацію. Для програми використовується модель “small” пам’яті, цього достатньо для невеликих файлів. 3 . Алгоритм програми 1. Введення імені файла. 2. Визначення типу файла за символами в розширенні. 3. Читання змісту файла в пам’ять. 4. Очікування натиснення клавіші. 5. Якщо натиснута клавіша “сторінка вгору”, то 24 рази викликати ф-цію прокрутки вгору на 24 рядки. 6. Якщо натиснута клавіша “сторінка вниз”, то 24 рази викликати ф-цію прокрутки вниз на 24 рядки. 7. Якщо натиснута клавіша “вниз”, то збільшити вказівник кадру на довжину верхнього рядка. 8. Якщо натиснута клавіша “вгору”, то зменшити вказівник кадру на довжину рядка, який знаходиться над верхнім рядком (поза кадром). 9. Відобразити новий кадр на екран. 10. Якщо натиснута клавіша ESC, то завершити програму. 11. Перейти на п. 4. і продовжити роботу. 4 . Реалізація програми Після початку роботи програма запитує користувача про ім’я файла, який треба переглянути і робить спробу відкрити його. Якщо нема помилки, то з імені визначається його тип і у змінні в програмі заноситься інформація про тип. Введення з клавіатури здійснюється з використанням функцій DOS. При перегляді використовується запис текстової інформації у відеопам’ять. Після відкриття і читання файла програма чекає на натиснення клавіші. Використовується переривання 16 – функція 0. Потім аналізується код клавіші. Якщо код = 1 (вихід), то програма завершує роботу. Обробляються також клавіші “вгору”, “вниз”, “сторінка вгору” і “сторінка вниз”. Програма містить 3 групи функцій для кожного типу перегляду, кожна з яких містить по 3 функції: відображення на екрані поточного кадру, прокрутка зображення вгору і вниз. Програма містить вказівник, який показує відстань від початку тексту до початку поточного кадру. При прокрутці вниз він збільшується (якщо досягне довжини 32000 – стає 0), а при прокрутці вгору – зменшується (якщо 0, то стоїть на місці – прокрутки немає). При натисненні клавіш “сторінка вгору” і “сторінка вниз” прокрутка відбувається на 24 рядки у відповідному напрямку. 5 . Системні вимоги Програма буде працювати на комп’ютері з процесором 80386 і старшим, 640 К і більше пам’яті, монітором CGA і вище. Необхідний дисковий накопичувач. 6. Інструкція для користувача Для того, щоб переглянути файл, необхідно запустити на виконання файл thbview.exe. На екран буде виведено запит на введення імені файлу, який існує на диску. Можна ввести також і шлях. Якщо не виникне помилки, то після вводу на екрані з’явиться зміст файла у вигляді рядків тексту (файл TXT), шістнадцятеричного коду (файл HEX) або війкового формату (зображення всіх службових символів – BIN). Для переміщення можна використовувати клавіші “вгору”, “вниз”, “PgUp”, “PgDn”. Для виходу натисніть клавішу ESC. При досягненні нижньої границі тексту перегляд буде переведено на початок файла. А при досягненні верхньої границі прокрутка здійснюватись не буде. Розмір файла повинен бути меншим за 32 кілобайти. Висновки Отже, завдяки виконанню роботи, створена програма – переглядач для невеликих текстових файлів з розширеннями TXT (текстовий файл), HEX (шістнадцятеричний формат) та BIN (бінарний). Проілюстровані можливості виведення на екран на асемблері, роботу з файлами та пам’яттю. Програма має вигляд EXE-файла і невибаглива до ресурсів машини. Використана література 1. Том Сван. Освоение TurboAssembler. М., Діалектика, 1996 2. Зубков Д.Д. Программирование на Assembler для DOS, WINDOWS и UNIX. М., ДМК, 2000 Лістинг програми .model compact .386 .stack 1000 .data file db 32767 dup(0) handle dw 0 errmsg db 'Помилка читання!$' msg_enter db 'Введiть iм`я файла (.txt, .bin, .hex): $' filename db 40 dup(0) filelength dw 0 filetype db 2 ;2-txt,0-hex,1-bin filepointer dw 0 ;вказiвник на початок кадра .code start: jmp begin ;================================== T X T ;показ дампа для вигляду txt showtxtdump proc pusha ;очистка mov ax,0b800h mov es,ax cld mov cx,2000 xor di,di mov ax,0700h rep stosw mov bx,word ptr fs:[filepointer] add bx,offset file mov bp,offset file add bp,32767 xor si,si xor di,di txt_l: mov al,byte ptr fs:[bx] inc bx cmp al,10 je tskip cmp al,13 jne tput add si,80*2 shl di,1 sub si,di xor di,di jmp tskip tput: mov byte ptr es:[si],al add si,2 inc di tskip: cmp bx,bp jb txt_loop mov bx,offset file mov word ptr fs:[filepointer],0 txt_loop: cmp si,4000 jb txt_l cmp bx,bp jb txt_sav sub bx,bp txt_sav: popa ret showtxtdump endp ;================================================= scroll_downtxt proc pusha ;пiдраховуємо довжину 1 рядка mov bx,word ptr fs:[filepointer] add bx,offset file xor dx,dx no_len: inc dx cmp byte ptr fs:[bx],10 je len_ok inc bx cmp dx,80 jb no_len len_ok: mov bx,word ptr fs:[filepointer] mov ax,bx add ax,offset file+32767 sub ax,dx cmp bx,ax jae tok_scru add bx,dx tok_scru: mov word ptr fs:[filepointer],bx call showtxtdump popa ret scroll_downtxt endp ;================================================= scroll_uptxt proc pusha ;пiдраховуємо довжину 1 рядка mov bx,word ptr fs:[filepointer] add bx,offset file-2 xor dx,dx uno_len: inc dx cmp byte ptr fs:[bx],13 je ulen_ok dec bx cmp dx,80 jb uno_len ulen_ok: mov bx,word ptr fs:[filepointer] cmp bx,dx ja tok_up mov bx,dx tok_up: sub bx,dx mov word ptr fs:[filepointer],bx call showtxtdump popa ret scroll_uptxt endp ;================================= scroll_pgdntxt proc pusha mov cx,24 tsdn: call scroll_downtxt loop tsdn popa ret scroll_pgdntxt endp ;================================= scroll_pguptxt proc pusha mov cx,24 tsdu: call scroll_uptxt loop tsdu popa ret scroll_pguptxt endp ;================================== H E X ;показ дампа для вигляду hex showhexdump proc pusha mov cx,20*25 mov bx,word ptr fs:[filepointer] add bx,offset file mov bp,offset file add bp,32767 mov ax,0b800h mov es,ax xor si,si xor di,di hex_l: mov al,byte ptr fs:[bx] inc bx mov dl,al and dl,15 add dl,30h cmp dl,39h jbe h_1 add dl,7 h_1: mov byte ptr es:[si+2],dl ;============== mov dl,al shr dl,4 add dl,30h cmp dl,39h jbe h_2 add dl,7 h_2: mov byte ptr es:[si],dl mov byte ptr es:[si+4],0 add si,6 inc di cmp di,20 jne ok_hex xor di,di add si,(80-3*20)*2 ok_hex: cmp bx,bp jb hex_loop mov bx,offset file mov word ptr fs:[filepointer],0 hex_loop: loop hex_l cmp bx,bp jb hex_sav sub bx,bp hex_sav: popa ret showhexdump endp ;================================================= scroll_downhex proc pusha mov bx,word ptr fs:[filepointer] mov ax,bx add ax,offset file+32767-20 cmp bx,ax jae hok_scru add bx,20 hok_scru: mov word ptr fs:[filepointer],bx call showhexdump popa ret scroll_downhex endp ;================================================= scroll_uphex proc pusha mov bx,word ptr fs:[filepointer] cmp bx,20 ja hok_up mov bx,20 hok_up: sub bx,20 mov word ptr fs:[filepointer],bx call showhexdump popa ret scroll_uphex endp ;================================= scroll_pgdnhex proc pusha mov cx,24 hsdn: call scroll_downhex loop hsdn popa ret scroll_pgdnhex endp ;================================= scroll_pguphex proc pusha mov cx,24 hsdu: call scroll_uphex loop hsdu popa ret scroll_pguphex endp ;================================== B I N ;показ дампа для вигляду bin showbindump proc pusha mov cx,2000 mov bx,word ptr fs:[filepointer] add bx,offset file mov bp,offset file add bp,32767 mov ax,0b800h mov es,ax xor si,si bin_l: mov al,byte ptr fs:[bx] mov byte ptr es:[si],al inc bx cmp bx,bp jb bin_loop mov bx,offset file mov word ptr fs:[filepointer],0 bin_loop: inc si inc si loop bin_l cmp bx,bp jb bin_sav sub bx,bp bin_sav: popa ret showbindump endp ;================================================= scroll_downbin proc pusha mov bx,word ptr fs:[filepointer] mov ax,bx add ax,offset file+32767-80 cmp bx,ax jae ok_scru add bx,80 ok_scru: mov word ptr fs:[filepointer],bx call showbindump popa ret scroll_downbin endp ;================================================= scroll_upbin proc pusha mov bx,word ptr fs:[filepointer] cmp bx,80 ja ok_up mov bx,80 ok_up: sub bx,80 mov word ptr fs:[filepointer],bx call showbindump popa ret scroll_upbin endp ;================================= scroll_pgdnbin proc pusha mov cx,24 sdn: call scroll_downbin loop sdn popa ret scroll_pgdnbin endp ;================================= scroll_pgupbin proc pusha mov cx,24 sdu: call scroll_upbin loop sdu popa ret scroll_pgupbin endp ;================================== getfilename proc pusha ;введення iменi файла push fs pop ds mov dx,offset msg_enter mov ah,9 int 21h mov bx,offset filename ent_l: mov ah,1 int 21h cmp al,13 mov byte ptr ds:[bx],al inc bx cmp al,13 jne ent_l dec bx mov byte ptr ds:[bx],0 ;визначення типу файла mov bx,offset filename dec bx name_s: inc bx mov al,byte ptr fs:[bx] cmp al,0 jne name_s sub bx,2 mov ah,byte ptr fs:[bx] mov al,byte ptr fs:[bx+1] cmp ax,6578h ;HEX jne other1 mov byte ptr fs:[filetype],1 jmp typ_exit other1: cmp ax,696eh ;BIN jne other2 mov byte ptr fs:[filetype],0 jmp typ_exit other2: mov byte ptr fs:[filetype],2 ;TXT typ_exit: popa ret getfilename endp ;================================== readfile proc pusha ;open mov ah,3dh xor al,al push fs pop ds mov dx,offset filename int 21h jc read_error mov bx,ax ;read mov ah,3fh mov cx,32767 push fs pop ds mov dx,offset file int 21h jc read_error mov word ptr fs:[filelength],ax ;close mov ah,3eh mov bx,word ptr fs:[handle] int 21h popa ret read_error: push fs pop ds mov dx,offset errmsg mov ah,9 int 21h popa mov ah,4ch int 21h readfile endp ;================================== begin: xor ah,ah mov al,3 int 10h mov ax,seg handle mov fs,ax call getfilename call readfile mov ah,5 mov ch,48h int 16h work: mov ah,0 int 16h mov bl,byte ptr fs:[filetype] cmp ah,50h jne work_1 cmp bl,0 jne d1 call scroll_downbin jmp work d1: cmp bl,1 jne d2 call scroll_downhex jmp work d2: call scroll_downtxt jmp work work_1: cmp ah,48h jne work_2 cmp bl,0 jne u1 call scroll_upbin jmp work u1: cmp bl,1 jne u2 call scroll_uphex jmp work u2: call scroll_uptxt jmp work work_2: cmp ah,51h jne work_3 cmp bl,0 jne pd1 call scroll_pgdnbin jmp work pd1: cmp bl,1 jne pd2 call scroll_pgdnhex jmp work pd2: call scroll_pgdntxt jmp work work_3: cmp ah,49h jne work_4 cmp bl,0 jne pu1 call scroll_pgupbin jmp work pu1: cmp bl,1 jne pu2 call scroll_pguphex jmp work pu2: call scroll_pguptxt jmp work work_4: cmp ah,1 jne work mov ah,4ch int 21h end start Блок-схема алгоритму
|