Розробка резидентної програми, що забезпечує перекодування символів у близькі по звучанню латинські літери
Анотація В курсовому проекті розроблено алгоритм обробки переривань принтера на основі якого написано резидентну програму яка при спробі виводу на принтер текстових файлів здійснює перекодування символів розширеної таблиці у близькі по звучанню латинські літери. Програму виконано на рівні 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 – дескриптор файлу lea dx,cs:sym ; в dx – адрес буферу, що містить інформацію для ; запису mov cx,01h ; в cx – кількість байт, що мають бути записані int 21h ;переривання mov ah,3eh ; закриття файлу mov bx,cs:des ; в bx – дескриптор int 21h ;переривання ;=========================================== ;повертаєм значення регістрів із стеку: pop es ;значення регістру es ;значення регістру ds popa ;значення всіх регістрів оперативного призначення iret ; передаємо управління перерваній програмі real_start: push es ;зберігаємо значення регістра es mov ax,3517h ;в AH – 35h (номер функції отримання вектора) ;в AL - 17 h (номер необхідного перервання) int 21h ;переривання mov old_int17_cs,es ;зберігаємо сегмент в змінній old_int8_cs mov old_int17_ip,bx ;зберігаємо зміщення в змінній old_int8_ ip lea dx,interrupt ;DS:DX – нова підпрограма обробки переривання mov ax,2517h ; AH - 25h номер функції установки вектора ; AL – 17h номер необхідного переривання int 21h ;переривання pop es ;відновлюєм es ;================================ ;створюєм файл із іменем "coded.txt" mov ah,3ch ; в ah - 3c -номер функції створення файлу lea dx,filename ; в dx - адрес строки з іменем файлу xor cx,cx ; в сх - атрибут файлу-(0) int 21h ;переривання mov des,ax ;зберігаємо дескриптор файлу в des
lea dx,real_start ;зміщення команди, починаючи з якої пам'ять буде ; звільнено int 27h ;передаємо управління DOS ends end start ОПИС РОБОТИ Програма складається з двох частин : резидентної, в якій виконуються безпосередньо завдання роботи і загрузчика, який заносить резидентну частину в пам’ять. На початку програми вибирається тип процесора і вказується номер переривання за яким слідкуватиме програма. Виконання програми починається із мітки start. Резидентна частина починається із задання функції переривання int 17h, яка здійснює перекодування символів у близькі по звучанню латинські літери. Далі відбувається перевірка перекодування символів Для цього користуємось командою порівняння cmp, за допомогою якої зрівнюєм значення регістрів у яких містяться поточні значення символів. Якщо символи співпадають - продовжуєм перевірку, поки всі символи не будуть перевірені. За допомогою команди mov. Наступною йде команда витягнення всіх основних регістрів зі стеку - pusha. Також задаються змінні для тимчасового збереження старої адреси вектора . Загрузчик починається від мітки real start. Спочатку отримуємо адресу попереднього вектора переривання Pnr , далі зберігаєм старші і молодші 16 біт адреси у відповідні змінні old_cs та old_ip. Завершуємо програму установкою нової адреси вектора переривання, присвоївши старшому байту регістру АХ змінну dec.
ВИСНОВКИ В результаті виконання курсового проектування було написано резидентну програму, що забезпечує перекодування символів у близькі по звучанню латинські літери. Наведено блок-схему програми, подано її опис функціонування. Текст резидентної частини програми і загрузчика написано на мові Assembler, з докладним описом використаних функції та ремарками.
ПЕРЕЛІК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ 1. Зубков СВ. Assembler для DOS, Windows и UNIX -3-е изд., стер. -К Пресс; СПб.гПитер, 2005.-608с. 2. Фролов А.В, Фролов Г.В. Апаратное обеспечение IBM PC: В 2-х ч. Часть 1 - 2-е изд., стер. - М.: „ДИАЛОГ-МИФИ”, 1992.-208 с. 3. Велихов А.В. Макроассемблер: Создание и отладка программ.- М-:Майор, 2001.-192с. 4. Системное программное обеспечение. Учебник для вузов/ А. Ю. Молчанов.- СПб.:Питер, 2ООЗ.-396с.
Рефераты по информатикеАнотація В курсовому проекті розроблено алгоритм обробки переривань принтера на основі якого написано резидентну програму яка при спробі виводу на
Оценок: 433 (Средняя 5 из 5)
Специалисты RetsCorp работают в digital-сфере более 7 лет. За это время мы разработали более 500+ успешных проектов. Основываясь на своем опыте и знании рынка, мы с уверенностью можем сказать, что будет работать, а что — нет. Заказывая создание лендинга для бизнеса в нашей студии, вы получаете работающие решения, необходимые именно вашему бизнесу.
Сотрудничая с нами, вы будете не клиентом, а нашим партнером. Благодаря этому мы будем развивать ваш бизнес как собственный. Мы так же как и вы заинтересованы в успехе проекта, поскольку ваша успешность будет нашей рекламой.