РефератыИнформатикаРоРозробка програми призначеної для перегляду текстових файлів різного розміру

Розробка програми призначеної для перегляду текстових файлів різного розміру

Міністерство освіти та науки України


Кіровоградський Державний Технічний університет

Кафедра програмного забезпечення


Курсова робота


з дисципліни “Програмування на мові ASM-86” на тему:


Розробка програми, призначеної для перегляду текстових файлів різного розміру


Зміст


1 Вступ


2 Призначення та область застосування програми


3 Огляд існуючих програм
4 Опис і обґрунтування проектних рішень системи
5 Інструкція користувача
Основні висновки
Список літератури
Текст програми

1.
Вступ


Інформація – цінна річ, тому для її збереження в сучасному суспільстві використовують все частіше персональний комп‘ютер. При перегляді текстових файлів виникає потреба в зручних в користуванні та розумінні програм переглядачів текстових файлів. Переді мною була поставлена задача розробити таку програму з мінімальним набором елементарних функцій для роботи з текстом.


2. Призначення та область застосування програми


Дана програма призначена для перегляду текстових файлів різного розміру. Програма може бути використана будь яким користувачем ЕОМ для перегляду потрібної інформації.


3. Огляд існуючих програм

Зараз існує безліч програм для перегляду текстових файлів. Аналогом даної є такі програми як wiev
, wpwiev
та інші.


4. Опис і обґрунтування проектних рішень системи

Дана програма написана на мові асемблера з використанням переривань для роботи з файлами та текстом. Вона працює на будь якій машині де є DOS або WINDOWS. При написанні програми для реалізації прокрутки екрану вверх та вниз використовується читання тексту порціями. В програмі реалізовані такі можливості як прокрутка вверх та вниз по рядкові та сторінку цілком, коротка допомога , пошук слова та інші потрібні речі. Так як програма використовує пряме читання файлів на диску то при використанні WINDOWS NT треба бути уважним при перегляді файлів і мати дозвіл но перегляд.


5. Інструкція користувача
Для запуску програми потрібно набрати в командному рядку ім‘я запускного файлу та замість параметра ім‘я файлу для перегляду. Але якщо програма запущена без параметра то вона запросить ввести ім‘я. Після чого появиться екран з відкритим файлом. В низу екрану постійно видно підказку. Для виклику допомоги досить нотиснути клавішу ? або F1 або Alt-H. Щоб вийти з програми потрібно натиснути Alt- Q.
Основні висновки

При постійній роботі з комп‘ютером досить часто потрібно переглянути файл. Тому дана програма є незамінною в роботі. Вона є простою в користуванні та розумінні. Працює майже на всіх машинах без особливої потреби в ресурсах.


Список літератури

1. Финогенов К.Г. Самоучитель по системным функциям MS-DOS.- М.: Радио и связь, Энтроп, 1995. - 382с.


2. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT, и AT: Пер. с англ. - Финансы и статистика, 1992.- 544 с.


3. Касаткин А.И. Профессиональное программирование на языке Си. Управление ресурсами: Справочное пособие.- Минск: Выш.шк., 1992. - 432 с.


4. Касаткин А.И. Профессиональное программирование на языке Си. Системное программирование. - Минск: Выш.шк., 1993. - 301 с.


5. Электронный справочник! Драйвер Help фирмы Flambeaux Software версия 1.2. Адаптировал С.М.Абель.


6. The Norton Guides, Copyright © 1987 by Peter Norton Computing - Assembly language, Прерывания.


Текст програми


Bios Segment At 40h


Db 16 Dup (?)


Flag Dw ?


Db 56 Dup (?)


Cols Dw ?


Db 23 Dup (?)


A6845 Dw ?


Bios Ends


Cseg Segment Para Public 'CODE'


Assume CS:Cseg,DS:Cseg,ES:Nothing


Org 100h


List Proc Near


Jmp Start


; Необходимые данные и рабачие области


Special Db 1eh ;Байты


Normal Db 02h ;


Foregrd Db 07h ;


Blink Equ 0Fh ;атрибутов


CR Equ 0Dh


LF Equ 0Ah


EOF Equ 1Ah


Eor Equ 1


Nodata Equ 2


Crt_Col Dw 0


Crt_Buf Dw 0


Crt_Prt Dw 0


Index Dw 0


Reclen Dw 0


Row Db 2


Col Db 1


Attr Db 02h


Blknum Db 0


Scroll Dw 0


First Dw 0


Current Dw 0


Last Dw 0


Recaddr Dw 0


Handle Dw 0


Psize Dw 16


Blksize Dw 0


Switch1 Db 0


Switch2 Db 0


Numlf Db 1


Numcr Db 0


char_msk db 0ffh


min_disp db 0


TextMax Db 32


TextLen Db 0


TextBuf Db 32 Dup (0)


Prompt Db 'Command:'


Spaces Db 32 Dup (32)


Db 'Keys: PgUp PgDn Arrows ESC=exit ?=Help '


Pr_Len Equ This Byte - Prompt


TextMsg Db '*** Текст не найден ***'


EofMsg Db ' *** Конец файла ***'


EofLen Equ This Byte - EofMsg


Work Db 'LIST '


Keyin Db 64


Keyout Db 0


Filenm Db 76 Dup (0)


Askfile Db 13,10,'Введите имя файла: $'


Openmsg Db ' Open failed, return code='


Opencod Dw '00'


Db '$'


Code2 Db 'File not found $'


Code3 Db 'Path not found $'


Code4 Db 'Too many files $'


Code5 Db 'Access denied $'


Org offset Work+256


Workx Equ $-Work


What1 Db 13,32,27,81 ;Cr,Sp,Esc,Q


Db 68,85,63,72 ;D,U,?,H


Db 47,82,76,84 ;/,R,L,T


Db 80,65,78,88 ;P,A,N,X


Db 66 ;B


Num1 Equ $-What1


What2 Db 77,75,73,81 ;->,<-,PgUp,PgDn


Db 71,72,61,80 ;HOME,^,F3,v


Db 59,68,79,119 ;F1,F10,END,^HOME


Db 115,132,118 ;^<-,^PgUp,^PgDn


db 46,31


Num2 Db $-What2


Where1 Dw Offset NxtPage,Offset NxtPage,Offset Close, Offset Close


Dw Offset NxtPage,Offset Back, Offset Got_H, Offset Got_H


Dw Offset Got_S, Offset Right, Offset Left, Offset Top


Dw Offset Up1, Offset Got_Rs, Offset Down1, Offset Close


Dw Offset Bottom


Where2 Dw Offset Right, Offset Left, Offset Back, Offset NxtPage


Dw Offset Top, Offset Up1, Offset Got_Rs,Offset Down1


Dw Offset Got_H, Offset Close, Offset Bottom,Offset Home


Dw Offset Scroll0,Offset Top, Offset Bottom


dw offset ctrl, offset strip


HelpMsg Db CR,9,'Просмотрщик файлов V 1.0 '


Db CR,LF


Db CR,LF,9,'Commands and keys:'


Db CR,LF


Db CR,LF,9,'_-- or Space ',9,9,'continue to next page'


Db CR,LF,9,'ESC, Q, X or F10',9,' terminate'


Db CR,LF,9,'HOME, T or Ctl PgUp',9,' restart from Top of file'


Db CR,LF,9,'END, B or Ctl PgDn',9,' skip to Bottom of file'


Db CR,LF,9,'Ctl Home ',9,9,' restart from top of block'


Db CR,LF,9,'PgDn or D ',9,9,' scroll Down one page'


Db CR,LF,9,'PgUp or U ',9,9,' scroll Up one page'


Db CR,LF,9,'H, ? or F1 ',9,9,' list Help for keys'


Db CR,LF,9,'_- or L ',9,9,'scroll Left 20 columns'


Db CR,LF,9,'-_ or R ',9,9,'scroll Right 20 columns'


Db CR,LF,9,'Ctl _- ',9,9,'reset scroll to column 1'


Db CR,LF,9,'_ or P ',9,9,'Previous, up one line'


Db CR,LF,9,'_ or N ',9,9,'Next, down one line'


Db CR,LF,9,'/text ',9,9,' find text'


Db CR,LF,9,'A or F3 ',9,9,' find text Again'


db CR,LF,9,"ALT S ",9,9," do/don't Strip parity bit"


db " (toggle)"


db CR,LF,9,"ALT C ",9,9," do/don't display Control "


db " chars"


db " (toggle)"


Db '$'


Start: Mov BX,PgmSize


Mov AH,4Ah ;Модифицируем память


Int 21h ;


Call GetParm


Openit: Call Open


Jz Init


Ret


Close: Mov BX,Handle


Mov AH,3Eh ;Закрываем файл


Int 21h


Mov AX,0600h ;Очищаем экран


Sub BL,BL


Mov BH,Foregrd


Sub CX,CX


Mov DX,184Fh


Int 10h


Ret ;Возвращаемся в DOS


; Выделяем память для буфера файла


Init: Mov BX,1000h


GetMem: Mov AH,48h


Int 21h


Jc GetMem


Mov RecAddr,AX


Mov AX,BX


Sub AX,32


Mul Psize


Mov Blksize,AX


Call InitCrt


Call Set1


Call Set25


Read1: Call ReadBlk ;Загружаем следующий блок


Mov BL,Normal


Mov Attr,BL


Jnz Read2


Jmp AtEnd


Read2: Dec Row


Cmp Numlf,0


Je GetNext


Inc Row


Mov Col,1


GetNext:


Mov AX,Index ;Есть запись в буфере?


Cmp AX,Last


Jb GotNext


Jmp AtEnd


GotNext:


Call ListOne ;Выводим следующую запись


Mov CX,Reclen


Add Col,CL


Mov DH,Row


Cmp DH,25


Jne TestEor


Cmp NumLF,0


Jne KeyRead


TEstEor:Jmp Read2 ;Конец записей?


KeyRead: Mov AH,0 ;Ждем нажатия клавиши


Int 16h


Mov SI,Offset Spaces ;Очищаем строку 25


Call Msg25


; Обработка нажатой клавиши


Cmp AL,27 ; ESC выход


Jne Chk00


Jmp Close


Chk00: Cmp AL,0 ;Управляющий символ?


Jne Chk_97 ; нет, буква


Xchg AL,AH ; да, считываем расширенный код


Mov DI,Offset What2


Mov BP,Offset Where2


Mov CL,Num2


Jmp Short Control


Chk_97: Cmp AL,97 ;Нижний регистр?


Jl Upper


Sub AL,32 ;да, преобразуем в верхний


Upper: Mov DI,Offset What1


Mov BP,Offset Where1


Mov CL,Num1


Control:Mov SI,DI ;Ищем букву/код


Mov CH,0 ;в таблице


Push DS


Pop ES


Repnz Scasb


Jne KeyRead


Dec DI


Sub DI,SI


Shl DI,1


Mov BX,Word Ptr DS:[DI][BP]


Jmp BX ;Переходим на обработку нажатой


;клавиши


Right: Cmp Scroll,220 ;key right


Jb Got77


Jmp KeyRead


Got77: Add Scroll,20


Jmp BackUp


Scroll0:Mov Scroll,0 ;key ctrl-left


Jmp BackUp


Left: Cmp Scroll,0 ;key left


Jne Got75


Jmp KeyRead


Got75: Sub Scroll,20


Jmp BackUp


Got_Rs: Call ReScan ;F3


Jmp NxtPage


Got_H: Call Help ;key F1


Call Back1


Jmp KeyRead


strip: xor char_msk,080h ; выводить/игнор русские символы


call Back1


jmp NxtPage


ctrl: xor min_disp,020h ; выводить/игнор символы 0-31


call Back1


jmp NxtPage


Got_S: Call Scan ;Поиск текста


Jmp NxtPage


NxtPage: ;key (nextpage)


Mov AX,Index


Cmp AX,Last ;end of file?


Jae BWait


Mov Current,AX


Mov DH,2


Mov Row,DH


Call Clear


Jmp TestEor


Up1: Cmp First,0 ; Уже в начале?


Jne Up12 ; нет, scroll up one line


Bwait: Jmp AtEnd ; да, пропускаем


Up12: Call Scroll_Up


Mov AX,Index


Mov Current,AX


Mov AX,First


Mov Index,AX


Call UpOne


Mov Row,2


Mov Col,1


Call ListOne


Mov AX,Current


Mov Index,AX


Call UpOne


Jmp Ke

yRead


Home: Mov Index,0


Jmp NxtPage


AtEnd: Mov SI,Offset EofMsg ;Выводим сообщение 'End-of-file'


Call Msg25


Jmp KeyRead


Bottom: Mov AX,Last ;Позиция на последнюю запись


Mov Index,AX


Jmp BackUp


Top: Sub CX,CX ;В самое начало файла


Mov AL,0


Sub DX,DX


Mov AH,42h


Mov BX,Handle


Int 21h


Call Clear


Mov Row,2


Mov Col,1


Mov First,0


Mov Blknum,0


Jmp Read1


Back: Call Back1


BackUp: Call Back1


Jmp Nxtpage


Down1: Mov AX,Index ;scroll down one line


Cmp AX,Last ;Конец файла?


Jb Down2


Jmp AtEnd


Down2: Mov Current,AX


Mov AX,First


Mov Index,AX


Call GetRec


Mov AX,Index


Down3: Call Scroll_Dn


Mov AX,Index


Mov First,AX


Mov AX,Current


Mov Index,AX


Mov Row,24


Mov Col,1


Jmp GetNext


; Scroll Up one page


Back1 Proc Near


Mov CX,23


Back0: Call UpOne


Loop Back0


Mov Col,1


Ret


Back1 Endp


; Scroll up one line


UpOne Proc Near


Push CX


Mov CX,2


Cmp Index,0 ;Уже на верху?


Je Up1d ; да, не изменяем


Up1a: Mov ES,Recaddr


Up1b: Mov DI,Index


Cmp ES:Byte Ptr[DI],LF


Je Up1c


Dec Index


Jnz Up1b


Up1e: Mov Index,0


Jmp Up1d


Up1c: Dec Index


Jz Up1d


Loop Up1b


Inc Index


Up1d: Pop CX


Ret


UpOne Endp


; Помещает записи в буфер экрана


Assume CS:Cseg,DS:Cseg,ES:Nothing


Show Proc Near


Push AX


Push BX


Push CX


Push DX


Push DI


Push ES


Push SI


Sub AX,AX


Mov AL,DH


Sub DH,DH


Mov DI,DX


Dec DI


Dec AX


Cmp CX,0


Jng Dsp9


Cmp CX,80


Jbe Dsp1


Mov CX,80


Dsp1: Mul Crt_Col


Add DI,AX


Shl DI,1


Mov DX,Crt_Prt


Mov ES,Crt_Buf


Mov BH,Attr


Dsp2: Lodsb


dsp2a: Cmp AL,min_disp


Jae Dsp3


Jmp Dsp4


Dsp3: Mov BL,AL


Call Displa


Dsp4: Loop Dsp2


Dsp9: Pop SI


Pop ES


Pop DI


Pop DX


Pop CX


Pop BX


Pop AX


Ret


Displa: In AL,DX


Test AL,1


Jnz Displa


Cli


Disphi: In AL,DX


Test AL,1


Jz Disphi


Mov AX,BX


Stosw


Sti


Ret


Show Endp


; Показывает следующую запись


ListOne Proc Near


Cmp Row,2


Jne List1


Mov AX,Index


Mov First,AX


List1: Call GetRec


Mov CX,Reclen


Sub CL,Numlf


Sub CL,Numcr


Mov Reclen,CX


Or CX,CX


Jz List9


Mov SI,Offset Work


Cmp Row,2


Jae List2


Mov Row,2


List2: Mov DH,Row


Mov DL,Col


Add SI,Scroll


Sub CX,Scroll


Call Show


List9: Inc Row


Mov BL,Normal


Mov Attr,BL


Ret


ListOne Endp


; GetRec - извлекает следующую запись


GetRec Proc Near


Push ES


Push CX


Push SI


Push DI


GetR: Test Switch1,Eor


Jz GetR0


Mov AX,Last


Mov Index,AX


Call ReadBlk


Jnz GetR0


Jmp GetRd


GetR0: Sub DI,DI


Mov Word Ptr NumLF,DI


And Switch2,0FFh-Nodata


Mov ES,RecAddr


GetR2: Mov SI,Index


Mov AL,ES:[SI]


Cmp AL,Eof


Jne GetR3


Mov Reclen,DI


Or Switch1,Eor


Jmp GetR


GetR3: And AL,char_msk


Cmp AL,09h


Jne GetR4


Mov CX,DI


Add CX,8


And CX,0FFF8h


Sub CX,DI


GetR3b: Mov Work[DI],' '


Inc DI


Loop GetR3b


Inc Index


Jmp GetR2


GetR4:


Mov Work[DI],AL


Inc DI


Inc Index


Cmp AL,Cr


Jne GetR5


Inc NumCR


cmp ES:byte ptr[SI+1],LF


je GetR6


mov byte ptr work[di-1],LF


dec NumCR


Inc NumLF


Jmp GetR8


GetR5: Cmp AL,' '


Je GetR7


Cmp AL,Lf


Jne GetR6


Inc NumLF


Jmp GetR8


GetR6: Or Switch2,Nodata


GetR7: Cmp DI,255


Je GetR8


Jmp GetR2


GetR8: Mov Reclen,DI


Cmp Work,0Fh


Jne GetR9


Jmp GetR0


GetR9: Test Switch2,Nodata


Jnz GetRd


Jmp GetR0


GetRd: Pop DI


Pop SI


Pop CX


Pop ES


Ret


GetRec Endp


; Читает блок из файла


ReadBlk Proc Near


Mov Switch1,0


Mov BX,Handle


Mov CX,Blksize


Push DS


Mov DS,RecAddr


Sub DX,DX


Mov AH,3Fh


Int 21H


Pop DS


Or AX,AX


Jz ReadB2


Mov Last,AX


Mov Index,0


Mov First,0


Mov Current,0


Inc Blknum


Mov DI,Last


Mov ES,RecAddr


Mov Byte Ptr ES:[DI],1Ah


ReadB2: Ret


Readblk Endp


; Ввод текста после '/'


ReScan Proc


Push DI


Push SI


Push DS


Pop ES


Jmp Scan1


Scan: Push DI


Push SI


Push DS


Pop ES


Mov TextMax,32


Mov DX,Offset TextMax


Mov AH,0Ah


Int 21h


Scan1: Sub CX,CX


Or CL,TextLen


Jz NoMatch


Mov AX,First


Mov Index,AX


Call GetRec


Scan3: Call GetRec


Test Switch1,Eor


Jnz NoMatch


Mov AX,Index


Cmp AX,Last


Jae NoMatch


Mov CX,RecLen


Sub CL,TextLen


Jle Scan3


Mov AL,TextBuf


Mov DI,Offset Work


Repnz Scasb


Jne Scan3


Cmp TextLen,1


Je Match


Sub CH,CH


Mov CL,TextLen


Dec CL


Mov SI,Offset TextBuf+1


Repe Cmpsb


Jne Scan3


Or CX,CX


Jnz Scan3


Match: Call Set25


Mov Attr,Blink


Call UpOne


Jmp Scaned


NoMatch:Mov AX,First


Mov Index,AX


Call Set25


Mov SI,Offset TextMsg


Add Special,128


Call Msg25


Sub Special,128


Mov Switch1,0


Mov Col,1


Scaned: Pop SI


Pop DI


Ret


ReScan Endp


; Очищает экран


Clear Proc Near


Push AX


Push BX


Push CX


Push DX


Mov AX,0600h


Mov BH,Foregrd


Jmp Scroller


Scroll_Dn:


Push AX


Push BX


Push CX


Push DX


Mov AX,0601h


Mov BH,Foregrd


Jmp Scroller


Scroll_Up:


Push AX


Push BX


Push CX


Push DX


Mov AX,0701h


Mov BH,Foregrd


Scroller:


Mov CX,0100h


Mov DX,174Fh


Int 10h


Pop DX


Pop CX


Pop BX


Pop AX


Ret


Clear Endp


; Выводит строку 0


Set1 Proc Near


Mov AX,0600h


Sub BL,BL


Mov BH,Foregrd


Sub CX,CX


Mov DX,184Fh


Int 10h


Mov Word Ptr Work+5,0000h


Mov DH,1


Mov DL,DH


Mov SI,Offset Work


Mov CX,80


Mov BL,Special


Mov Attr,BL


Call Show


Ret


Set1 Endp


; Выводит строку 25


Set25 Proc Near


Push DI


Push SI


Mov DH,25


Mov DL,1


Mov CX,Pr_Len


Mov BL,Special


Mov Attr,BL


Mov SI,Offset Prompt


Call Show


Mov AH,2


Mov DX,1808h


Mov BX,0


Int 10H


Pop SI


Pop DI


Ret


Set25 Endp


; Выводит сообщение в строке 25


Msg25 Proc Near ;SI - указатель на текст


Mov DH,25


Mov DL,10


Mov CX,EofLen


Mov BL,Special


Mov Attr,BL


Call Show


Mov BL,Normal


Mov Attr,BL


Ret


Msg25 Endp


; Инициализация необходимых данных


InitCrt Proc Near


Push ES


Mov AX,Bios


Mov ES,AX


Mov CX,ES:Cols ;Количество столбцов


Mov Crt_Col,CX


Mov DX,ES:A6845 ;Порт состояния


Add DX,6


Mov Crt_Prt,DX


Mov Crt_Buf,0B800h ;Адрес видео буфера (color)


Mov BX,ES:Flag


And BX,30h


Cmp BX,30h


Jne CrtSet


Mov Crt_Buf,0B000h ;Адрес видео буфера (mono)


CrtSet: Pop ES


Ret


InitCrt Endp


; HELP - Выводит управляющие клавиши


Help Proc Near


Call Clear


Mov DX,0200h


Mov AH,2


Sub BH,BH


Mov BL,Foregrd


Int 10h


Mov DX,Offset HelpMsg


Mov AH,9


Int 21h


Mov AH,2


Mov DX,1808h


Sub BX,BX


Int 10H


Ret


Help Endp


; Извлекает имя файла с командной строки или из введенной


GetParm Proc Near


Xor AX,AX


Xor CX,CX


Mov AL,Byte Ptr DS:[80h]


Or CX,AX


Jz GetFile


Mov DI,Offset Filenm


Mov SI,81h


Blanks: Lodsb


Cmp AL,' '


Je Skipit


Stosb


Skipit: Loop Blanks


Ret


GetFile:


Mov DX,Offset AskFile


Mov AH,9


Int 21H


Mov AH,0AH


Mov DX,Offset Keyin


Int 21h


Sub BL,BL


Or BL,Keyout


Jz GetFile


Mov Filenm[BX],0


Ret


GetParm Endp


; Открывает файл


Open Proc Near


Mov OpenCod,0


Mov DX,Offset Filenm


Mov AL,0


Mov AH,3DH


Int 21H


Mov Handle,AX


Jnc Opened


Mov OpenCod,AX


Cmp AL,2


Jl Error


Cmp AL,5


Ja Error


Sub BX,BX


Mov BL,AL


Mov CL,4


Shl BX,CL


Lea DX,Code2-32[BX]


Jmp Error2


Error: Aam


Xchg AL,AH


Or OpenCod,AX


Mov DX,Offset OpenMsg


Error2: Mov AH,9


Int 21H


Opened: Cmp OpenCod,0


Ret


Open Endp


List Endp


PgmSize Equ ($-Cseg+16)/16 ;Размер программы в параграфах


Cseg Ends


End List

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Розробка програми призначеної для перегляду текстових файлів різного розміру

Слов:2542
Символов:25464
Размер:49.73 Кб.