Міністерствоосвіти та науки УкраїниКіровоградський Державний Технічний університет
Кафедрапрограмного забезпечення
Курсова робота
з дисципліни «Програмуванняна мові 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 – Assemblylanguage, Прерывания.
Текстпрограми
Bios SegmentAt 40h
Db 16Dup (?)
Flag Dw?
Db 56Dup (?)
Cols Dw?
Db 23Dup (?)
A6845Dw?
Bios Ends
Cseg SegmentPara Public 'CODE'
Assume CS:Cseg, DS: Cseg, ES: Nothing
Org 100h
List ProcNear
Jmp Start
; Необходимыеданные и рабачие области
SpecialDb 1eh; Байты
NormalDb 02h;
ForegrdDb 07h;
BlinkEqu 0Fh; атрибутов
CR Equ 0Dh
LF Equ 0Ah
EOF Equ 1Ah
Eor Equ1
NodataEqu 2
Crt_ColDw 0
Crt_BufDw 0
Crt_PrtDw 0
IndexDw 0
ReclenDw 0
Row Db2
Col Db1
Attr Db02h
BlknumDb 0
ScrollDw 0
FirstDw 0
CurrentDw 0
Last Dw0
RecaddrDw 0
HandleDw 0
PsizeDw 16
BlksizeDw 0
Switch1Db 0
Switch2Db 0
NumlfDb 1
NumcrDb 0
char_mskdb 0ffh
min_dispdb 0
TextMaxDb 32
TextLenDb 0
TextBufDb 32 Dup (0)
PromptDb 'Command:'
SpacesDb 32 Dup (32)
Db 'Keys:PgUp PgDn Arrows ESC=exit?=Help '
Pr_Len Equ ThisByte – Prompt
TextMsgDb '*** Текст не найден ***'
EofMsgDb ' *** Конец файла ***'
EofLen Equ ThisByte – EofMsg
Work Db'LIST '
KeyinDb 64
KeyoutDb 0
FilenmDb 76 Dup (0)
AskfileDb 13,10,'Введите имя файла: $'
OpenmsgDb ' Open failed, return code='
OpencodDw '00'
Db '$'
Code2Db 'File not found $'
Code3Db 'Path not found $'
Code4Db 'Too many files $'
Code5Db 'Access denied $'
Org offsetWork+256
Workx Equ $-Work
What1Db 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 ;->,
Db 71,72,61,80 ;HOME,^, F3, v
Db 59,68,79,119 ;F1, F10, END,^HOME
Db 115,132,118 ;^
db 46,31
Num2 Db$-What2
Where1 Dw OffsetNxtPage, Offset NxtPage, Offset Close, Offset Close
Dw OffsetNxtPage, Offset Back, Offset Got_H, Offset Got_H
Dw OffsetGot_S, Offset Right, Offset Left, Offset Top
Dw OffsetUp1, Offset Got_Rs, Offset Down1, Offset Close
Dw OffsetBottom
Where2 Dw OffsetRight, Offset Left, Offset Back, Offset NxtPage
Dw OffsetTop, Offset Up1, Offset Got_Rs, Offset Down1
Dw OffsetGot_H, Offset Close, Offset Bottom, Offset Home
Dw OffsetScroll0, Offset Top, Offset Bottom
dw offsetctrl, offset strip
HelpMsgDb 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 ShortControl
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: CmpFirst, 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: SubCX, 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
Back1Proc Near
Mov CX,23
Back0: Call UpOne
Loop Back0
Mov Col,1
Ret
Back1 Endp
;Scroll up one line
UpOneProc 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
; Помещаетзаписи в буфер экрана
AssumeCS: Cseg, DS: Cseg, ES: Nothing
ShowProc 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
ShowEndp
;Показывает следующую запись
ListOneProc 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
ListOneEndp
; 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 WordPtr 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:byteptr [SI+1], LF
je GetR6
mov byteptr 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
GetRecEndp
;Читает блок из файла
ReadBlkProc 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 BytePtr ES: [DI], 1Ah
ReadB2:Ret
ReadblkEndp
;Ввод текста после '/'
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
;Очищает экран
ClearProc 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 ProcNear
Mov AX,0600h
Sub BL,BL
Mov BH,Foregrd
Sub CX,CX
Mov DX,184Fh
Int 10h
Mov WordPtr 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
Set25Proc 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
Msg25Proc 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
;Инициализация необходимых данных
InitCrtProc 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
InitCrtEndp
;HELP – Выводит управляющие клавиши
Help ProcNear
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
;Извлекает имя файла с командной строки или из введенной
GetParmProc 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
GetParmEndp
; Открываетфайл
Open ProcNear
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
PgmSizeEqu ($-Cseg+16)/16; Размер программы в параграфах
Cseg Ends
End List