|
Переглядач для файлів різних типів, з визначенням типу файлу по розширенню і, відповідно, способу перегляду (txt, hex, bin)
Переглядач для файлів різних типів, з визначенням типу файлу по розширенню і, відповідно, способу перегляду (txt, hex, bin)
Міністерство освіти та науки України Кіровоградський Державний Технічний університетКафедра програмного забезпеченняКурсова роботаз дисципліни “Програмування на мові 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. Том Сван. Освоение Turbo Assembler. М., Діалектика, 19962. Зубков Д.Д. Программирование на Assembler для DOS, WINDOWS и UNIX. М., ДМК, 2000Лістинг програми.model compact.386.stack 1000.datafile db 32767 dup(0)handle dw 0errmsg db 'Помилка читання!$'msg_enter db 'Введiть iм`я файла (.txt, .bin, .hex): $'filename db 40 dup(0)filelength dw 0filetype db 2 ;2-txt,0-hex,1-binfilepointer dw 0 ;вказiвник на початок кадра.codestart: jmp begin;================================== T X T;показ дампа для вигляду txtshowtxtdump 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,ditxt_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 tskiptput: mov byte ptr es:[si],al add si,2 inc ditskip: cmp bx,bp jb txt_loop mov bx,offset file mov word ptr fs:[filepointer],0txt_loop: cmp si,4000 jb txt_l cmp bx,bp jb txt_sav sub bx,bptxt_sav: popa retshowtxtdump endp;=================================================scroll_downtxt proc pusha ;пiдраховуємо довжину 1 рядка mov bx,word ptr fs:[filepointer] add bx,offset file xor dx,dxno_len: inc dx cmp byte ptr fs:[bx],10 je len_ok inc bx cmp dx,80 jb no_lenlen_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,dxtok_scru: mov word ptr fs:[filepointer],bx call showtxtdump popa retscroll_downtxt endp;=================================================scroll_uptxt proc pusha ;пiдраховуємо довжину 1 рядка mov bx,word ptr fs:[filepointer] add bx,offset file-2 xor dx,dxuno_len: inc dx cmp byte ptr fs:[bx],13 je ulen_ok dec bx cmp dx,80 jb uno_lenulen_ok: mov bx,word ptr fs:[filepointer] cmp bx,dx ja tok_up mov bx,dxtok_up: sub bx,dx mov word ptr fs:[filepointer],bx call showtxtdump popa retscroll_uptxt endp;=================================scroll_pgdntxt proc pusha mov cx,24tsdn: call scroll_downtxt loop tsdn popa retscroll_pgdntxt endp;=================================scroll_pguptxt proc pusha mov cx,24tsdu: call scroll_uptxt loop tsdu popa retscroll_pguptxt endp;================================== H E X;показ дампа для вигляду hexshowhexdump 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,dihex_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,7h_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,7h_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)*2ok_hex: cmp bx,bp jb hex_loop mov bx,offset file mov word ptr fs:[filepointer],0hex_loop: loop hex_l cmp bx,bp jb hex_sav sub bx,bphex_sav: popa retshowhexdump 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,20hok_scru: mov word ptr fs:[filepointer],bx call showhexdump popa retscroll_downhex endp;=================================================scroll_uphex proc pusha mov bx,word ptr fs:[filepointer] cmp bx,20 ja hok_up mov bx,20hok_up: sub bx,20 mov word ptr fs:[filepointer],bx call showhexdump popa retscroll_uphex endp;=================================scroll_pgdnhex proc pusha mov cx,24hsdn: call scroll_downhex loop hsdn popa retscroll_pgdnhex endp;=================================scroll_pguphex proc pusha mov cx,24hsdu: call scroll_uphex loop hsdu popa retscroll_pguphex endp;================================== B I N;показ дампа для вигляду binshowbindump 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,sibin_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],0bin_loop: inc si inc si loop bin_l cmp bx,bp jb bin_sav sub bx,bpbin_sav: popa retshowbindump 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,80ok_scru: mov word ptr fs:[filepointer],bx call showbindump popa retscroll_downbin endp;=================================================scroll_upbin proc pusha mov bx,word ptr fs:[filepointer] cmp bx,80 ja ok_up mov bx,80ok_up: sub bx,80 mov word ptr fs:[filepointer],bx call showbindump popa retscroll_upbin endp;=================================scroll_pgdnbin proc pusha mov cx,24sdn: call scroll_downbin loop sdn popa retscroll_pgdnbin endp;=================================scroll_pgupbin proc pusha mov cx,24sdu: call scroll_upbin loop sdu popa retscroll_pgupbin endp;==================================getfilename proc pusha ;введення iменi файла push fs pop ds mov dx,offset msg_enter mov ah,9 int 21h mov bx,offset filenameent_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 bxname_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_exitother1: cmp ax,696eh ;BIN jne other2 mov byte ptr fs:[filetype],0 jmp typ_exitother2: mov byte ptr fs:[filetype],2 ;TXTtyp_exit: popa retgetfilename 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 retread_error: push fs pop ds mov dx,offset errmsg mov ah,9 int 21h popa mov ah,4ch int 21hreadfile 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 16hwork: 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 workd1: cmp bl,1 jne d2 call scroll_downhex jmp workd2: call scroll_downtxt jmp workwork_1: cmp ah,48h jne work_2 cmp bl,0 jne u1 call scroll_upbin jmp worku1: cmp bl,1 jne u2 call scroll_uphex jmp worku2: call scroll_uptxt jmp workwork_2: cmp ah,51h jne work_3 cmp bl,0 jne pd1 call scroll_pgdnbin jmp workpd1: cmp bl,1 jne pd2 call scroll_pgdnhex jmp workpd2: call scroll_pgdntxt jmp workwork_3: cmp ah,49h jne work_4 cmp bl,0 jne pu1 call scroll_pgupbin jmp workpu1: cmp bl,1 jne pu2 call scroll_pguphex jmp workpu2: call scroll_pguptxt jmp workwork_4: cmp ah,1 jne work mov ah,4ch int 21hend startБлок-схема алгоритму
|
|