Міністерствоосвіти та науки УкраїниКіровоградський Державний Технічний університет
Кафедрапрограмного забезпечення
Курсоваробота
здисципліни “Програмування на мові 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
Блок-схемаалгоритму
/>