Розробка та реалізації програми з екранним інтерфейсом для порівняння двох текстових файлів

Основи програмування та робота з файлами. Ввід з клавіатури і вивід на екран. Опис вибраної мови. Текст програм та її опис на мові програмування Асемблер. Аналіз, отримання результату роботи програми, порівнювальний текст двох файлів і програмного коду.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 13.12.2011
Размер файла 1020,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

40

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Зміст

Завдання до курсової роботи

Реферат

Вступ

1. Основи програмування для MS DOS

1.1 Робота з файлами

1.2 Ввід з клавіатури

1.3 Вивід на екран засобами DOS

1.4 Вивід на екран засобами BIOS

2. Опис вибраного алгоритму програми

3. Блок-схема алгоритму програми на Асемблері

4. Текст програм та її опис на мові програмування Асемблер

5.Аналіз результату роботи програми

Висновки

Список використаної літератури

Завдання

на курсову роботу студента

Олексина Віктора Івановича

1.Тема роботи : розробка та реалізації програми з екранним інтерфейсом для порівняння двох текстових файлів.

2.Термін здачі студентом закінченої роботи 10.05.11.

3.Вихідні дані для роботи : порівнювальний текст двох файлів.

4.Зміст розрахунково-пояснювальної записки : курсова робота містить 4 розділи: Основи програмування для MS DOS; Робота з файлами; Блок-схема програми на Асемблері; Текст програм та її опис на мові програмування Асемблер; Аналіз результату роботи програми. Перший розділ поділяється на такі підрозділи : Робота з файлами; Ввід з клавіатури; Вивід на екран засобами DOS; Вивід на екран засобами BIOS.

5.Дата видачі завдання 08.02.11.

КАЛЕНДАРНИЙ ПЛАН

№ п/п

Назва етапів курсової роботи

Термін виконання етапів роботи

Примітки

1

ознайомлення із завданням

08.02.11 - 20.02.11

виконав

2

пошук літературип

20.02.11 - 15.03.11

виконав

3

аналіз теми

15.03.11 - 15.03.11

виконав

4

розробка алгоритму

15.03.11 - 30.03.11

виконав

5

розробка програми

30.03.11 - 30.04.11

виконав

6

тестування програми

30.04.11 - 08.05.11

виконав

Реферат

Під час виконання пояснювальної записки я звертався до 8 літературних джерел. Пояснювальна записка складається з таких розділів : 1.Основи програмування для MS DOS; 2.Блок-схема програми на Асемблері; 3.Текст програм та її опис на мові програмування Асемблер. Перший розділ поділяється на такі підрозділи : 1.1.Робота з файлами; 1.2.Ввід з клавіатури; 1.3.Вивід на екран засобами DOS; 1.4.Вивід на екран засобами BIOS.

Тема курсової роботи : „Розробка та реалізації програми з екранним інтерфейсом для порівняння двох текстових файлів”.

За мету в курсовій роботі ставиться, щоб закріпити і розширити знання одержані, при вивченні дисципліни „Системне програмування та операційні системи”.

Ціль роботи : розвинути навики і вміння ефективно застосувати ЕОМ для розв'язування прикладних задач.

Вступ

Курсова робота ставить ціль - ефективного застосування ЕОМ і мови програмування Асемблер для розробки та реалізації програми з екранним інтерфейсом для порівняння двох текстових файлів.

Виконання курсової роботи має за мету:

-поглибити теоретичні знання по засобах програмування;

-розширити знання одержані при вивченні дисциплін системне програмування та операційні системи;

-розвинути навики самостійної роботи з складання блок-схем алгоритмів і розробки та відлагодження програмного забезпечення.

Як відомо, програми, які написані на мові Асемблер відрізняються високою ефективністю, мінімальним об'ємом і максимальною швидкістю дій. Ця властивість зумовила широке використання мови Асемблер в тих випадках, коли швидкість роботи програми і використовувана нею пам'ять мають вирішальне значення. Деякі класи програм (наприклад, програми драйверів пристроїв, які відрізняються жорсткою структурою) вимагають для свого виконання обов'язкове використання мови Асемблер. З іншої сторони, оскільки сучасні системи програмування дозволяють об'єднувати в одну виконувану програму фрагменти написані на різних мовах, широко практикується установка комбінованих програм, в яких основна частина програми написана на мові високого рівня, а найбільш критичні ділянки - на мові Асемблер. Може використовуватись і оборотній метод, коли в програму на мові Асемблер вставляють фрагменти для виконання відносно важких логічних або математичних перетворювань, написаних на мові високого рівня. Такий метод застосовується при розробці драйверів. Процедури на мові Си, які включають текст драйвера полегшують програмування і відлагодження драйвера і прискорюють процес його розробки.

Однак, крім споживчих якостей, мова Асемблер має ще значну методичну цінність. Мова Асемблера надає унікальну можливість вивчення машини на „низькому рівні”, освоєння того, що і як вміє робити апаратура комп'ютера і що вносить в його роботу операційна система. Знайомство з внутрішніми можливостями комп'ютера надзвичайно корисно для програміста, який працює на мовах PASCAL або Си, так як дозволяє побачити за формалізмом у мовах високого рівня ті реальні процеси, які будуть протікати в системі для виконання прикладної програми і більш свідомо підійти до розробки структури програми і її конкретних алгоритмів.

Мова Асемблер, так як люба друга мова програмування, містить багато прикладних засобів, які дозволяють в ряді випадків прискорити і полегшити процес програмування і розширити можливості створюваних програм. Професійна робота на мові Асемблер надає детальне знайомство зі всіма цими засобами. Чим краще користувач володіє технікою програмування на мові Асемблер, тим більш ефективніші будуть його програми. Однак не менш важливим являється і друга сторона питання - освоєння особливостей використання мови для реалізації апаратних і програмних можливостей комп'ютера.

1. Основи програмування для MS DOS

1.1 Робота з файлами

В машинах виду IBM PC передбачено два рівні обслуговування з магнітними дисками. При роботі на низькому рівні користувач з допомогою переривання BIOS INT 13h звертається саме до програм управлінням диском. Типовими операціями цього рівня являються запис і читання секторів або форматування доріжок. Файлова система DOS не використовується; необхідна інформація відкривається не по імені файла, а по номерам поверхності, циліндра і сектора.

Верхній рівень реалізується з допомогою переривання DOS INT 21h, який також підтримує і функції обслуговування файлової структури. Програміст працює не з програмами управління фізичним диском, а з файловою системою DOS, отримуючи можливість оперувати такими поняттями файлової системи, як логічний диск, каталог, файл.

Як відомо, для полегшення роботи з великою кількістю різнотипних файлів в DOS використовується деревовидна структура каталогів. Каталог представляє собою файл, звичайно невеликого розміру, в якому міститься перелік всіх підкаталогів наступного рівня і файлів, які входять в даний каталог.

При утворенні нового файла DOS сама знаходить на диску вільне місце і надає його новому файлу, утворюючи новий елемент в каталогу і заповнюючи його відповідною тому файлу інформацією. Хоча мінімальною порцією інформації, яку передає контролер диска в процесі запису або читання, являється сектор, і програми BIOS працюють як раз з секторами, файлова система надає місце на диску цілими кластерами. Таким чином, мінімальний фізичний розмір файла, навіть, якщо дані в ньому займають лише декілька байтів, дорівнює одному кластеру. Однак в елементі каталогу вказується не фізична, а логічна довжина файла, тобто об'єм розміщених в ньому даних в байтах.

Робота з файлами визначає використання дескрипторів (файлових індексів), які в першому заголовку можуть розглядати як номер відкритих файлів.

Процедура читання-запису файла поділяється на наступні операції:

-утворення файла з вказаним ім'ям у вказаному каталогу або відкриття файла, якщо він був утворений раніше;

-запис у файл або читання із файла всього вмістимого або будь-якої частини;

-закриття файла.

В більшості випадків робота з файлом починається з виконанням операції його відкриття, для чого передбачена особлива функція DOS. Відкриваючи файл, DOS надає йому наступний вільний блок описання файла в системній таблиці відкритих файлів (System File Table, SFT). Об'єм цієї таблиці, який передбачає максимальне число файлів, з якими можна працювати одночасно, задається на етапі конфігурації DOS директивою FILES файлу CONFIG.SYS.

Звернення до відкритого файла (запис, читання, зміна характеристик файла і інш.) відбувається по присвоєному йому дескриптору; невідкритий файл дескриптора немає, і система працювати з ним не може. По мірі здійснення операцій з відкритим файлом DOS модифікує інформацію в блоку SFT; вміст SFT завжди відображає активного стану файла.

Після закінчення роботи з файлом його потрібно закрити призначеною для цього функцією DOS. В процесі закриття відбувається скид на диск буферів DOS, модифікація елемента каталогу і звільнення блока описання файла в SFT разом з закріпленим за ним дескриптором. Це і друге можна тепер використати для роботи з другим файлом.

При завершенні програми (для цього передбачена функція DOS 4Ch) відбувається автоматичне закриття всіх відкритих в програмі файлів. Для цього у простих і не дуже відповідальних програмах файли можна певним чином не закривати - вони все одно будуть закриті системою.

Функція 3Ch дозволяє утворити на диску файл із заданим ім'ям. Специфікація файла, тобто шлях до нього разом з ім'ям файла і його розширенням, вказується у вигляді символьної стрічки, яка закінчується подвійним нулем („рядка ASCIIZ”). Для специфікації файла в програмі діють звичайні правила DOS. Якщо, в специфікації файла відсутній шлях, файл утворюється в текучому каталозі текучого диска; якщо вказані шлях і ім'я файла, він утворюється у відповідному каталозі текучого диска і тощо.

Якщо функція 3Ch знаходить, що на диску уже є файл з вказаним ім'ям, вона фактично знищує його і утворює новий файл з тим же ім'ям.

Функція 40h дозволяє записати дані на любий пристрій, а в тому числі і в файл на диску. Конкретний приймач даних задається його дескриптором. Потрібно замітити, що при записі в файл, так і при виводі на любий пристрій, в приймач даних поступають лише ті дані, котрі вказані у програмі. Ніякі додаткові коди, наприклад, які вказують на кінець файлу, не записуються. Фактично у файл можна виводити любі дані. Функція запису 40h (так як і функція читання 3Fh) розглядає дані, які пересилаються, просто як послідовність байтів, не аналізуючи їх значення.

Функція 3Dh дозволяє відкрити уже існуючий файл. В регістрах DS:DX задається адрес специфікації файлу у вигляді рядка ASCIIZ; в регістрі AL - режим доступу (0 - читання, 1 - запис, 2 - читання і запис). Функція повертає дескриптор відкритого файла в регістрі AX.

Читання файла відбувається викликом функції 3Fh, яка потребує вказати вхідні параметри дескриптора джерела даних (в регістрі BX), адреса приймаючого буфера (в регістрах DS:BX) і в кількості байтів, які передаються (в регістрі CX). Якщо ми хочемо прочитати весь вміст файла, але не знаємо точно його довжини, можна в запиті на читання вказати завідомо більше число байтів (не більше 65535). Функція 3Fh сама визначить довжину файла і прочитає весь його вміст до кінця. Після повернення із DOS в регістр CX буде міститись число фактично прочитаних байтів.

1.2 Ввід з клавіатури

Операційна система представляє декілька способів вводу даних з клавіатури:

§ звернення до клавіатури з допомогою файлової функції 3Fh переривання INT 21h;

§ використання групи функцій вводу-виводу із діапазону 01h..0Ch переривання INT 21h;

§ посимвольний ввід шляхом звернення до BIOS з допомогою переривання INT 16h.

Ввід з клавіатури засобами файлової системи (INT 21h, функція 3Fh) відбувається точно так, як і читання із файла. Звичайно використовується дескриптор 0, який закріплений за стандартним пристроєм вводу, тобто за клавіатурою. Число введених символів вказується в регістрі CX, однак ввід закінчується лише після того, коли нажата клавіша Enter, незалежно від того, чи введено фактично менше символів, чим було заплановано або більше. Тому при вводу рядка з клавіатури немає необхідності наперед задавати їх довжину, достатньо загрузити в регістр CX максимальну довжину рядка, наприклад 80 байт. У любому випадку в регістрі AX повертається число реально введених байтів, при тому враховуються також і 2 байта (13 і 10), які поступають у вхідний буфер при натисканні клавіші Enter.

Особливо ситуація виникає, якщо попробувати ввести більше символів, ніж потрібно функцією 3Fh. В процесі виконання цієї функції всі символи, що вводяться, тут же забираються із кільцевого буфера вводу і пересилаються в буфер DOS. Зафіксувавши у вхіднім потоці коди клавіші Enter, DOS пересилає із цього буфера в буфер користувача у програмі точно потрібне число символів (тут зрозуміло, без кодів Enter, які розміщуються в кінці введеного рядка). Інші символи залишаються в буфері DOS, які готові до вводу. Якщо не прийняти спеціальних заходів до очистки буфера, вони поступлять у програму при наступному запиті 3Fh, навіть, якщо оператор ще не почав вводити наступну порцію даних. Очевидно, що у цьому випадку буде порушена синхронізація ходу виконання програми з роботою оператора.

Другий спосіб отримання даних з клавіатури у програму, за допомогою функцій DOS із діапазону 01h...0Ch, є більш громіздкий, але забезпечує більш різнообразні можливості. Взагалі відмінність цих функцій DOS заключається в тому, що вони виконуються на окремому стеці DOS і до них можна звертатися в обробнику апаратних переривань, якщо в основній програмі використовується лише функції „дискової” групи (тобто всі останні функції DOS). Однак у програмах, незв'язаних із обробкою апаратних переривань, належність функції до цієї чи іншої групи немає особливого значення і при виборі для використання у програмі треба керуватися чисто функціональними уявами.

Функції вводу з коротким описом перелічені у таблиці 1.1.

Таблиця 1.1. Функції вводу із групи функцій вводу-виводу

Функція

Призначення

01h

Ввід символу з відгуком і обробкою Ctrl+c

06h

Прямий символьний ввід-вивід через консоль

07h

Ввід символу без відгуку і без обробки Ctrl+c

08h

Ввід символу без відгуку і з обробкою Ctrl+c

0Ah

Буферний ввід рядка з відгуком

0Bh

Перевірка стану стандартного пристрою вводу

0Сh

Скидання кільцевого буфера клавіатури і ввід однієї із функції

Функції 01h, 06h, 07h, 08h при кожному визові вводять у програму один символ із кільцевого буфера вводу; при необхідності ввести групу символів (стрічку) ці функції треба використати у циклі. Розрізняються вони наявністю або відсутністю відображення символу на екрані (відгуку), а також реакцією на ввід з клавіатури Ctrl+c. Функції 01h і 0Ah відображають на екрані символи, які вводяться; функції 07h і 08h цього не роблять, що дає можливість вводити дані таємно від сторонніх (наприклад, пароль або ключ). Друга відмінність описаних функцій торкається їх реакції на ввід Ctrl+c. При виконанні функції 01h і 08h DOS перевіряє кожний символ, який вводиться і, знайшовши у вхідні потоці код Ctrl+c (03h), аварійно закінчує програму. Функції 06h і 07h пропускають код Ctrl+c в програму, не роблячи по ньому ніяких спеціальних дій. Таким чином, якщо програма здійснює ввід з клавіатури функція 06h або 07h, її не можна аварійно закінчити командою Ctrl+c. В наш час, коли відомо і широко використовується методика перехвату переривання 23h з передачею управління на прикладний обробник команд Ctrl+c і Ctrl+Break, всі ці роздуми про Ctrl+c зазнали краху.

Функції 01h, 07h і 08h призначені тільки для виводу; функція 06h реалізує як посимвольний ввід з клавіатури, так і вивід символів на екран. Режим роботи цієї функції задається в регістрі AL: код FFh означає ввід, любий інший код приводить до виводу на екран відповідного цьому коду символу.

Функція 0Ah передає в буфер користувача стрічку, яка вводиться з клавіатури. Рядок повинен закінчуватись натисканням клавіші Enter, а її довжина не повинна бути більшою 254 символів. Символи, які вводяться, відображаються на екран; при вводі Ctrl+c проходить аварійне завершення програми.

Функція 0Bh дозволяє провірити наявність в кільцевому буфері вводу символів. При наявності символів програма повинна вилучити їх із буфера однією із функцій вводу; якщо символів немає, програма може продовжити виконання. Така методика використовується в програмах, які носять циклічний характер, коли треба забезпечити управлінням ходом виконання програми з клавіатури термінала. У кожному кроці циклу після виконання запланованих дій провіряється стан кільцевого буфера вводу; якщо протягом наступного кроку циклу оператор натиснув на будь-яку клавішу, програма проаналізує введений код і здійснить вихід із циклу і перехід в ту іншу точку; якщо ж буфер являється пустим, то циклічне виконання продовжиться.

Функція 0Bh чутлива до Ctrl+c. Це дає можливість організувати за її допомогою аварійне завершення програм на тих її ділянках, де виконується чисто процесорні дії. Якщо, наприклад, включити виклик функції 0Bh в цикл, то при відсутності вводу з клавіатури цикл буде виконуватись звичайним чином, але після вводу Ctrl+c програма аварійно завершиться, хоча на виконуваній ділянці не використовуються функції вводу-виводу.

Функція 0Ch служить для організації вводу з попередньою очисткою кільцевого буфера. Ці функції, крім 07h, вводять в програму найбільш старий із символів, які накопичились в кільцевому буфері вводу, реалізуючи тим самим можливість вводу з повідомленням. В цьому режимі оператор може нажимати на клавіші ще до видачі програмою запиту на ввід; коди на натиснутих клавішах (не більше 15) будуть накопичуватись у кільцевому буфері вводу і вилучатись звідси в програму по мірі виконання нею запитів на ввід. Залежності від того функція 07h спочатку очищає кільцевий буфер і лише потім чекає вводу символу з клавіатури. В результаті коди всіх раніше натиснутих (випадково) клавіш губляться. Звичайно функцію 0Сh використовують в програмі слідом за функцією виводу на екран символьного рядка з пропозицією оператора вводити дані. В результаті із кільцевого буфера забирається все „сміття” від випадкових натиснень, в програму поступає лише це, що вводиться оператором після запиту програми. При цьому режим вводу (з відгуком або без нього) визначає, яка саме функція вводу (01h, 07h, 08h або 0Ah) реалізується „всередині” функції 07h.

Функції 01h, 07h, 08h і 0Ah являються синхронними, так чи інакше при відсутності символу в кільцевім буфері чекають його вводу. Функція 06h дозволяє визначити стан кільцевого буфера і при наявності в нім коду вилучити цей код і обробити його, а при відсутності - продовжити виконання програми.

Функції 01h, 06h, 07h і 08h дозволяють вводити в програму розширені коди ASCII. Для того, виявивши, що введений код ASCII рівний нулю, потрібно виконати функцію заново. Це дає можливість керувати прикладними програмами з допомогою функціональних клавіш, а також комбінації Alt+цифра, Alt+буква і інш.

Функції 06h, 07h і 08h дозволяють вводити в програму коди символів з допомогою комбінацій Alt+цифра на цифровій клавіатурі (в тому числі деякі із перших 32 символів кодової таблиці і всю другу половину кодової таблиці).

Робота з клавіатурою на рівні BIOS (INT 16h) дозволяє зчитувати 2-байтові коди, які поступають в кільцевий буфер вводу (код ASCII+ска код) і аналізувати слово прапорців клавіатури (натискання клавіш Ctrl, Alt, Shift і інш.). Функціі BIOS, які використовуються для вводу з клавіатури, перечислені в табл. 1.2.

Функція 00h дозволяє в одній дії дістати повний 2-байтовий код натисненої клавіші або комбінацію клавіш, із якого можна взяти скан-код (деякі програми фіксують натиснені клавіші не по кодам ASCII, а по їх скан-кодам), а також дістати значну частину розширеного коду ASCII (при натисканні, наприклад, функціональних клавіш). Функція 00h являється синхронною: при її дії програма зупиняється і очікує натиснення клавіші.

Таблиця 1.2. Функції вводу BIOS (переривання int 16h)

Функція

Призначення

00h

Читання 2-байтового коду із вхідного буфера

01h

Читання стану клавіатури і 2-байтового коду без витирання його із буфера

02h

Читання прапорців клавіатури

Функція 01h відноситься до числа асинхронних: визначивши стан клавіатури (точніше, буфер вводу), вона віддає управління програмі. Стан буфера повертається в прапорець ZF: якщо в буфері є очікування вводу в програму символу, ZF=0; якщо ж буфер пустий, ZF=1. при наявності в буфері коду символу його можна проаналізувати, так як він повертається функцією в регістрі AX (АН=скн-код, AL=код ASCII). Необхідно мати на увазі, що функція 01h копіює 2-байтовий код в регістр AX і не очищує при тому кільцевий буфер. Забрати символ з очисткою буфера можна пізніше функцією 00h.

1.3 Вивід на екран засобами DOS

Так як і при вводі з клавіатури, операційна система представляє декілька способів виводу даних на екран:

§ звернення до екрану з допомогою файлової функції 40h переривання INT 21h;

§ використання групи функцій вводу-виводу із діапазону 01h…0Ch переривання INT 21h;

§ вивід на екран засобами BIOS з допомогою переривання INT 10h.

DOS (переривання 21h) підтримує тільки текстовий монохромний вивід; з допомогою функцій BIOS можна реалізувати усі можливості відеосистеми: вивід кольорових символів, становлення відеорежимів, переключання відеосторінок, завантаження шрифтів і інш.

Вивід на екран засобами файлової системи (переривання 21h, функція 40h) відбувається так само, як і запис в файл. Використовується дескриптори 1 (стандартний вивід) або 2 (стандартна помилка), які закріплені за екраном. Вивід через дескриптор 1 може бути перенаправлений в файл або на інший пристрій (послідовний порт, принтер); вивід через дескриптор 2 не перенаправляється і звичайно використовується для виводу на екран службових повідомлень. Число символів, які потрібно вивести, вказуються в регістрі CX, а адрес стрічки, яку потрібно вивести - в регістрах DS:DX. Коди 08h (крок назад), 0Аh (перевід стрічки), 0Dh (повернення каретки) і деякі інші розглядаються як керівні і виконуються відповідні ним дії.

Як уже відмічалось, DOS не підтримує колір і, крім того, не має засобів очищення екрана і установки позиції курсору. Таким чином, вивід з допомогою функцій DOS відбувається тільки стрічка за стрічкою, при тому по мірі виводу стрічок зображення на екрані автоматично прокручується вверх. Але в склад DOS включається драйвер ANSI.SYS, встановлення якого (з допомогою файла CONFIG.SYS) трохи розширює можливості виводу на екран. В тому випадку на екран, крім розміщених текстів, посилаються Esc-послідовності, які дозволяють змінювати колір символів, установлювати позицію курсору і виконувати деякі інші настройки екрана (і клавіатури).

Другий спосіб виводу на екран текстової інформації відбувається з допомогою трьох функцій DOS, представлених в табл. 1.3.

Таблиця 1.3. Функції DOS виводу на екран

Функція

Призначення

02h

Вивід символу

06h

Прямий ввід-вивід

09h

Вивід стрічки

Функція 09h широко використовується в системних і прикладних програмах для виводу на екран інформаційних повідомлень. Вона не вимагає вказувати дескриптора (хоча в дійсності використовує дескриптор стандартного виводу 1); немає потреби також вказувати довжину стрічки, яку виводять. Перед викликом переривання адрес повідомлення заноситься в регістри DS:DX; повідомлення повинне закінчуватись символом $ (код якого рівний 24h). При відсутності у стрічці цього символу на екран буде виводитися вмістимість всіх байтів пам'яті, розміщених за стрічкою, до цього часу, коли в пам'яті випадково не зустрінеться код 24h.

Функція 02h викликає передачу на екран одного символу, який поміщається в регістр DL. Для виведення послідовності символів функцію потрібно використовувати в циклі.

Функція 06h не має особливих властивостей перед іншими функціями і використовується рідко.

1.4 Вивід на екран засобами BIOS

Функції BIOS володіють великими можливостями і широко використовуються в прикладних програмах для утворення кольорових інформаційних кадрів, переключання відеорежимів, завантаження шрифтів користувача і інші дії з відеосистемою. Їх недостаток в порівнянні з функціями DOS являється відносна величина використання. Функції використовуються при роботі в текстовому режимі, які перечислені в табл. 1.4.

Функція 02h дозволяє встановити позицію текстового курсору, задаючи його розміщення у вигляді номера рядка (0...24) і номера стовпчика (0...79). BIOS підтримує 8 незалежних курсорів - по одному на кожну відеосторінку, причому функція 02h встановлює позицію курсору незалежно від того, яка сторінка являється активною.

Функція 03h дозволяє отримати і зберегти текуче положення курсору. Це дає можливість перейти тимчасово в інше місце екрана, сформувати екран зображення, а потім вернутися на старе місце.

Таблиця 1.4. Основні функції BIOS для роботи в текстовім режимі

Функція

Призначення

02h

Установка позиції курсору

03h

Зчитування позиції курсору

05h

Установка відеосторінки

06h

Ініціалізація або прокрутка вікна вгору

07h

Ініціалізація або прокрутка вікна вниз

08h

Читання символу і атрибута в поточній позиції курсору

09h

Запис символу із заданим атрибутом на екран в позицію курсору

0Ah

Запис символу з поточним атрибутом на екран в позицію курсору

0Eh

Запис символу з поточним атрибутом а режимі телетайпу

1003h

Перемикання біта „мерехтіння/яскравість”

13h

Запис стрічки символів із заданими атрибутами

Функція 05h переключає відеосторінку. Якщо відеосистема знаходиться в текстовому режимі, то переключається текстові сторінки (0...7), якщо встановлений графічний режим, то переключається графічні сторінки (0...1).

Більша частина описаних нижче функцій виводу на екран дозволяє формувати зображення на будь-якій відеосторінці, як на активній, так і на скритій. Це дає можливість або підготовити завідома декілька сторінок і в міру необхідності швидко їх переключати або, коли поки одна сторінка виводиться на екран, готовити зображення на наступній.

За допомогою функцій 06h і 07h в заданому місці екрана дисплея створюються кольорові прямокутні вікна заданих розмірів. Якщо в створених завідома вікнах є виділений будь-який текст, то з допомогою цих функцій можна прокручувати текст вверх або вниз. При цьому текст, який виходить за край вікна, пропадає, а із протилежного краю появляється пусті рядки із заданими атрибутами кольорів. Для заповнення рядків текстом потрібно використати відповідні функції BIOS, при чому контроль розміщення, довжини і кольору стрічки покладається на програміста. Програми BIOS тільки прокручують задану прямокутну область екрану (разом з текстом в ній).

Функції 09h, 0Ah, 0Eh і 13h служать для виводу на екран окремих символів і символьних стрічок (в циклі). Функцій 09h і 0Ah не виконують фільтрації символів, тому за їх допомогою можна виводити усі символи кодової сторінки. Передбачений вивід одного і того ж символу задане число раз, що можна використати при створенні рамок і орнаментів. Вивід символу не переміщує курсору, тому кожний раз перед використанням функції 09h або 0Ah треба задати позицію курсору з допомогою функції 02h. Відмінність функцій 09h і 0Ah заключається в тому, що перша дозволяє вивести символ з любим атрибутом, а друга використовує попередній атрибут тої позиції, куди виводиться символ.

Функція 0Eh фільтрує управляючі коди 07h (сигнал звуку), 08h (крок назад), 10h (перевід стрічки) і 13h (повернення каретки), яка виконує відповідні їм дії. Курсор переміщується після виводу кожного символу, що дає можливість виводити цілі стрічки. Однак атрибут символу встановити не можна , символ набуває попередній атрибут тої позиції, де він виводиться. При необхідності виводу символу з новим атрибутом потрібно спочатку вивести в задану позицію символ пробілу з потрібним атрибутом (функцією 09h), а пізніше там же послати символ з допомогою функції 0Eh.

Важливою властивістю функції 0Eh являється автоматичний перехід на наступну стрічку після завершення попередньої, а також прокрутка екрана вверх на одну стрічку після заповнення найнижчої стрічки.

Функція 13h призначена для виводу стрічок із вказанням атрибутів, як кожного символу окремо, так і всієї стрічки. Функція може виконуватись в чотирьох варіантах в залежності від коду режиму, який вказується в регістрі AL, в режимах 0 і 1 атрибут символів вказується зразу для всієї стрічки в регістрі BL, причому в режимі 0 курсор не зміщується в процесі виводу, а в режимі 1 - зміщується на довжину стрічки. В режимах 2 і 3 атрибути символів включаються у виведену стрічку, в якій, таким чином, дозволяє встановлювати атрибути для кожного символу незалежно. Режим 2 відрізняються від режиму 3 тим, що в першому випадку курсор не зміщується, а, по-друге, зміщуеться на довжину стрічки.

При виклику функції 13h в регістрі DX задаються координати початку стрічки, яку виводиться (в DH - стрічка екрана, і в DL - стовпчик), а в регістрі CX - довжина стрічки, яка в режимах 2 і 3 оказується за рахунок байтів з атрибутом в два рази більше довжини стрічки, яка реально появляється на екрані. Адрес стрічки, яка виводиться, повинен бути поміщеним в регістрі ES:BP.

Функція 13h виводить не всі символи, так як коди 07h, 08h 0Ah і 0Dh розглядаються як керуючі.

При виводі на екран засобами BIOS необхідно знати, що ввід з клавіатури Ctrl+c не приводить до завершення програми. Потрібно остерігатися безкінечних циклів виводу на екран; вихід із них можливий лише шляхом перезавантаження комп'ютера.

Підфункція 03h функції 10h (переривання 10h), на відміну від описаних вище функцій виводу символів і стрічок, діє зразу на весь екран і впливає на зображення тих символів, у яких встановлений старший біт атрибута фону. Функція дозволяє або приписати цей біт яскравості фону, що дає можливість виводити на екран 16 кольорів фону, або назначити його атрибут мерехтіння символу. В останньому випадку колір фону може приймати тільки 8 значень.

програма клавіатура алгоритм

2. Опис вибраного алгоритму програми

У розробленій програмі для порівняння двох текстових файлів, містяться три алгоритми порівняння тексту. Ці алгоритми є незалежні один від одного, тобто будуть мати різні результати виконання порівнянь двох текстових файлів. Результатом роботи програми буде виведення тексту двох файлів, у яких спільна частина тексту буде позначатись зеленим кольором, а відмінна - червоним.

Перший алгоритм проводить порівняння по словах, тобто беремо перше слово із першого файла і порівнюємо чи таке саме слово є у другому файлі, якщо є то присвоюємо цьому слову зелений колір, а якщо ні, то присвоюємо червоний колір і так дальше. Таке ж саме порівняння проводимо із словами другого файла із першим.

У своїй програмі я вважаю за слово цю частину тексту, яка розділена із двох сторін, як мінімум по одному пробілу. У звязку із тим після відкривання і читання файлів я заношу у кінець буферів по одному пробілу.

Другий алгоритм проводить симетричне порівняння по одному символу, а саме: беремо перший символ першого файла і порівнюємо з першим символом другого файла, а пізніше беремо другий символ першого файла і порівнюємо з другим символом другого файла і так дальше, однакові символи позначаємо зеленим кольором, а відмінні символи - червоним. Третій алгоритм проводить порівняння по двох суміжних символах, тобто беремо два суміжні символи першого файла і шукаємо чи є такі два суміжні символи у другому файлі і так дальше, однакові символи позначаємо зеленим кольором, а відмінні символи - червоним.

Таке ж саме порівняння проводимо із двома суміжними символами другого файла із першим.

Усі ці три алгоритми також можуть працювати в одному із двох станів: порівнювати прописні символи або не порівнювати їх. Другий стан, а саме не порівнювати прописні символи полягає в тому, що я копіюю значення буферів в інші буфера і перетворюю усі символи цих буферів у прописні символи, а в кінці виводжу на екран скопійовані буфера.

3. Блок-схема програми на Асемблері

4. Текст програм та її опис на мові програмування Асемблер

IDEAL

MODEL small

STACK 256

MACRO koordun x1,y1

mov ah,02h ; функція установки позиції курсора

mov bh,0 ; номер сторінки

mov dh,y1 ; стрічка

mov dl,x1 ; стовпчик

int 10h ; виклик BIOS

ENDM koordun

MACRO fon x1,y1,x2,y2,kolir

mov ah,06h ; ініціалізація вікна

mov al,0 ; очищення

mov bh,kolir ; атрибути символів у вікні

mov ch,y1 ; рядок

mov cl,x1 ; стовпець

mov dh,y2 ; рядок

mov dl,x2 ; стовпець

int 10h ; виклик BIOS

ENDM fon

MACRO DOS_09h msg0

mov ah,09h ; виведення на екран

mov dx,offset msg0 ; адрес msg0

int 21h ; виклик DOS

ENDM

MACRO BIOS_09h p,kolir

mov ah,09h ; виведення символа на екран

mov al,p ; ASCII код символу

mov bl,kolir ; атрибут символа

mov bh,0 ; номер сторінки

mov cx,1 ; кількість повторень

int 10h ; виклик BIOS

ENDM

MACRO storinka x1,y1,kolir

local loopst7 ; оголошення мітки локальною

mov si,0 ; обнулення si

mov cx,8 ; кількіть циклів

loopst7: push cx ; занесення cx у стек

koordun x1,y1 ; виклик макросу

BIOS_09h st+si,kolir ; виклик макросу

inc y1 ; інкремент y1

inc si ; інкремент si

pop cx ; взяття із стеку

loop loopst7 ; команда циклу із cx кроків

ENDM

MACRO bufk_01110101

local loop20 ; оголошення мітки локальною

mov si,0 ; обнулення si

mov cx,6250 ; кількіть циклів

loop20: mov buf1k+si,01110101b ; задання кольору

mov buf2k+si,01110101b ; задання кольору

inc si ; інкремент si

loop loop20 ; команда циклу із cx кроків

ENDM

DATASEG

H db 0

p db ?

msg0 db ?

kolir db ?

slovo db 50 dup ('$')

handle dw 0

znaksi dw ?

mak_buf1 dw ?

mak_buf2 dw ?

buf1vel db 6250 dup (?)

buf2vel db 6250 dup (?)

buf1 db 6250 dup (?)

buf2 db 6250 dup (?)

buf1k db 6250 dup (01110101b)

buf2k db 6250 dup (01110101b)

fname1 db 50 dup ('$'),0

fname2 db 50 dup ('$'),0

ExCode DB 0

kolor db ?

x1 db ?

k db ?

x2 db ?

y1 db ?

y2 db ?

n db 30h

m db 30h

st db 'STORINKA'

msg db 2*80 dup (20h)

db 20h,0c9h,0cdh,0d1h,20 dup (0cdh),20h,54 dup (0cdh),0bbh

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0c8h,0cdh,0cfh,75 dup (0cdh),0bch

db 20h,0c9h,0cdh,0d1h,20 dup (0cdh),20h,54 dup (0cdh),0bbh

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0bah,20h,0b3h,75 dup (20h),0bah

db 20h,0c8h,0cdh,0cfh,75 dup (0cdh),0bch

db '$'

n_si dw ?

n_di dw ?

msg1 db 10,13,'‚ўҐ¤iвм i¬`п ЇҐаи®Ј® д ©« : $' ; Введіть і`мя першого файла

msg2 db 10,13,'” ©« ­Ґ ­ ©¤Ґ­$' ; файл нен найден

msg3 db 10,13,'Џгвм ­Ґ ­ ©¤Ґ­$' ; путь не найден

msg4 db 10,13,'`«ЁиЄ®¬ ¬­®Ј® ®вЄаЁвЁе д ©«®ў$' ; слишком много откритих файлов

msg5 db 'Esp: ўўҐ¤Ґ­­п i`¬п бЇ®з вЄг, Backsp: бвЁа ­­п §«iў , Ctrl-c: ўЁеi¤$'

msg6 db 10,13,'ЌҐЇа ўЁ«м­Ё© ०Ё¬ ¤®бвгЇ$' ; неправильний режим доступу

msg7 db 10,13,'‚ўҐ¤iвм i¬`п ¤агЈ®Ј® д ©« : $' ; Введіть і`мя другого файла

msg9 db ' -®¤­ Є®ўi, -аi§­i, -§­ Є в Ўг«пжiх, -§­ Є Ў§ жг$'

msg10 db 10,13,'‚ўҐ¤iвм 1 пЄй® ­Ґ е®зҐвҐ ЇҐаҐўiапвЁ Їа®Ёб­i ЎгЄўЁ $'

msg11 db ' F5: Ї®аiў. Ї® б«®ў ¬ , F6: Ї®аiў. Ї® ®¤­®¬г Ґ¬Ґ­.,$'

msg13 db ' F8: ­Ґ Ї®аiў. Їа®ЇЁб­Ёе ЎгЄў , Tab: ЄвЁў­iбвм Ї ­Ґ«Ґ©, F10: ўЁеi¤$'

msg12 db 10,13,13,20 dup (20h),'”Ђ‰‹€ ђI‚ЌI$'

CODESEG

Start: mov ax,@data ; адрес сегмента даних спочатку присвоюємо AX

mov ds,ax ; а пізніше пересилаємо з AX в DS

mov es,ax ; в ES заносимо адрес AX

DOS_09h msg5 ; виклик макроса

; ВВЕДЕННЯ НАЗВИ ФАЙЛА 1

esc1:

DOS_09h msg1 ; виклик макроса

mov bx,0 ; обнуляємо BX

vvid_fname1:

mov ah,08h ; виклик функції DOS 08h

int 21h ; виклик DOS

cmp al,13 ; порівняння з ентером

je ente ; перехід на ente, якщо рівно

cmp al,1bh ; порівняння з Esc

je esc1 ; перехід на esc1, якщо рівно

cmp al,08h ; порівняння з Backsp

jne backsp ; перехід на backsp, якщо не рівно

dec bx ; декремент BX

dec bx ; декремент BX

jmp dal2 ; перехід на dal2

backsp:

mov fname1+bx,al ; присвоєння fname1+bx значення al

dal2:

mov ah,02h ; виклик функції DOS виведення на екран

mov dl,al ; в DL заноситися ASCII код виведеного символу

int 21h ; виклик DOS

inc bx ; інкремент BX

jmp vvid_fname1 ; перехід на vvid_fname1

ente: mov fname1+bx,' ' ; в кінець буфера заносимо пробіл

; ВІДКРИВАННЯ ФАЙЛУ 1

mov ah,3Dh ; функція відкривання файла

mov al,2 ; доступ для читання і запису

mov dx,offset fname1 ; адрес ім`я файлу

int 21h ; виклик DOS

mov handle,ax ; зберігаємо дескриптор

cmp ax,02h ; файл нен найден

jne pom_02h ; перехід на pom_02h, якщо не рівно

DOS_09h msg2 ; виклик макросу

jmp vvid_fname1 ; перехід на vvid_fname1

pom_02h:

cmp ax,03h ; шлях не найден

jne pom_03h ; перехід на pom_03h, якщо не рівно

DOS_09h msg3 ; виклик макросу

jmp vvid_fname1 ; перехід на vvid_fname1

pom_03h:

cmp al,04h ; слишком много откритих файлов

jne pom_04h ; перехід на pom_04h, якщо не рівно

DOS_09h msg4 ; виклик макросу

jmp vvid_fname1 ; перехід на vvid_fname1

pom_04h:

cmp al,0ch ; неправильний режим доступу

jne pom_0ch ; перехід на pom_0сh, якщо не рівно

DOS_09h msg6 ; виклик макросу

jmp vvid_fname1 ; перехід на vvid_fname1

pom_0ch:

; ЧИТАННЯ ФАЙЛУ 1

mov ah,3fh ; функція читання файла

mov bx,handle ; дескриптор

mov cx,6250 ; кількість читання байтів

mov dx,offset buf1 ; адрес buf1

int 21h ; виклик DOS

mov mak_buf1,ax ; кількість реально прочитали

; ВВЕДЕННЯ НАЗВИ ФАЙЛУ 2

esc2:

DOS_09h msg7 ; виклик макросу

mov bx,0 ; обнуляємо BX

vvid_fname2:

mov ah,08h ; функція введення символу

int 21h ; виклик DOS

cmp al,13 ; порівняння з ентером

je ente1 ; перехід на ente1, якщо рівно

cmp al,1bh ; порівняння з Esc

je esc2 ; перехід на esc2, якщо рівно

cmp al,08h ; порівняння з Backsp

jne backsp1 ; перехід на backsp1, якщо не рівно

dec bx ; декремент BX

dec bx ; декремент BX

jmp dal3 ; перехід на dal3

backsp1:

mov fname2+bx,al ; присвоєння fname2+bx значення al

dal3:

mov ah,02h ; виклик функції DOS виведення на екран

mov dl,al ; в DL заноситися ASCII код виведеного символу

int 21h ; виклик DOS

inc bx ; інкремент BX

jmp vvid_fname2 ; перехід на vvid_fname2

ente1: mov fname2+bx,' ' ; в кінець буфера заносимо пробіл

; ВІДКРИВАННЯ ФАЙЛУ 2

mov ah,3Dh ; функція відкривання файла

mov al,2 ; доступ для читання і запису

mov dx,offset fname2 ; адрес ім`я файлу

int 21h ; виклик DOS

mov handle,ax ; зберігаємо дескриптор

cmp ax,02h ; файл нен найден

jne pom_02h1 ; перехід на pom_02h1, якщо не рівно

DOS_09h msg2 ; виклик макросу

jmp vvid_fname2 ; перехід на vvid_fname2

pom_02h1:

cmp ax,03h ; путь не найден

jne pom_03h1 ; перехід на pom_03h1, якщо не рівно

DOS_09h msg3 ; виклик макросу

jmp vvid_fname2 ; перехід на vvid_fname2

pom_03h1:

cmp al,04h ; слишком много откритих файлов

jne pom_04h1 ; перехід на pom_04h1, якщо не рівно

DOS_09h msg4 ; виклик макросу

jmp vvid_fname2 ; перехід на vvid_fname2

pom_04h1:

cmp al,0ch ; неправильний режим доступу

jne pom_0ch1 ; перехід на pom_0сh1, якщо не рівно

DOS_09h msg6 ; виклик макросу

jmp vvid_fname2 ; перехід на vvid_fname2

pom_0ch1:

; ЧИТАННЯ ФАЙЛУ 2

mov ah,3fh ; функція читання файлу

mov bx,handle ; дескриптор

mov cx,6250 ; кількість читання байтів

mov dx,offset buf2 ; адрес buf2

int 21h ; виклик DOS

mov mak_buf2,ax ; кількість реально прочитали

; ПОРІВНЯННЯ НА РІВНІСТЬ

mov si,offset buf1 ; адрес buf1

mov di,offset buf2 ; адрес buf2

cld ; встановлення прапорця DF

mov cx,mak_buf1 ; число повторень

repe cmpsb

jne nem ; перехід, якщо не рівно

DOS_09h msg12 ; виклик макросу

mov ah,08h ; функція введення символа

int 21h ; виклик DOS

nem:

; ЗАНЕСЕННЯ ПРОБІЛУ

у 1

inc si ; інкремент si

mov buf1+si,' ' ; у кінець буфера buf1 заносимо пробіл

mov si,mak_buf2 ; si присвоюємо кількість прочитаних елементів файлу 2

inc si ; інкремент si

mov buf2+si,' ' ; у кінець буфера buf2 заносимо пробіл

mov si,0 ; обнулення si

mov cx,6250 ; кількість циклів

loop23: mov al,buf1+si ; в al заносимо елемент буфера

mov buf1vel+si,al ; в буфер заносимо значення al

mov ah,buf2+si ; в ah заносимо елемент буфера

mov buf2vel+si,ah ; в буфер заносимо значення ah

inc si ; інкремент si

loop loop23 ; команда циклу із cx кроків

fon 0,0,79,24,01110001b ; виклик макросу

koordun 0,0 ; виклик макросу

DOS_09h msg ; виклик макросу

koordun 0,0 ; виклик макросу

DOS_09h msg11 ; виклик макросу

fon 0,1,79,1,01110001b ; виклик макросу

koordun 0,1 ; виклик макросу

DOS_09h msg13 ; виклик макросу

koordun 25,2 ; виклик макросу

DOS_09h fname1 ; виклик макросу

koordun 25,13 ; виклик макросу

DOS_09h fname2 ; виклик макросу

koordun 3,25 ; виклик макросу

;DOS_09h msg9 ; виклик макросу

fon 3,24,4,24,00100000b ; виклик макросу

fon 17,24,18,24,01010000b ; виклик макросу

koordun 29,24 ; виклик макросу

BIOS_09h 9,01110010b ; виклик макросу

koordun 47,24 ; виклик макросу

BIOS_09h 13,01110010b ; виклик макросу

koordun 48,24 ; виклик макросу

BIOS_09h 10,01110010b ; виклик макросу

jmp dal

; РОБОТА З ПРОПИСИМИ БУКВАМИ

F8:

fon 0,0,79,24,01110001b ; виклик макросу

koordun 0,0 ; виклик макросу

DOS_09h msg ; виклик макросу

koordun 0,0 ; виклик макросу

DOS_09h msg11 ; виклик макросу

fon 0,1,79,1,01110001b ; виклик макросу

koordun 0,1 ; виклик макросу

DOS_09h msg13 ; виклик макросу

koordun 25,2 ; виклик макросу

DOS_09h fname1 ; виклик макросу

koordun 25,13 ; виклик макросу

DOS_09h fname2 ; виклик макросу

koordun 3,24 ; виклик макросу

DOS_09h msg9 ; виклик макросу

fon 3,24,4,24,00100000b ; виклик макросу

fon 17,24,18,24,01010000b ; виклик макросу

koordun 29,24 ; виклик макросу

BIOS_09h 9,01110010b ; виклик макросу

koordun 47,24 ; виклик макросу

BIOS_09h 13,01110010b ; виклик макросу

koordun 48,24 ; виклик макросу

BIOS_09h 10,01110010b ; виклик макросу

cmp H,0 ; порівняння з 0

je H0 ; перехід, якщо рівно

jmp no_H0 ; перехід

H0:

fon 0,1,79,1,01110001b ; виклик макросу

koordun 0,1 ; виклик макросу

DOS_09h msg13 ; виклик макросу

mov si,0 ; обнулення si

mov cx,6250 ; кількість циклів

loop21: mov al,buf1vel+si ; в al заносимо елемент буфера

mov buf1+si,al ; в буфер заносимо значення al

mov ah,buf2vel+si ; в ah заносимо елемент буфера

mov buf2+si,ah ; в буфер заносимо значення ah

inc si ; інкремент si

loop loop21 ; команда циклу із cx кроків

no_H0:

cmp H,1 ; порівняння з 1

je H1 ; перехід, якщо рівно

jmp no_H1 ; перехід

H1:

fon 0,1,79,1,01110001b ; виклик макросу

fon 1,1,29,1,01100001b ; виклик макросу

koordun 0,1 ; виклик макросу

DOS_09h msg13 ; виклик макросу

mov si,0 ; обнулення si

mov cx,6250 ; кількість циклів

loop14: mov al,buf1+si ; в al заносимо елемент буфера

mov buf1vel+si,al ; в буфер заносимо значення al

mov ah,buf2+si ; в ah заносимо елемент буфера

mov buf2vel+si,ah ; в буфер заносимо значення ah

inc si ; інкремент si

loop loop14 ; команда циклу із cx кроків

mov cx,mak_buf1 ; кількість циклів

mov si,0 ; обнулення si

loop15: mov al,buf1+si ; в al заносимо елемент буфера

cmp al,'a' ; менше "а"

jb loop16 ; перехід, якщо менше

cmp al,'z' ; більше "z"

ja loop16 ; перехід, якщо більше

sub al,20h ; віднімання 20h

mov buf1+si,al ; в буфер заносимо значення al

loop16: inc si ; інкремент si

loop loop15 ; команда циклу із cx кроків

mov cx,mak_buf2 ; кількість циклів

mov si,0 ; обнулення si

loop17: mov al,buf2+si ; в al заносимо елемент буфера

cmp al,'a' ; менше "а"

jb loop18 ; перехід, якщо менше

cmp al,'z' ; більше "z"

ja loop18 ; перехід, якщо більше

sub al,20h ; віднімання 20h

mov buf2+si,al ; в буфер заносимо значення al

loop18: inc si ; інкремент si

loop loop17 ; команда циклу із cx кроків

no_H1:

dal:

pov4:

mov ah,08h ; функція введення символу

int 21h ; виклик DOS

cmp al,44h ; нажата клавіша F10

jne no2_vuxit ; перехід, якщо не рівно

jmp vuxit

no2_vuxit:

cmp al,42h ; нажата клавіша F8

jne no_F8 ; перехід, якщо не рівно

cmp H,1 ; порівняння з 1

je H_1 ; перехід, якщо рівно

mov H,1 ; присвоєння Н 0

jmp F8 ; перехід

H_1:

mov H,0 ; порівняння з 0

jmp F8

no_F8:

cmp al,3Fh ; порівняння з клавішею "F5"

je F5 ; перехід, якщо не рівно

jmp no_F5 ; ПОРІВНЯННЯ BUF1 З BUF2

F5:

fon 0,0,79,0,01110001b ; виклик макросу

fon 1,0,21,0,01100001b ; виклик макросу

koordun 0,0 ; виклик макросу

DOS_09h msg11 ; виклик макросу

bufk_01110101

mov si,0 ; обнулення si

mov di,0 ; обнулення di

; занесення слова в буфер slovo

pov:

mov al,buf1+si ; в al заносимо si-товий елемент масива buf1

cmp al,' ' ; якщо al рівне пробілу перехід на мітку vux

je vux ; перехідб якщо рівне

mov slovo+di,al ; в di-товий елемент масива slovo заносимо al

inc si ; інкремент si

inc di ; інкремент di

jmp pov

vux:

mov n_si,si ; збереження si

mov n_di,di ; збереження di

mov bx,0 ; обнулення bx

; знаходження подібного елемента

mov cx,mak_buf2 ; кількість циклів

loop7: push cx ; збереження CX у стеці

mov al,buf2+bx ; в al заносимо елемент буфера

cmp slovo,al ; порівняння першого елемента буфера slovo з al

jne ne_ri ; перехід, якщо не рівне

mov si,offset buf2 ; адрес buf2

mov cx,bx ; кількість циклів

loop8: push cx ; збереження CX у стеці

inc si ; інкремент si

pop cx ; взяття із стеку cx

loop loop8 ; команда циклу із cx кроків

mov di,offset slovo ; адрес clovo

cld ; встановлення прапорця DF

mov cx,n_di ; кількість циклів

repe cmpsb ; стрічкова команда порівняння

jne no ; перехід, якщо не рівно

mov si,bx ; занесення в si значення bx

mov cx,n_di ; кількість циклів

loop9: push cx ; збереження CX у стеці

mov buf2k+si,01110010b ; занесення кольору

inc si ; інкремент si

pop cx ; взяття із стеку cx

loop loop9 ; команда циклу із cx кроків

no:

ne_ri:

inc bx ; інкремент si

pop cx ; взяття із стеку cx

loop loop7 ; команда циклу із cx кроків

mov si,n_si ; присвоєння значення n_si

inc si ; інкремент si

inc si ; інкремент si

cmp si,mak_buf1

jae wap ; перехід, якщо більше або рівне

dec si ; декремент si

mov di,0 ; обнулення di

jmp pov ; перехід на pov

wap:

; ПОРІВНЯННЯ BUF2 З BUF1

mov si,0 ; обнулення si

mov di,0 ; обнулення di

pov1: ; занесення слова в буфер slovo

mov al,buf2+si ; в al заносимо si-товий елемент масива buf1

cmp al,' ' ; якщо al рівне пробілу перехід на мітку vux

je vux1 ; перехідб якщо рівне

mov slovo+di,al ; в di-товий елемент масива slovo заносимо al

inc si ; інкремент si

inc di ; інкремент di

jmp pov1 ; перехід на pov1

vux1:

mov n_si,si ; збереження si

mov n_di,di ; збереження di

mov bx,0 ; обнулення bx

mov cx,mak_buf1 ; знаходження подібного елемента

loop11: push cx ; збереження CX у стеці

mov al,buf1+bx ; в al заносимо елемент буфера

cmp slovo,al ; порівняння першого елемента буфера slovo з al

jne ne_ri1 ; перехід, якщо не рівне

mov si,offset buf1 ; адрес buf2

mov cx,bx ; кількість циклів

loop12: push cx ; збереження CX у стеці

inc si ; інкремент si

pop cx ; взяття із стеку cx

loop loop12 ; команда циклу із cx кроків

mov di,offset slovo ; адрес clovo

cld ; встановлення прапорця DF

mov cx,n_di ; кількість циклів

repe cmpsb ; стрічкова команда порівняння

jne no1 ; перехід, якщо не рівно

mov si,bx ; занесення в si значення bx

mov cx,n_di ; кількість циклів

loop13: push cx ; збереження CX у стеці

mov buf1k+si,01110010b ; занесення кольору

inc si ; інкремент si

pop cx ; взяття із стеку cx

loop loop13 ; команда циклу із cx кроків

no1:

ne_ri1:

inc bx ; інкремент bx

pop cx ; взяття із стеку cx

loop loop11 ; команда циклу із cx кроків

mov si,n_si ; занесення в si значення n_si

inc si ; інкремент si

inc si ; інкремент si

cmp si,mak_buf2

jae p1 ; перехід, якщо більше або рівне

dec si ; декремент si

mov di,0 ; обнулення di

jmp pov1 ; перехід на pov1

p1:

jmp wux ; перехід на wux

no_F5:

cmp al,40h ; порівняння з клавішею "F6"

jne no_F6 ; перехід, якщо не рівне

; ПОРІВНЯННЯ ПО ЕЛЕМЕНТУ

F6:

fon 0,0,79,0,01110001b ; виклик макросу

fon 24,0,50,0,01100001b ; виклик макросу

koordun 0,0 ; виклик макросу

DOS_09h msg11 ; виклик макросу

bufk_01110101

mov si,0 ; обнулення si

mov cx,6250 ; кількість циклів

vuvid: mov al,[buf1+si] ; в al заносимо елемент буфера

mov bl,[buf2+si] ; в bl заносимо елемент буфера

cmp al,bl ; опрівняння al з bl

jne ne_rivhi ; перехід, якщо не рівні

mov [buf1k+si],01110010b ; занесення кольору

mov [buf2k+si],01110010b ; занесення кольору

ne_rivhi:

inc si ; інкремент si

loop vuvid ; команда циклу із cx кроків

jmp wux ; перехід на wuv

no_F6:

jmp pov4 ; перехід на pov4

wux:

; Виведення на екран першої сторіеки 1 вікна

mov y1,3

mov x1,4

mov y2,14

mov x2,4

mov si,0 ; обнулення si

mov cx,675 ; кількість циклів

loop1: push cx ; збереження CX у стеці

koordun x1,y1 ; виклик макросу

BIOS_09h buf1vel+si,buf1k+si ; виклик макросу

cmp x1,78 ; порівняння з 78

jne x1_78 ; перехід, якщо не рівно

mov x1,3 ; присвоєння 3

inc y1 ; інкремент y1

x1_78:

inc x1 ; інкремент x1

inc si ; інкремент si

pop cx ; взяття із стеку cx

loop loop1 ; команда циклу із cx кроків

; виведення номера сторінки у верхнє вікно

mov n,30h ; присвоєння 30h

koordun 2,11 ; присвоєння 30h

BIOS_09h n,01110001b ; виклик макросу

; Виведення на екран першої сторіеки 2 вікна

mov di,0 ; обнулення si

mov cx,675 ; кількість циклів

loop2: push cx ; збереження CX у стеці

koordun x2,y2 ; виклик макросу

BIOS_09h buf2vel+di,buf2k+di ; виклик макросу

cmp x2,78 ; порівняння з 78

jne x2_78 ; перехід, якщо не рівно

mov x2,3 ; присвоєння 3

inc y2 ; інкремент y2

x2_78:

inc x2 ; інкремент x2

inc di ; інкремент di

pop cx ; взяття із стеку cx

loop loop2 ; команда циклу із cx кроків

; виведення номера сторінки у нижнє вікно

mov m,30h ; присвоєння 30h

koordun 2,22 ; виклик макросу

BIOS_09h m,01110001b ; виклик макросу

; ПРОКРУТКА ВІКОН

mov di,675 ; di присвоїти 675

mov si,675 ; di присвоїти 675

win1:

push si ; збереження si у стеці

; виведення повідомлення у верхньому вікні

mov y1,3

mov x1,2

storinka x1,y1,10011101b ; виклик макросу

; виведення повідомлення у нижнє вікні

mov y1,14

mov x1,2

storinka x1,y1,01111101b ; виклик макросу

pop si ; взяття із стеку si

mov ah,10h ; функція читання символа з клавіатури з очікуванням

int 16h ; виклик BIOS

cmp ah,3fh ; нажата клавіша "F5"

jne no1_F5

jmp F5

no1_F5:

cmp ah,40h ; нажата клавіша "F6"

jne no1_F6

jmp F6

no1_F6:

cmp ah,42h ; нажата клавіша "F8"

jne no1_F8

cmp H,1

je H1_1

mov H,1

jmp F8

H1_1:

mov H,0

jmp F8

no1_F8:

; ПРОКРУТКА ДЛЯ ВЕРХНЬОГО ВІКНА

cmp ax,50e0h ; нажата клавіша "вниз"

jne F1 ; перехід, якщо не рівно

; прокрутка вершнього вікна вниз

cmp si,mak_buf1 ; порівнянн si з mak_buf1

jb n_win1

jmp win1

n_win1: ; перхід, якщо більше або рівне

cmp si,0 ; порівняння si з 0

jne no_nen ; перехід, якщо не рівне

mov si,675 ; si присвоїти 675

no_nen:

mov y1,3

mov x1,4

mov cx,675 ; кількість циклів

loop3: push cx ; збереження CX у стеці

koordun x1,y1 ; виклик макросу

BIOS_09h buf1vel+si,buf1k+si ; виклик макросу

cmp x1,78 ; порівняння з 78

jne x1_78dr ; перехід, якщо не рівне

mov x1,3 ; присвоєння 3

inc y1 ; інкремент y1

x1_78dr:

inc x1 ; інкремент x1

inc si ; інкремент si

pop cx ; взяття із стеку cx

loop loop3 ; команда циклу із cx кроків

inc n ; виведення номера сторінки

koordun 2,11 ; виклик макросу

BIOS_09h n,01110001b ; виклик макросу

F1:

cmp ax,48e0h ; нажата клавіша "вверх"

jne F2 ; перехід, якщо не рівне

; прокрутка вершнього вікна вгору

sub si,1350 ; від si відняти 1350

cmp si,0 ; порівняння з 0

jnl no_vid ; перехід, якщо менше

mov si,0 ; обнулення si

jmp win1 ; перехід на win1

no_vid:

mov y1,3

mov x1,4

mov cx,675 ; кількість циклів


Подобные документы

  • Порядок проектування програми для перегляду текстових файлів різного розміру, сфера її практичного застосування та алгоритм написання. Опис і обґрунтування проектних рішень системи. Інструкція користувача та текст програми, проведення її листингу.

    курсовая работа [20,7 K], добавлен 08.08.2009

  • Прості та умовні оператори мови С++. Робота з двовимірними масивами. Пошук та сортування даних. Робота з файлами та з динамічними структурами даних. Опис мови програмування Delphi. Складення програми до розроблених алгоритмів. Організація циклів.

    отчет по практике [4,3 M], добавлен 28.08.2014

  • Програма на мові програмування С++. Аналіз стану технологій програмування та обґрунтування теми. Розробка програми виконання завдання, методу вирішення задачі. Робота з файлами, обробка числової інформації і робота з графікою. Розробка програми меню.

    курсовая работа [41,0 K], добавлен 17.02.2009

  • Ведення протоколу роботи комп’ютера. Розробка програми для створення списку розширень файлів і занесення часу і дати доступу до них на мові програмування Асемблер. Виклик переривання 21h код-функції та занесення до регістрів. Алгоритм та лістинг програми.

    курсовая работа [14,1 K], добавлен 08.08.2009

  • Створення програми для перегляду потрібної інформації, яка може бути використана будь яким користувачем ЕОМ. Користування та розуміння переглядачів текстових файлів. Використання читання тексту порціями для реалізації прокрутки екрану вверх та вниз.

    курсовая работа [16,7 K], добавлен 12.08.2009

  • Ключові поняття мови об’єктно-орієнтованого програмування C++: інкапсуляція, наслідування, абстракція, поліморфізм. Об’ява класів у мові С++. Графічні засоби. Пошук відстані між точками. Опис класів і об’єктів. Програма графічної задачі. Лістинги файлів.

    курсовая работа [144,3 K], добавлен 14.03.2013

  • Створення двух файлів В1 і В2 з шести двоцифрових цифр з введенням в довільному порядку цифр з клавіатури із записуванням парних цифр в файл В3, а непарних - у файл В4. Процес розробки програми за допомогою мови "Асемблер". Блок-схема алгоритму задачі.

    курсовая работа [37,6 K], добавлен 26.11.2011

  • Розробка програми на мові програмування С++ з використанням об'єктно-орієнтованого програмування. Робота з файлами, графікою, класами, обробка числової інформації. Графічні засоби мови програмування. Алгоритм задачі та допоміжні програмні засоби.

    курсовая работа [102,5 K], добавлен 14.03.2013

  • Модель аналізу-синтезу компіляції. Формальний опис вхідної мови програмування. Вибір технології програмування, проектування таблиць транслятора та вибір структур даних. Опис програми реалізації лексичного аналізатора. Розробка дерев граматичного розбору.

    курсовая работа [75,8 K], добавлен 26.12.2009

  • Визначення сили взаємодії двох точкових зарядів. С++ як універсальна мова програмування. Клас - ключове поняття С++. Стандартні бібліотеки С++. Функція конструктора і деструктора. Опис базового класу Objcalc. Лістинг та результат роботи програми.

    курсовая работа [107,6 K], добавлен 27.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.