|
Розробка програми, призначеної для перегляду текстових файлів різного розміру
Розробка програми, призначеної для перегляду текстових файлів різного розміру
Міністерство освіти та науки України Кіровоградський Державний Технічний університетКафедра програмного забезпеченняКурсова роботаз дисципліни “Програмування на мові 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 40hDb 16 Dup (?)Flag Dw ?Db 56 Dup (?)Cols Dw ?Db 23 Dup (?)A6845 Dw ?Bios EndsCseg Segment Para Public 'CODE'Assume CS:Cseg,DS:Cseg,ES:NothingOrg 100hList Proc NearJmp Start; Необходимые данные и рабачие областиSpecial Db 1eh ;БайтыNormal Db 02h ;Foregrd Db 07h ;Blink Equ 0Fh ;атрибутовCR Equ 0DhLF Equ 0AhEOF Equ 1AhEor Equ 1Nodata Equ 2Crt_Col Dw 0Crt_Buf Dw 0Crt_Prt Dw 0Index Dw 0Reclen Dw 0Row Db 2Col Db 1Attr Db 02hBlknum Db 0Scroll Dw 0First Dw 0Current Dw 0Last Dw 0Recaddr Dw 0Handle Dw 0Psize Dw 16Blksize Dw 0Switch1 Db 0Switch2 Db 0Numlf Db 1Numcr Db 0char_msk db 0ffhmin_disp db 0TextMax Db 32TextLen Db 0TextBuf 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 - PromptTextMsg Db '*** Текст не найден ***'EofMsg Db ' *** Конец файла ***'EofLen Equ This Byte - EofMsgWork Db 'LIST 'Keyin Db 64Keyout Db 0Filenm 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+256Workx Equ $-WorkWhat1 Db 13,32,27,81 ;Cr,Sp,Esc,QDb 68,85,63,72 ;D,U,?,HDb 47,82,76,84 ;/,R,L,TDb 80,65,78,88 ;P,A,N,XDb 66 ;BNum1 Equ $-What1What2 Db 77,75,73,81 ;->,<-,PgUp,PgDnDb 71,72,61,80 ;HOME,^,F3,vDb 59,68,79,119 ;F1,F10,END,^HOMEDb 115,132,118 ;^<-,^PgUp,^PgDndb 46,31Num2 Db $-What2Where1 Dw Offset NxtPage,Offset NxtPage,Offset Close, Offset CloseDw Offset NxtPage,Offset Back, Offset Got_H, Offset Got_HDw Offset Got_S, Offset Right, Offset Left, Offset TopDw Offset Up1, Offset Got_Rs, Offset Down1, Offset CloseDw Offset BottomWhere2 Dw Offset Right, Offset Left, Offset Back, Offset NxtPageDw Offset Top, Offset Up1, Offset Got_Rs,Offset Down1Dw Offset Got_H, Offset Close, Offset Bottom,Offset HomeDw Offset Scroll0,Offset Top, Offset Bottomdw offset ctrl, offset stripHelpMsg Db CR,9,'Просмотрщик файлов V 1.0 'Db CR,LFDb CR,LF,9,'Commands and keys:'Db CR,LFDb 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,PgmSizeMov AH,4Ah ;Модифицируем памятьInt 21h ;Call GetParmOpenit: Call OpenJz InitRetClose: Mov BX,HandleMov AH,3Eh ;Закрываем файлInt 21hMov AX,0600h ;Очищаем экранSub BL,BLMov BH,ForegrdSub CX,CXMov DX,184FhInt 10hRet ;Возвращаемся в DOS; Выделяем память для буфера файлаInit: Mov BX,1000hGetMem: Mov AH,48hInt 21hJc GetMemMov RecAddr,AXMov AX,BXSub AX,32Mul PsizeMov Blksize,AXCall InitCrtCall Set1Call Set25Read1: Call ReadBlk ;Загружаем следующий блокMov BL,NormalMov Attr,BLJnz Read2Jmp AtEndRead2: Dec RowCmp Numlf,0Je GetNextInc RowMov Col,1GetNext:Mov AX,Index ;Есть запись в буфере?Cmp AX,LastJb GotNextJmp AtEndGotNext:Call ListOne ;Выводим следующую записьMov CX,ReclenAdd Col,CLMov DH,RowCmp DH,25Jne TestEorCmp NumLF,0Jne KeyReadTEstEor:Jmp Read2 ;Конец записей?KeyRead: Mov AH,0 ;Ждем нажатия клавишиInt 16hMov SI,Offset Spaces ;Очищаем строку 25Call Msg25; Обработка нажатой клавишиCmp AL,27 ; ESC выходJne Chk00Jmp CloseChk00: Cmp AL,0 ;Управляющий символ?Jne Chk_97 ; нет, букваXchg AL,AH ; да, считываем расширенный кодMov DI,Offset What2Mov BP,Offset Where2Mov CL,Num2Jmp Short ControlChk_97: Cmp AL,97 ;Нижний регистр?Jl UpperSub AL,32 ;да, преобразуем в верхнийUpper: Mov DI,Offset What1Mov BP,Offset Where1Mov CL,Num1Control:Mov SI,DI ;Ищем букву/кодMov CH,0 ;в таблицеPush DSPop ESRepnz ScasbJne KeyReadDec DISub DI,SIShl DI,1Mov BX,Word Ptr DS:[DI][BP]Jmp BX ;Переходим на обработку нажатой;клавишиRight: Cmp Scroll,220 ;key rightJb Got77Jmp KeyReadGot77: Add Scroll,20Jmp BackUpScroll0:Mov Scroll,0 ;key ctrl-leftJmp BackUpLeft: Cmp Scroll,0 ;key leftJne Got75Jmp KeyReadGot75: Sub Scroll,20Jmp BackUpGot_Rs: Call ReScan ;F3Jmp NxtPageGot_H: Call Help ;key F1Call Back1Jmp KeyReadstrip: xor char_msk,080h ; выводить/игнор русские символыcall Back1jmp NxtPagectrl: xor min_disp,020h ; выводить/игнор символы 0-31call Back1jmp NxtPageGot_S: Call Scan ;Поиск текстаJmp NxtPageNxtPage: ;key (nextpage)Mov AX,IndexCmp AX,Last ;end of file?Jae BWaitMov Current,AXMov DH,2Mov Row,DHCall ClearJmp TestEorUp1: Cmp First,0 ; Уже в начале?Jne Up12 ; нет, scroll up one lineBwait: Jmp AtEnd ; да, пропускаемUp12: Call Scroll_UpMov AX,IndexMov Current,AXMov AX,FirstMov Index,AXCall UpOneMov Row,2Mov Col,1Call ListOneMov AX,CurrentMov Index,AXCall UpOneJmp KeyReadHome: Mov Index,0Jmp NxtPageAtEnd: Mov SI,Offset EofMsg ;Выводим сообщение 'End-of-file'Call Msg25Jmp KeyReadBottom: Mov AX,Last ;Позиция на последнюю записьMov Index,AXJmp BackUpTop: Sub CX,CX ;В самое начало файлаMov AL,0Sub DX,DXMov AH,42hMov BX,HandleInt 21hCall ClearMov Row,2Mov Col,1Mov First,0Mov Blknum,0Jmp Read1Back: Call Back1BackUp: Call Back1Jmp NxtpageDown1: Mov AX,Index ;scroll down one lineCmp AX,Last ;Конец файла?Jb Down2Jmp AtEndDown2: Mov Current,AXMov AX,FirstMov Index,AXCall GetRecMov AX,IndexDown3: Call Scroll_DnMov AX,IndexMov First,AXMov AX,CurrentMov Index,AXMov Row,24Mov Col,1Jmp GetNext; Scroll Up one pageBack1 Proc NearMov CX,23Back0: Call UpOneLoop Back0Mov Col,1RetBack1 Endp; Scroll up one lineUpOne Proc NearPush CXMov CX,2Cmp Index,0 ;Уже на верху?Je Up1d ; да, не изменяемUp1a: Mov ES,RecaddrUp1b: Mov DI,IndexCmp ES:Byte Ptr[DI],LFJe Up1cDec IndexJnz Up1bUp1e: Mov Index,0Jmp Up1dUp1c: Dec IndexJz Up1dLoop Up1bInc IndexUp1d: Pop CXRetUpOne Endp; Помещает записи в буфер экранаAssume CS:Cseg,DS:Cseg,ES:NothingShow Proc NearPush AXPush BXPush CXPush DXPush DIPush ESPush SISub AX,AXMov AL,DHSub DH,DHMov DI,DXDec DIDec AXCmp CX,0Jng Dsp9Cmp CX,80Jbe Dsp1Mov CX,80Dsp1: Mul Crt_ColAdd DI,AXShl DI,1Mov DX,Crt_PrtMov ES,Crt_BufMov BH,AttrDsp2: Lodsbdsp2a: Cmp AL,min_dispJae Dsp3Jmp Dsp4Dsp3: Mov BL,ALCall DisplaDsp4: Loop Dsp2Dsp9: Pop SIPop ESPop DIPop DXPop CXPop BXPop AXRetDispla: In AL,DXTest AL,1Jnz DisplaCliDisphi: In AL,DXTest AL,1Jz DisphiMov AX,BXStoswStiRetShow Endp; Показывает следующую записьListOne Proc NearCmp Row,2Jne List1Mov AX,IndexMov First,AXList1: Call GetRecMov CX,ReclenSub CL,NumlfSub CL,NumcrMov Reclen,CXOr CX,CXJz List9Mov SI,Offset WorkCmp Row,2Jae List2Mov Row,2List2: Mov DH,RowMov DL,ColAdd SI,ScrollSub CX,ScrollCall ShowList9: Inc RowMov BL,NormalMov Attr,BLRetListOne Endp; GetRec - извлекает следующую записьGetRec Proc NearPush ESPush CXPush SIPush DIGetR: Test Switch1,EorJz GetR0Mov AX,LastMov Index,AXCall ReadBlkJnz GetR0Jmp GetRdGetR0: Sub DI,DIMov Word Ptr NumLF,DIAnd Switch2,0FFh-NodataMov ES,RecAddrGetR2: Mov SI,IndexMov AL,ES:[SI]Cmp AL,EofJne GetR3Mov Reclen,DIOr Switch1,EorJmp GetRGetR3: And AL,char_mskCmp AL,09hJne GetR4Mov CX,DIAdd CX,8And CX,0FFF8hSub CX,DIGetR3b: Mov Work[DI],' 'Inc DILoop GetR3bInc IndexJmp GetR2GetR4:Mov Work[DI],ALInc DIInc IndexCmp AL,CrJne GetR5Inc NumCRcmp ES:byte ptr[SI+1],LFje GetR6mov byte ptr work[di-1],LFdec NumCRInc NumLFJmp GetR8GetR5: Cmp AL,' 'Je GetR7Cmp AL,LfJne GetR6Inc NumLFJmp GetR8GetR6: Or Switch2,NodataGetR7: Cmp DI,255Je GetR8Jmp GetR2GetR8: Mov Reclen,DICmp Work,0FhJne GetR9Jmp GetR0GetR9: Test Switch2,NodataJnz GetRdJmp GetR0GetRd: Pop DIPop SIPop CXPop ESRetGetRec Endp; Читает блок из файлаReadBlk Proc NearMov Switch1,0Mov BX,HandleMov CX,BlksizePush DSMov DS,RecAddrSub DX,DXMov AH,3FhInt 21HPop DSOr AX,AXJz ReadB2Mov Last,AXMov Index,0Mov First,0Mov Current,0Inc BlknumMov DI,LastMov ES,RecAddrMov Byte Ptr ES:[DI],1AhReadB2: RetReadblk Endp; Ввод текста после '/'ReScan ProcPush DIPush SIPush DSPop ESJmp Scan1Scan: Push DIPush SIPush DSPop ESMov TextMax,32Mov DX,Offset TextMaxMov AH,0AhInt 21hScan1: Sub CX,CXOr CL,TextLenJz NoMatchMov AX,FirstMov Index,AXCall GetRecScan3: Call GetRecTest Switch1,EorJnz NoMatchMov AX,IndexCmp AX,LastJae NoMatchMov CX,RecLenSub CL,TextLenJle Scan3Mov AL,TextBufMov DI,Offset WorkRepnz ScasbJne Scan3Cmp TextLen,1Je MatchSub CH,CHMov CL,TextLenDec CLMov SI,Offset TextBuf+1Repe CmpsbJne Scan3Or CX,CXJnz Scan3Match: Call Set25Mov Attr,BlinkCall UpOneJmp ScanedNoMatch:Mov AX,FirstMov Index,AXCall Set25Mov SI,Offset TextMsgAdd Special,128Call Msg25Sub Special,128Mov Switch1,0Mov Col,1Scaned: Pop SIPop DIRetReScan Endp; Очищает экранClear Proc NearPush AXPush BXPush CXPush DXMov AX,0600hMov BH,ForegrdJmp ScrollerScroll_Dn:Push AXPush BXPush CXPush DXMov AX,0601hMov BH,ForegrdJmp ScrollerScroll_Up:Push AXPush BXPush CXPush DXMov AX,0701hMov BH,ForegrdScroller:Mov CX,0100hMov DX,174FhInt 10hPop DXPop CXPop BXPop AXRetClear Endp; Выводит строку 0Set1 Proc NearMov AX,0600hSub BL,BLMov BH,ForegrdSub CX,CXMov DX,184FhInt 10hMov Word Ptr Work+5,0000hMov DH,1Mov DL,DHMov SI,Offset WorkMov CX,80Mov BL,SpecialMov Attr,BLCall ShowRetSet1 Endp; Выводит строку 25Set25 Proc NearPush DIPush SIMov DH,25Mov DL,1Mov CX,Pr_LenMov BL,SpecialMov Attr,BLMov SI,Offset PromptCall ShowMov AH,2Mov DX,1808hMov BX,0Int 10HPop SIPop DIRetSet25 Endp; Выводит сообщение в строке 25Msg25 Proc Near ;SI - указатель на текстMov DH,25Mov DL,10Mov CX,EofLenMov BL,SpecialMov Attr,BLCall ShowMov BL,NormalMov Attr,BLRetMsg25 Endp; Инициализация необходимых данныхInitCrt Proc NearPush ESMov AX,BiosMov ES,AXMov CX,ES:Cols ;Количество столбцовMov Crt_Col,CXMov DX,ES:A6845 ;Порт состоянияAdd DX,6Mov Crt_Prt,DXMov Crt_Buf,0B800h ;Адрес видео буфера (color)Mov BX,ES:FlagAnd BX,30hCmp BX,30hJne CrtSetMov Crt_Buf,0B000h ;Адрес видео буфера (mono)CrtSet: Pop ESRetInitCrt Endp; HELP - Выводит управляющие клавишиHelp Proc NearCall ClearMov DX,0200hMov AH,2Sub BH,BHMov BL,ForegrdInt 10hMov DX,Offset HelpMsgMov AH,9Int 21hMov AH,2Mov DX,1808hSub BX,BXInt 10HRetHelp Endp; Извлекает имя файла с командной строки или из введеннойGetParm Proc NearXor AX,AXXor CX,CXMov AL,Byte Ptr DS:[80h]Or CX,AXJz GetFileMov DI,Offset FilenmMov SI,81hBlanks: LodsbCmp AL,' 'Je SkipitStosbSkipit: Loop BlanksRetGetFile:Mov DX,Offset AskFileMov AH,9Int 21HMov AH,0AHMov DX,Offset KeyinInt 21hSub BL,BLOr BL,KeyoutJz GetFileMov Filenm[BX],0RetGetParm Endp; Открывает файлOpen Proc NearMov OpenCod,0Mov DX,Offset FilenmMov AL,0Mov AH,3DHInt 21HMov Handle,AXJnc OpenedMov OpenCod,AXCmp AL,2Jl ErrorCmp AL,5Ja ErrorSub BX,BXMov BL,ALMov CL,4Shl BX,CLLea DX,Code2-32[BX]Jmp Error2Error: AamXchg AL,AHOr OpenCod,AXMov DX,Offset OpenMsgError2: Mov AH,9Int 21HOpened: Cmp OpenCod,0RetOpen EndpList EndpPgmSize Equ ($-Cseg+16)/16 ;Размер программы в параграфахCseg EndsEnd List
|
|