Реферат: Переглядач для файлів різних типів, з визначенням типу файлу по розширенню і, відповідно, способу перегляду (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. М., Діалектика, 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

       ; очистка

        movax,0b800h

        mov es,ax

        cld

        movcx,2000

        xor di,di

        movax,0700h

        rep stosw

        movbx,word ptr fs:[filepointer]

        addbx,offset file

        movbp,offset file

        addbp,32767

        xor si,si

        xor di,di

txt_l:  moval,byte ptr fs:[bx]

        inc bx

        cmp al,10

        je tskip

        cmp al,13

        jne tput

        addsi,80*2

        shl di,1

        sub si,di

        xor di,di

        jmp tskip

tput:

        mov byteptr es:[si],al

        add si,2

        inc di

tskip:

        cmp bx,bp

        jbtxt_loop

        movbx,offset file

        mov wordptr fs:[filepointer],0

txt_loop:

        cmpsi,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 рядка

        movbx,word ptr fs:[filepointer]

        addbx,offset file

        xor dx,dx

no_len:

        inc dx

        cmp byteptr fs:[bx],10

        je len_ok

        inc bx

        cmp dx,80

        jb no_len

len_ok:

        movbx,word ptr fs:[filepointer]

        mov ax,bx

        addax,offset file+32767

        sub ax,dx

        cmp bx,ax

        jaetok_scru

        add bx,dx

tok_scru:

        mov wordptr fs:[filepointer],bx

        callshowtxtdump

        popa

        ret

scroll_downtxt    endp

;=================================================

scroll_uptxt    proc

        pusha

       ; пiдраховуємо довжину 1 рядка

        movbx,word ptr fs:[filepointer]

        addbx,offset file-2

        xor dx,dx

uno_len:

        inc dx

        cmp byteptr fs:[bx],13

        jeulen_ok

        dec bx

        cmp dx,80

        jbuno_len

ulen_ok:

        movbx,word ptr fs:[filepointer]

        cmp bx,dx

        ja tok_up

        mov bx,dx

tok_up:

        sub bx,dx

        mov wordptr fs:[filepointer],bx

        callshowtxtdump

        popa

        ret

scroll_uptxt    endp

;=================================

scroll_pgdntxtproc

        pusha

        mov cx,24

tsdn:    callscroll_downtxt

        loop tsdn

        popa

        ret

scroll_pgdntxtendp

;=================================

scroll_pguptxtproc

        pusha

        mov cx,24

tsdu:    callscroll_uptxt

        loop tsdu

        popa

        ret

scroll_pguptxtendp

;==================================H E X

; показ дампа длявигляду hex

showhexdump    proc

        pusha

        movcx,20*25

        movbx,word ptr fs:[filepointer]

        addbx,offset file

        movbp,offset file

        addbp,32767

        movax,0b800h

        mov es,ax

        xor si,si

        xor di,di

hex_l:  moval,byte ptr fs:[bx]

        inc bx

        mov dl,al

        and dl,15

        adddl,30h

        cmpdl,39h

        jbe h_1

        add dl,7

h_1:

        mov byteptr es:[si+2],dl

       ;==============

        mov dl,al

        shr dl,4

        adddl,30h

        cmpdl,39h

        jbe h_2

        add dl,7

h_2:

        mov byteptr es:[si],dl

        mov byteptr es:[si+4],0

        add si,6

        inc di

        cmp di,20

        jneok_hex

        xor di,di

        addsi,(80-3*20)*2

ok_hex:

        cmp bx,bp

        jbhex_loop

        movbx,offset file

        mov wordptr fs:[filepointer],0

hex_loop:

        loophex_l

        cmp bx,bp

        jbhex_sav

        sub bx,bp

hex_sav:

        popa

        ret

showhexdump    endp

;=================================================

scroll_downhex    proc

        pusha

        movbx,word ptr fs:[filepointer]

        mov ax,bx

        addax,offset file+32767-20

        cmp bx,ax

        jaehok_scru

        add bx,20

hok_scru:

        mov wordptr fs:[filepointer],bx

        callshowhexdump

        popa

        ret

scroll_downhex    endp

;=================================================

scroll_uphex    proc

        pusha

        movbx,word ptr fs:[filepointer]

        cmp bx,20

        ja hok_up

        mov bx,20

hok_up:

        sub bx,20

        mov wordptr fs:[filepointer],bx

        callshowhexdump

        popa

        ret

scroll_uphex    endp

;=================================

scroll_pgdnhexproc

        pusha

        mov cx,24

hsdn:    callscroll_downhex

        loop hsdn

        popa

        ret

scroll_pgdnhexendp

;=================================

scroll_pguphexproc

        pusha

        mov cx,24

hsdu:    callscroll_uphex

        loop hsdu

        popa

        ret

scroll_pguphexendp

;==================================B I N

; показ дампа длявигляду bin

showbindump    proc

        pusha

        movcx,2000

        movbx,word ptr fs:[filepointer]

        addbx,offset file

        movbp,offset file

        addbp,32767

        mov ax,0b800h

        mov es,ax

        xor si,si

bin_l:  moval,byte ptr fs:[bx]

        mov byteptr es:[si],al

        inc bx

        cmp bx,bp

        jbbin_loop

        movbx,offset file

        mov wordptr fs:[filepointer],0

bin_loop:

        inc si

        inc si

        loopbin_l

        cmp bx,bp

        jbbin_sav

        sub bx,bp

bin_sav:

        popa

        ret

showbindump    endp

;=================================================

scroll_downbin    proc

        pusha

        movbx,word ptr fs:[filepointer]

        mov ax,bx

        addax,offset file+32767-80

        cmp bx,ax

        jaeok_scru

        add bx,80

ok_scru:

        mov wordptr fs:[filepointer],bx

        callshowbindump

        popa

        ret

scroll_downbin    endp

;=================================================

scroll_upbin    proc

        pusha

        movbx,word ptr fs:[filepointer]

        cmp bx,80

        ja ok_up

        mov bx,80

ok_up:

        sub bx,80

        mov wordptr fs:[filepointer],bx

        callshowbindump

        popa

        ret

scroll_upbin    endp

;=================================

scroll_pgdnbinproc

        pusha

        mov cx,24

sdn:    callscroll_downbin

        loop sdn

        popa

        ret

scroll_pgdnbinendp

;=================================

scroll_pgupbinproc

        pusha

        mov cx,24

sdu:    callscroll_upbin

        loop sdu

        popa

        ret

scroll_pgupbinendp

;==================================

getfilename proc

        pusha

       ; введенняiменi файла

        push fs

        pop ds

        movdx,offset msg_enter

        mov ah,9

        int 21h

        movbx,offset filename

ent_l:  mov ah,1

        int 21h

        cmp al,13

        mov byteptr ds:[bx],al

        inc bx

        cmp al,13

        jne ent_l

        dec bx

        mov byteptr ds:[bx],0

       ; визначення типу файла

        movbx,offset filename

        dec bx

name_s: inc bx

        moval,byte ptr fs:[bx]

        cmp al,0

        jnename_s

        sub bx,2

        movah,byte ptr fs:[bx]

        moval,byte ptr fs:[bx+1]

        cmpax,6578h                    ;HEX

        jneother1

        mov byteptr fs:[filetype],1

        jmptyp_exit

other1:

        cmpax,696eh                    ;BIN

        jne other2

        mov byteptr fs:[filetype],0

        jmptyp_exit

other2:

        mov byteptr fs:[filetype],2    ;TXT

typ_exit:

        popa

        ret

getfilename endp

;==================================

readfile proc

        pusha

        ;open

        movah,3dh

        xor al,al

        push fs

        pop ds

        movdx,offset filename

        int 21h

        jcread_error

        mov bx,ax

        ;read

        movah,3fh

        movcx,32767

        push fs

        pop ds

        mov dx,offsetfile

        int 21h

        jcread_error

        mov wordptr fs:[filelength],ax

        ;close

        movah,3eh

        movbx,word ptr fs:[handle]

        int 21h

        popa

        ret

read_error:

        push fs

        pop ds

        movdx,offset errmsg

        mov ah,9

        int 21h

        popa

        movah,4ch

        int 21h

readfile endp

;==================================

begin:

        xor ah,ah

        mov al,3

        int 10h

        movax,seg handle

        mov fs,ax

        callgetfilename

        callreadfile

        mov ah,5

        movch,48h

        int 16h

work:

        mov ah,0

        int 16h

        movbl,byte ptr fs:[filetype]

        cmpah,50h

        jnework_1

        cmp bl,0

        jne d1

        callscroll_downbin

        jmp work

d1:     cmp bl,1

        jne d2

        callscroll_downhex

        jmp work

d2:

        callscroll_downtxt

        jmp work

work_1:

        cmpah,48h

        jnework_2

        cmp bl,0

        jne u1

        callscroll_upbin

        jmp work

u1:     cmp bl,1

        jne u2

        callscroll_uphex

        jmp work

u2:

        callscroll_uptxt

        jmp work

work_2:

        cmpah,51h

        jnework_3

        cmp bl,0

        jne pd1

        callscroll_pgdnbin

        jmp work

pd1:    cmp bl,1

        jne pd2

        callscroll_pgdnhex

        jmp work

pd2:

        callscroll_pgdntxt

        jmp work

work_3:

        cmpah,49h

        jnework_4

        cmp bl,0

        jne pu1

        callscroll_pgupbin

        jmp work

pu1:    cmp bl,1

        jne pu2

        callscroll_pguphex

        jmp work

pu2:

        callscroll_pguptxt

        jmp work

work_4:

        cmp ah,1

        jne work

        movah,4ch

        int 21h

end start


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

 

/> 

еще рефераты
Еще работы по информатике, программированию