Інститут менеджменту та економіки „Галицька Академія”
КУРСОВИЙ ПРОЕКТ
з дисципліни “Системне програмування та операційні системи”
Тема – Розробка резидентної програми, що забезпечує перекодування символів у близькі по звучанню латинські літери
Анотація
В курсовому проекті розроблено алгоритм обробки переривань принтера на основі якого написано резидентну програму яка при спробі виводу на принтер текстових файлів здійснює перекодування символів розширеної таблиці у близькі по звучанню латинські літери. Програму виконано на рівні BIOS-переривань та команд мови Assembler, також детально розглянута структура та параметри резидентної області.
Summary
In a course project the algorithm of the event trapping of printer is developed on the basis of which resident software is written which at the attempt of conclusion on the printer of text files of carries out coding of characters of the extended table in the latin letters near on sounding. The program is executed at the level of BIOS-breaking and commands of the Assembler language, also in detail considered structure and parameters of resident region.
Зміст
ЗМІСТ ……....6
ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ В ПРОГРАМІ,
БЛОК-СХЕМА ПРОГРАМИ…………………………………………….
КОД ПРОГРАМИ З ПОЯСНЕННЯМИ (РЕМАРКАМИ)
ОПИС РОБОТИ ………...
ВИСНОВКИ ………..
ПЕРЕЛІК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ ………..
2 ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ В ПРОГРАМІ, БЛОК-СХЕМА ПРОГРАМИ
В резидентній програмі яка при спробі виводу на принтер текстових фаілів здійснює перекодування символів розширеної таблиці у близькі по звучанню латинські літери використано наступні функції:
jmp - команда безумовного переходу, передає управління в іншу точку програми, не зберігаючи будь-якої інформації для повернення. Операндом може бути безпосередня адреса для переходу, а також регістр або змінна, що містить адресу. В даній рограмі ця функція виконує перехід до загрузчика.
jl - команда, яка здійснює перехід, аналогічний попередній, з умовою якщо перший операнд при попередньому порівнянні виявився меншим від другого.
jne - ця команда здійснює перехід, за умови що операнди виявились не рівними між собою.
ja - ця команда здійснює перехід, за умови що один з операндів виявився вище другого.
jc - ця команда здійснює перехід, за умови переносу.
jz - ця команда здійснює перехід, за умови рівності нулю.
pusha - команда розміщує в стеку регістри в порядку : AX,CX,DX,BX,SP,BP,SI,DI.
popa - команда виконує дії повністю протилежні pusha, але поміщене в стек значення SP або ESP ігнорується.
popa завантажує зі стеку DI,SI,BP, збільшує SP на 2, і завантажує BX,DX,CX,AX.
mov - базова команда пересилання даних. Здійснює копіювання даних з джерела (вказується другим) в приймач (вказується першим, одразу після назви команди).
cmp - команда зрівнює операнди і встановлює флажки. Процес здійснюється шляхом вирахування джерела (число, регістр або змінна) з приймача (регістр або змінна, приймач та джерело не можуть бути змінними одночасно), причому результат вирахування нікуди не записується. Єдиним наслідком роботи цієї команди є зміна флажків CF, OF, SF, ZF, AF і PF. В даній програмі команда використовується в поєднанні з командами переходу jmp, jl та jne.
iret - вихід (повернення) з переривання. Повертає зі стеку значення IP, CS і FLAGS які були до переривання.
call - ця команда здійснює виклик процедури або переключення задачі.
inc - ця команда збільшує значення операнда в пам’яті або регістрі на 1.
lea - ця команда забезпечує отримання ефективної адреси (зміщення) джерела.
Блок – схема загрузочної частини програми
Блок – схема резидентної частини програми
Ні
Так
Програма на мові Assembler
my segment ;початок програми
.386
org 100h ;зміщення в 256 байт для PSP
start: ;мітка першої інтрукції
assume cs:my,ds:my,es:my,ss:my ;настройка сегментних регістрів
jmp real_start ;перехід на реальний початок програми
;(обхід блоку даних та резидентної частини)
;----------------оголошення змінних---------------------
;оголошення масиву символів розширеної таблиці ASCCI-кодів
rus_literu db
db128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,db145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,db162,163,164,165,166,167,168,169,170,171,172,173,174,175,224,225,226,db227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,db244,245
;оголошення масиву для заміни(кодування) близьких по звучанню
; символів розширеної таблиці ASCCI-кодів
lat_literu db db065,066,086,072,068,069,081,090,073,074,075,076,077,078,079,080,082,db083,084,089,070,088,067,052,087,087,000,085,054,070,089,065,097,098,db118,104,100,101,103,122,105,106,107,108,109,110,111,112,114,115,116,db121,102,088,099,052,119,119,054,117,054,101,121,097,069,101,069,101,db073,105
filename db "coded.txt",0 ;ім'я файла,де буде збережено результат
;кодування
des dw 0 ;дескриптор файла
sym db 0 ;змінна для збереження символів
old_int17_cs dw 0 ;зміщення старого вектора int 17h
old_int17_ip dw 0 ;сегмент старого вектора int 17h
; ================= нова програма обробки переривання int 17h
interrupt:
mov cs:sym,al ;зберігаєм символ, що подається на друк на принтер
call dword ptr cs:[old_int17_ip] ;виклик старої програми обробки переривання
;=====================================
;для імітації виклику переривання зберігаємо:
pushf ; в стеці поточний стан прапорців
pusha ;регістри оперативного призначення
push ds ;регістр ds
push es ;регістр es
;=============================
;настроюємо сегментні регістри
mov ax,cs
mov ds,ax
mov es,ax
mov al,cs:sym ; копіюєм символ, що подавався на принтер в змінній sym
xor di,di ;обнулюєм регістр di(використовується як індекс масивів)
find_sym:
mov ah,cs:rus_literu[di] ;копіюєм в регістр ah символ із розширеної
; таблиці ASCCI-кодів
inc di ;підготовлюєм новий адрес символа із розширеної таблиці ASCCI-
; кодів
cmp ah,al ; порівнюєм наш поданий символ із символом із розширеної
;таблиці ASCCI-кодів
jz found ; якщо співпадають - то перехід на мітку found
cmp di,70 ;перевіряєм, чи не більший індекс масиву за розмір масиву (в
; масиві 70 символів)
jz endi ; якщо ндекс масиву більший а розмір масиву - то перехід на
;мітку endi
jmp find_sym ; перехід на мітку find_sym(організація циклу)
found:
mov al,cs:lat_literu[di] ; копіюєм в регістр al символ із
; масиву для заміни(кодування) близьких по
; звучанню
; символів розширеної таблиці ASCCI-кодів
; (якщо співпадає поданий символ на друк із
;символом із розширеної таблиці ASCCI-кодів)
mov cs:sym,al ;копіюєм цей символ в змінну sym
endi:
mov ah,3dh ;відкриття файлу
lea dx,cs:filename ; в dx – адрес строки з назвою файлу
mov al,01h ;в al – режим відкриття (для запису)
int 21h ;переривання
mov cs:des,ax ;зберігаємо дескриптор файлу в des
mov ah,40h ;запис даних до файлу
mov bx,cs:des ; в bx – дескриптор