|
Программа для перегляду текстових файлів різного розміру
Программа для перегляду текстових файлів різного розміру
Міністерство освіти та науки України Кіровоградський Державний Технічний університетКафедра програмного забезпеченняКурсова роботаз дисципліни «Програмування на мові ASM-86» на тему:"Программа для перегляду текстових файлів різного розміру"ЗмістВступ1. Призначення та область застосування програми2. Огляд існуючих програм3. Опис і обґрунтування проектних рішень системи4. Інструкція користувача5. Основні висновкиСписок літературиТекст програмиВступІнформація - цінна річ, тому для її збереження в сучасному суспільстві використовують все частіше персональний комп`ютер. При перегляді текстових файлів виникає потреба в зручних в користуванні та розумінні програм переглядачів текстових файлів. Переді мною була поставлена задача розробити таку програму з мінімальним набором елементарних функцій для роботи з текстом. 1. Призначення та область застосування програми Дана програма призначена для перегляду текстових файлів різного розміру. Програма може бути використана будь яким користувачем ЕОМ для перегляду потрібної інформації. 2. Огляд існуючих програмЗараз існує безліч програм для перегляду текстових файлів. Аналогом даної є такі програми як wiev, wpwiev та інші.3. Опис і обґрунтування проектних рішень системиДана програма написана на мові асемблера з використанням переривань для роботи з файлами та текстом. Вона працює на будь якій машині де є DOS або WINDOWS. При написанні програми для реалізації прокрутки екрану вверх та вниз використовується читання тексту порціями. В програмі реалізовані такі можливості як прокрутка вверх та вниз по рядкові та сторінку цілком, коротка допомога, пошук слова та інші потрібні речі. Так як програма використовує пряме читання файлів на диску то при використанні WINDOWS NT треба бути уважним при перегляді файлів і мати дозвіл но перегляд.4. Інструкція користувачаДля запуску програми потрібно набрати в командному рядку ім`я запускного файлу та замість параметра ім`я файлу для перегляду. Але якщо програма запущена без параметра то вона запросить ввести ім`я. Після чого появиться екран з відкритим файлом. В низу екрану постійно видно підказку. Для виклику допомоги досить нотиснути клавішу? або 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 KeyRead 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
|
|