Реферат по предмету "Информатика, программирование"


Низькорівневе програмування контроллера клавіатури

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

 
1.Огляд низькорівневих команд
Низькорівневамова програмування (мова програмування низького рівня) — мова програмування,близький до програмуванню безпосередньо в машинних кодах використовуваногореального або віртуального (наприклад, Java, Microsoft .NET) процесора. Дляпозначення машинних команд зазвичай застосовується мнемонічне позначення. Цедозволяє запам'ятовувати команди не у вигляді послідовності двійкових нулів іодиниць, а у вигляді осмислених скорочень слів людської мови (зазвичайанглійських).
Інколиодне мнемонічне позначення відповідає цілій групі машинних команд, що виконуютьоднакову дію над різними елементами пам'яті процесора. Окрім машинних командмови програмування низького рівня можуть надавати додаткові можливості, такі якмакровизначення (макроси). За допомогою директив є можливість управлятипроцесом трансляції машинних кодів, надаючи можливість заносити константи ілітеральні рядки, резервувати пам'ять під змінні і розміщувати виконуваний кодпо певних адресах. Часто ці мови дозволяють працювати замість конкретнихелементів пам'яті із змінними.
Якправило, використовує особливості конкретного сімейства процесорів.Загальновідомий приклад низкоуровнего мови — мова асемблера, хоча правильнішеговорити про групу мов асемблера. Більш того! Для одного і того ж процесораіснує декілька видів мови асемблера! Вони збігаються в машинних командах, алерозрізняються набором додаткових функцій (директив і макросів).
Такождо мов низького рівня умовно можна зарахувати MSIL, вживаний в платформіMicrosoft .NET, Форт, Java байт-код.
Спочатку,програмісти безвариантно писали на мові асемблера. Експерименти з підтримкоюустаткування в мовах високого рівня (1960s привели до появи таких, як BLISS іBCPL. Проте, мова програмування Сі, що зіграла значну роль в створенні UNIX,завоювала велику популярність і розповсюдилася повсюдно до 1980-м роках.
Вданий час (2006) деяке застосування знайшлося для вбудовуваного C++. Реалізаціяосновних часток в операційній системі і при використанні мереж потребуєрозробників системного ПО. Наприклад, реалізація постраничности (черезвіртуальну пам'ять) або драйвери пристроїв.
ТермінСистемне програмування безпосередньо пов'язаний з терміном Системнийпрограміст. Це програміст, що працює (що створює, відладжує, діагностує і т.п.) над системним програмним забезпеченням.
Моваасемблера (автокод) — мова програмування низького рівня. На відміну від мовимашинних кодів, дозволяє використовувати зручніші для людини мнемонічні (символьні)позначення команд. При цьому для перекладу з мови асемблера в машинний код, щорозуміється процесором, потрібна спеціальна програма, звана асемблером.
Командимови асемблера один до одного відповідають командам процесора, фактично, вони єзручнішою для людини символьною формою запису (мнемокод) команд і їхаргументів.
Крімтого, мову асемблера забезпечує використання символічних міток замість адреселементів пам'яті, які при асемблюванні замінюються на абсолютні або відносніадреси, що автоматично розраховуються, а також так званих директив (команд, щоне переводяться в процесорні інструкції, а виконуваних самим асемблером).
Директивиасемблера дозволяють, зокрема, включати блоки даних, задати асемблюванняфрагмента програми по умові, задати значення влучний, використовуватимакровизначення з параметрами.
Кожнамодель (або сімейство) процесорів має свій набір команд і відповідну йому мовуасемблера. Найбільш популярні синтаксиси: Intel-синтаксис і AT&T-синтаксис.
Існуютькомп'ютери, що реалізовують як машинного мову програмування високого рівня,фактично в них він є «асемблером».
Майстернийпрограміст, як правило, здатний написати ефективнішу програму на асемблері, ніжті, що генеруються трансляторами з мов програмування високого рівня, тобто дляпрограм на асемблері характерне використання меншої кількості команд і зверненьв пам'ять, що дозволяє збільшити швидкість і зменшити розмір програми.
Забезпеченнямаксимального використання специфічних можливостей конкретної платформи, щотакож дозволяє створювати ефективніші програми з меншими витратами ресурсів.
Припрограмуванні на асемблері можливий безпосередній доступ до апаратури, у томучислі портів ввода-вывода, регістрів процесора, і ін.
Моваасемблера застосовується для створення драйверів устаткування і ядраопераційної системи
Моваасемблера використовується для створення «прошивок» BIOS.
Задопомогою мови асемблера створюються компілятори і інтерпретатори мов високогорівня, а також реалізується сумісність платформ.
Існуєможливість дослідження інших програм з відсутнім початковим кодом за допомогоюдизасемблера.
Алеє в цієї програми і недоліки. Головна перевага асемблера практично повністюнівелюється хорошою оптимізацією в сучасних компіляторах мов високого рівня.
Черезсвою машинну орієнтацію («низького» рівня) людині в порівнянні з мовамипрограмування високого рівня складніше читати і розуміти програму, вонаскладається з дуже «дрібних» елементів — машинних команд, відповідноускладнюються програмування і відладка, росте трудомісткість, велика вірогідністьвнесення помилок. В значній мірі зростає складність спільної розробки.
Якправило, менша кількість доступних бібліотек в порівнянні з сучаснимиіндустріальними мовами програмування.
Відсутняпереносимість програм на комп'ютери з іншою архітектурою і системою команд(окрім двійково-сумісних).
Історичноможна розглядувати асемблер як друге покоління мов програмування ЕОМ (якщопершим рахувати машинний код). Недоліки асемблера, складність розробки на німвеликих програмних комплексів привели до появи мов третього покоління — мовпрограмування високого рівня (Фортран, Лісп, Кобол, Паскаль, Сі і ін.). Самемови програмування високого рівня і їх спадкоємці в основному використовуютьсяв даний час в індустрії інформаційних технологій. Проте, мови асемблеразберігають свою нішу, обуславливаемую їх унікальними перевагами в частціефективності і можливості повного використання специфічних засобів конкретноїплатформи.
Наасемблері пишуться програми або фрагменти програм, для яких критично важливі:
— швидкодія (драйвери, ігри);
— об'єм використовуваної пам'яті (завантажувальні сектори, вбудовуване (англ.embedded) програмне забезпечення, програми для мікроконтролерів і процесорів зобмеженими ресурсами, віруси, програмні захисту).
Звикористанням програмування на асемблері проводяться:
— оптимізація критичних до швидкості ділянок програм написаних на мові високогорівня, такому як C++. Це особливо актуально для ігрових приставок, біля якихфіксована продуктивність, і для мультимедійних кодеків, які прагнуть робитименш ресурсоємними і популярнішими;
— створення операційних систем (ОС). ОС часто пишуть на Сі, мові, яка спеціальнобула створена для написання однієї з перших версій Unix. Апаратні залежніділянки коду, такі, як завантажувач ОС, рівень абстрагування від апаратногозабезпечення — HAL і ядро, часто пишуться на асемблері. Асемблерний коду вядрах Windows або Linux зовсім небагато, оскільки автори прагнуть допереносимості і надійність, але проте він присутній. Деякі любительські ОС,такі, як MENUETOS, цілком написані на асемблері. При цьому MENUETOS поміщаєтьсяна дискету і містить графічний багатовіконний інтерфейс;
— програмування мікроконтролерів (МК) і інших вбудовуваних процесорів. На думкупрофесора Танненбаума, розвиток МК повторює історичний розвиток комп'ютерівновітнього часу. На сьогоднішній день для програмування МК вельми частозастосовують ассемблер;
— створення драйверів. Деякі ділянки драйверів, що взаємодіють з апаратнимзабезпеченням, програмують на асемблері. Хоча в цілому в даний час драйверипрагнуть писати на мовах високого рівня у зв'язку з підвищеними вимогами донадійності. Надійність для драйверів грає особливу роль, оскільки в Windows NTі Linux драйвери працюють в режимі ядра. Одна помилка може привести до крахусистеми;
— створення антивірусів і інших захисних программ;
— написання трансляторів мов програмування.
Програмуванняна мові асемблера характерний також для нелегальних сфер діяльності в ІТ,зокрема, з використанням асемблера проводяться:
Зломпрограм. «Оригінал» ПО, копії якого продаються незаконно, якщо в німвикористовувалися технічні засоби захисту авторських прав, ймовірно, бувзламаний за допомогою відладчика і знань мови асемблера. Це дозволяє задопомогою відладчика або дизасемблера знайти усередині коду програми функцію,відповідальну за введення коду активації або припинення роботи демонстраційноїверсії програми. Зломщик може змінити початковий код програми за допомогоюспеціального редактора, або створити генератор ключа. Перший спосіб простішийдля кінцевого користувача. Другою менш караний (УК РФ, ст. 272: до 2 років).
Створеннявірусів і інших шкідливих програм (УК РФ, ст. 273: до 3 років, при тяжкихнаслідках до 7 років).

 
2.Види асемблерів
 
Асемблеридля DOS. Найбільш відомими асемблерами дляопераційної системи DOS були Borland Turbo Assembler (TASM), Microsoft MacroAssembler (MASM), і Watcom Assembler (WASM). Також свого часу був популярнийпростою асемблер A86.
MicrosoftWindows. При появі операційної системи MicrosoftWindows з'явилося розширення TASM, іменоване TASM32, що дозволило створюватипрограми для виконання в середі Windows. Остання відома версія TASM — 5.3, щопідтримує інструкції MMX, на даний момент включена в Turbo C++ Explorer. Алеофіційний розвиток програми повністю зупинено.
Microsoftпідтримує свій продукт під назвою Microsoft Macro Assembler. Вона продовжуєрозвиватися і до цього дня, останні версії включені в набори DDK. Але версіяпрограми, направлена на створення програм для DOS, не розвивається. Крім того,Стівен Хатчессон створив пакет для програмування на MASM під назвою «MASM32».
GNUі GNU/Linux. Сюди перенаправляється запит «GNUAssembler». На цю тему потрібна окрема стаття.
Сюдиперенаправляється запит «gas». На цю тему потрібна окрема стаття.
Доскладу операційної системи GNU входить пакет binutils, асемблер gas (GNUAssembler), що включає, використовуючий AT&T-синтаксис, на відміну відбільшості інших популярних асемблерів, які використовують Intel-синтаксис.
Переносиміасемблери. Також існує відкритий проект асемблера,версії якого доступні під різні операційні системи і який дозволяє отримуватиоб'єктні файли для цих систем. Називається цей асемблер NASM (NetwideAssembler).
Yasm- це переписана з нуля версія NASM під ліцензією BSD (з деякими виключеннями).
flatassembler (fasm) — молодий асемблер під модифікованою для заборониперелицензирования (включаючи під GNU GPL) BSD-лицензией. Є версії дляKOLIBRIOS, GNU/Linux, DOS і Microsoft Windows, використовує Intel-синтаксис іпідтримує інструкції AMD64.
8051 — класична архітектура мікроконтролера. Для неї існує крос-асемблер ASM51,випущений корпорацією MetaLink. крім того багато фірм, розробники програмногозабезпечення, такі як IAR або keil, представили свої варіанти асемблерів. Уряді випадків застосування цих асемблерів виявляється ефективнішим завдякизручному набору директив і наявності середи програмування, об'єднуючу в собіпрофесійний асемблер мова програмування СІ, відладчик і менеджер програмнихпроектів.

 
3.Програмування порту клавіатури на асемблері
 
3.1Принцип роботи контроллера клавіатури і його інтерфейс з BIOS
Контроллерклавіатури працює таким чином: при натисненні або відпуску будь-якої клавішігенерується байт (так званий скан-код), перші 7 бітів якого містять порядковийномер клавіші, а останній, сьомий біт, скинутий, якщо клавіша натискувала, івстановлений, якщо відпущена. Цей скан-код можна прочитати через порт 60h(насправді усередині контроллера клавіатури є якась черга скан-кодов, а порт60h лише відображує верхній код, але про це можна і не знати). І ще. Як тількиклавіша натискується або відпускається, викликається 9-е переривання (IRQ 1).
Алене завжди натиснення або відпуск клавіші генерує один скан-код. Наприклад,натиснення клавіші Pause викликає генерацію відразу 5-и кодів. Натиснення білоїстрілки вгору викликає скан-код 72, а чорної стрілки вгору — відразу 2 коди:224 і 72. І для кожного з цих скан-кодов викликається 9-е переривання.
Такимчином, процедура обробки клавіатури BIOS, що «сидить» на 9-мперериванні, просто аналізує значення 60h-го порту і відповідним чиноммодифікує буфер введення. Всі процедури BIOS далі працюють не з поточномузначенням порту, а з буфером введення, що дозволяє здійснювати введення звипередженням, тобто навіть тоді, коли система зайнята.
3.2Програмні переривання і підпрограми обробки переривань
Операційнасистема MS-DOS надає програмістові, що працює на мові асемблера, великий набірпідпрограм, що виконують різні корисні дії. Всі ці підпрограми оформлені якпідпрограми обробки переривань, і для кожної підпрограми в керівництві поMS-DOS вказаний номер відповідного нею переривання. Розрізняють апаратні іпрограмні переривання. Програма обробки апаратного переривання викликається,якщо процесор отримує сигнал запиту переривання від одного з системнихпристроїв. Ця підпрограма повинна містити, окрім власне команд, призначених длявиконання деяких дій з обробки переривання, визначених програмістом, спеціальнікоманди, керівники контроллерами переривань. У зв'язку з цим,подпрограммы-обработчики апаратних переривань рідко безпосередньовикористовуються програмістами. Підпрограма обробки програмного перериваннявикликається по команді INT n процесора (n — номер переривання в системнійтаблиці векторів переривань). Скорочено прийнято самі підпрограми обробкипереривань називати «перериваннями», хоча це не правильно. У ПЕВМ IBMРС AT всі програмні переривання підрозділяються на переривання BIOS (підсистеми управління вводом/выводом ), переривання ОС і перериваннякористувача. Підпрограми обробки переривань BIOS зазвичай знаходяться в ПЗП,вони поставляються розробниками апаратури для забезпечення єдиного інтерфейсуОС з різними типами устаткування. Основу системи переривань ОС MS DOS складаєпереривання з номером 21h, зване перериванням MS DOS. Це переривання забезпечуєAPI прикладних програм (Application Programm Interface — інтерфейс прикладнихпрограм) в середі ОС MS DOS. Залежно від значення, що міститься при викликупереривання в регістрі AH, MS-DOS виконує при цьому один з декількох десятківпідпрограм, які прийнято називати функціями DOS. Для кожного переривання ікожної функції DOS в керівництві описаний набір вхідних і вихідних параметрів,що передаються через регістри, а також перелік можливих помилок.
Уданій роботі будуть описані переривання і функції DOS і BIOS, що відносяться дороботи з клавіатурою і екраном ПЕВМ IBM РС AT.

 
3.3Програмування клавіатури
Уклавіатурі IBM РС AT є мікропроцесор, який постійно сканує її в пошуку клавіш,що натискують. Процесор клавіатури пов'язаний з контроллером клавіатури. Відконтроллера на клавіатуру поступають команди управління клавіатурою, а зклавіатури коди підтвердження і коди сканування .
Завинятком клавіші «PAUSE» всі останні клавіші 101- клавішноїклавіатури працюють на нажатие/отжатие.При натисненні генерується коднатиснення, при утриманні клавіші він повторюється через певні інтервали часу,а при відпуску генерується код віджимання. Код натиснення і код віджиманняразом називаються кодами сканування клавіатури (scan-коды). Код віджимання єдвобайтовим: перший байт рівний F0h, а другий байт збігається з кодомнатиснення.
Єтри рівні програмування підсистеми клавіатури:
1)на фізичному рівні (програмування портів 60h і 64h контроллера клавіатури);
2)за допомогою BIOS ( INT 09h, INT 16h );
3)за допомогою переривання DOS ( INT 21h ).
Длявиконання введення даних з клавіатури програмістові в більшості випадків доситьвикористовувати описані нижче функції DOS. У складніших випадкахвикористовується переривання BIOS INT 16h, що дає деякі додаткові можливості. Максимумможливостей програміст може отримати, перехоплюючи апаратне переривання відклавіатури 09h і працюючи безпосередньо з портами ввода/вывода.
3.3.1Використання BIOS для роботи з клавіатурою
ПерериванняINT 09h є апаратним перериванням, яке викликається по лінії запиту перериванняIRQ1 всякий раз коли заповнюється вихідний буфер контроллера клавіатури, тобтоколи поступає байт від клавіатури. Обробник даного переривання прочитуєscan-код з порту 60h, перетворить scan-код в код доступний BIOS або виконуєспеціальну функцію (виклик деяких інших переривань, наприклад INT 05h післянатиснення Prt Scr і ін.). Обробник переривання поміщає для більшості клавішвідповідний їм в BIOS двобайтовий код в спеціальну область пам'яті — буферклавіатури (див. табл.2). Коди деяких клавіш обробник не поміщає в буфер,інформація про їх натиснення або віджимання записується в байти стануклавіатурРозгледимо докладніше спосіб формування двобайтового коду, INT, щопоміщається, 09h в буфер клавіатури. Scan-код, що отримується обробникомпереривання з клавіатури, відповідає деякій клавіші або комбінації клавіш. BIOSвикористовує для кодування інформації стандарт кодування ASCII, вживаний длявсіх пристроїв, що використовують посимвольний обмін. Таблиця 3 містить коди ASCII.Разом із звичайними символами, застосовуються символи, що управляють(наприклад, CR — повернення каретки, LF — перехід на наступний рядок і т. п.). КожномуASCII-коду BIOS ставить у відповідність деякий scan-код, що приймається зклавіатури. Якщо натискує клавіша або комбінація клавіш, якою відповідаєASCII-код, обробник переривання INT 09h поміщає в буфер scan-код клавіші івідповідний ASCII-код. Проте, навіть для 83-клавішної клавіатури IBM РС XT, єзначна кількість комбінацій клавіш (і відповідно scan-кодов), що не маютьвідповідних еквівалентів ASCII. До них відносяться клавіші управління курсором,функціональні клавіші і ін. Для подібних клавіш в буфер поміщається спеціальнийбайт розширеного коду, а другий байт дорівнює нулю. Таблиця 4 містить міститьрозширені коди деяких клавіш. Більшість нових клавіш і їх комбінацій для101-клавішної клавіатури (F11,F12 і ін.) кодуються аналогічним чином: для нихвикористовуються незадіяні раніше розширені коди. Проте, для лави клавіш(«сірі» клавіші управління курсором, Delete, End і ін.),продубльованих на 101-клавішній клавіатурі, і їх комбінацій з іншими клавішами,використовується розширений код їх «оригіналів», а другий байт длятаких кодів рівний E0h.
Принатисненні комбінації клавіш Ctrl-Break переривання INT 09h встановлює ознаказапиту по Ctrl-Break (байт 471h) і викликає переривання BIOS INT 1Bh, якезазвичай перехоплюється MS DOS. Це переривання устанавлиает прапор CTRL-C,після чого управління передається INT 23h, яке перевіряє цей прапор, і в разі йогоустановки викликає дострокове припинення виконання програми. Деякі функції MSDOS перевіряють натиснення CTRL-C і викликають INT 23h. Таким чином, Ctrl-Breakє прапором BIOS, а CTRL-C — прапором MS DOS. Ці прапори перевіряються привиконанні функцій 01h-0Ch переривання MS DOS. Функція 33h переривання MS DOSдозволяє розповсюдити контроль по Ctrl-Break на всі функції ввода/вывода.
ПерериванняBIOS INT 16h дозволяє працювати з клавіатурою на декілька вищому рівні, ніж INT09h, і нижчому рівні, ніж функції MS DOS. Фактично всі описані нижче функціїDOS використовують в своїй роботі переривання 16h, проте програміст можевикористовувати його і безпосередньо, якщо в цьому є необхідність.
Залежновід значення в регістрі AH переривання INT 16h може виконати одну з наступнихфункцій.
Функція00h виконує читання символу з буфера клавіатури. Якщо буфер порожній, функціячекає натиснення клавіші. Якщо клавіша натискує, значення коду заноситься врегістр AX. Функція повертає в Аl ASCII-код, а в AH — scan-код якщо це можливо.Інакше в AH повертається розширений код, а AL дорівнює нулю. Функція необробляє натиснення клавіш, код яких не поміщається в буфер перериванням INT09h (Ctrl, Shift і тому подібне), а також додаткових клавіш 101-клавішноїклавіатури.
Функція01h перевіряє, чи є символи в буфері клавіатури. Якщо є, то прапор нуляскидається ( ZF=0 ), якщо немає
— прапор встановлюється ( ZF=1 ). За наявності символу його код заноситься врегістр AX, в тому ж вигляді, як для функції 00h, проте з буфера код не віддаляється.Таким чином, якщо після цього ще раз викликати ту ж функцію, то вона ще разпрочитає той же символ.
Функція02h записує в регістр AL перший з чотирьох байтів стану клавіатури.
Функції10h і 11h аналогічні функціям 00h і 01h, але дозволяють обробляти також ідодаткові клавіші 101-клавішної клавіатури.
Функція12h виконує дії, аналогічні 02h, але крім того поміщає в AH другий байт стануклавіатури (див. табл.1).
Функція03h дозволяє встановити затримку і частоту повторення для клавіатури, а функція05h — помістити двобайтовий код в буфер клавіатури.
 
3.3.2Функції DOS для роботи з клавіатурою
Функція01h ( тобто переривання 21h при значенні AH=01h ) виконує введення з клавіатуриз очікуванням натиснення клавіші, якщо буфер клавіатури порожній. Код введеногосимволу поміщається в регістр AL. Введений символ відображується на екрані (эхо-отображение).
Функція01h перевіряє також, чи не натискував користувач в ході роботи програмикомбінацію клавіш Ctrl/C ( або Ctrl/Break ). В цьому випадку управління передаєтьсяна підпрограму обробки Ctrl/C, яка зазвичай припиняє виконання програмикористувача.
Якщона клавіатурі натискувала одна з клавіш, яким не відповідає ніякий код ASCII,то функція 01h повертає в регістрі AL значення 0. У цих випадках слід ще развикликати ту ж функцію, тоді буде виданий розширений код даної клавіші абокомбінації клавіш.
Функція08h працює аналогічно 01h, за винятком того, що не виконується эхо-отображениевведеного символу.
Функція07h працює аналогічно 01h, за винятком того, що не виконується эхо-отображениеі не перевіряється натиснення Ctrl/C.
Функція06h може виконувати як введення з клавіатури, так і вивід на екран. Якщо умомент виклику регістр DL містить значення 0ffh, то дана функція виконуєвведення без очікування. Якщо буфер не порожній, то прапор нуля ZF скидається в0, а код символу з буфера заноситься в AL. Якщо ж буфер порожній, товстановлюється ZF=1, при цьому значення в AL не грає ролі. Таким чином, цяфункція не чекає, поки натискуватиме клавіша, а відразу видає якийсь результат.Функція 06h не виконує эхо-отображения і не перевіряє натиснення Ctrl/C.
Функція0Вh не виконує введення символу, а тільки перевіряє, чи є символи в буфері.Якщо є, то встановлюється AL=0ffh, якщо немає, то AL=00h. Виконується такожперевірка на Ctrl/C.
Функція0Аh виконує введення рядка, що буферизує, з клавіатури. При цьому символивводяться один за іншим, як при багатократному застосуванні функції 01h, до тихпір, поки не буде введений код 0dh ( код клавіші «Enter» ), щозавершує рядок. В ході введення рядка користувач може редагувати рядок, ізокрема — використовувати «забій». При введенні виконується такожперевірка на Ctrl/C.
Привиклику функції 0Аh потрібний, щоб в регістрі DX містив зсув ( у сегменті даних) області пам'яті ( буфера ), в яку система помістить введений рядок. У першомубайті цього буфера має бути записана його довжина, тобто максимальне числосимволів ( включаючи 0dh ), яке можна записати в буфер. Ця довжина має бутипринаймні на 2 менше, ніж число зарезервованих байт. Після закінчення введеннярядка функція поміщає в другий байт буфера дійсне число введених символів ( нерахуючи 0dh ), а зачинаючи з третього байта буфера розміщуються введенісимволи. Останнім завжди буде код 0dh.
Функція0Сh спочатку очищає буфер клавіатури ( тобто «забуває» попереднінатиснення клавіш ), а потім виконує будь-яку з функцій 01h, 06h, 07h, 08h або0Аh. Номер цієї функції задається в регістрі AL.
Розглянемоприклади роботи з клавіатурою. У головній програмі для «відкриття»клавіатури потрібно викликати OpenKeyboard з параметром, який говорить, чипотрібно блокувати обробник BIOS.

voidirq_keyboard(void)
{
charscan,tmp;
/*отримуємо сканкод */
scan= inb(0x60);
/*проводимо його обробку */
...
/********************************/
/*ось ця частка мені не зрозуміла */
/********************************/
/*через порт 0x61 відключають клавіатуру */
tmp= inb(0x61);
outb(tmp|0x80,0x61);
/*потім назад включають */
outb(tmp,0x61);
/********************************/
/*скидання контроллера переривань */
outb(0x20,0x20);
}
Якщовстала необхідність прямої роботи з клавіатурою, застосовується наступнийметод: на 9-е переривання встановлюється «латка», яка насампередобробляє стан порту, а потім, за бажання, передає управління старомуобробникові клавіатури BIOS. Якщо управління BIOS не передається, необхідно незабути команду виведення значениа 20h а порт 20h, щоб вирішити наступніпереривання від клавіатури.
IDEAL
P386
MODELMEDIUM
STACK400
DATASEG
PressCounterDW ?
OldKbdIntOffsetDW ?
OldKbdIntSegmentDW ?
CharInputFlagDB 0
ASCIICodeDB 0
labelRusNorm byte
DB0,0,'1','2','3','4','5','6'
DB'7','8','9','0','-','=',0,0
DB'й','ц','у','к','е','н','г'
DB'ш','щ','з','х','ъ',0,0
DB'ф','ы','в','а','п','р','о'
DB'л','д','ж','э','Ё',0,'\'
DB'я','ч','с','м','и','т','ь'
DB'б','ю','.',0,'*',0,' '
ENDS
CODESEG
PROCKeyboardDriver
movAX, DGROUP
movDS,AX
mov[PressCounter],0
callSetKeyboardInterrupt
@@NextChar:
cmp[CharInputFlag],0
je@@NextChar
mov[CharInputFlag],0
movDL,[ASCIICode]
movAH,2h
int21h
inc[PressCounter]
cmp[PressCounter],80
jb@@NextChar
callRestoreOldKeyboardInterrupt
movAH,4Ch
int21h
ENDPKeyboardDriver
procKeyboardInterrupt far
pusha
pushDS
movAX,DGROUP
movDS,AX
inAL,60h
pushAX
movAL,20h
out20h,AL
popAX
sti
cmpAL,39h
ja@@End
xorBX,BX
movBL,AL
addBX, offset RusNorm
movAL,[BX]
cmpAL,32
jb@@END
mov[ASCIICode],AL
mov[CharInputFlag],1
@@End:pop DS
popa
iret
endpKeyboardInterrupt
PROCSetKeyboardInterrupt NEAR
pusha
pushES
movAX,0
movES,AX
movAX,[ES:9*4]
mov[OldKbdIntOffset],AX
movax,[ES:9*4+2]
mov[OldKbdIntSegment],AX
cli
movAX,offset KeyboardInterrupt
mov[ES:9*4],AX
movAX,CS
mov[ES:9*4+2],AX
sti
popES
popa
ret
ENDPSetKeyboardInterrupt
PROCRestoreOldKeyboardInterrupt NEAR
pusha
pushES
movAX,0
movES,AX
cli
movAX,[OldKbdIntOffset]
mov[ES:9*4],AX
movAX,[OldKbdIntSegment]
mov[ES:9*4+2],AX
sti
popES
popa
ret
ENDPRestoreOldKeyboardInterrupt
ENDS
END
Аось приклад розробки програми на мові С:
void interrupt(*SvInt09)(void)=NULL;
intIsBIOSActive=1;
charKeyPressed[256];
char CurKey;
voidProcessKeyb(void)
{ staticPrevKey=0;
char key,IsGray;
key=inportb(0x60);
if(PrevKey==224)IsGray=0x80; else IsGray=0;
if(key!=224) /*если не признак черной клавиши"… */
{if(key&0x80) /* клавиша отпущена */
KeyPressed[(key&0x7F)|IsGray]=0;
else /* клавишанажата */
KeyPressed[(key&0x7F)|IsGray]=1;
}
if(!(key&0x80))CurKey=key|IsGray;
PrevKey=key;
}
void interruptNewInt09(void)
{ ProcessKeyb();
if(IsBIOSActive)SvInt09(); /* не блокировать BIOS? */
elseoutportb(0x20,0x20); /*… нужно блокировать */
}
voidCloseKeyboard(void); /* предварительное определение */
voidOpenKeyboard(int LockBIOS)
{memset(KeyPressed,0,256); CurKey=0;
SvInt09=getvect(9);
setvect(9,NewInt09);
IsBIOSActive=!LockBIOS;
atexit(CloseKeyboard);
}
voidCloseKeyboard(void)
{ if(!SvInt09)return; /* клавиатура не открыта */
setvect(9,SvInt09);SvInt09=NULL;
}
Безумовно,існують і інші можливості по програмуванню контроллера клавіатури (наприклад,включение/выключение її лампочок). Проте ці можливості використовуються вжедуже рідко.
Назакінчення можна привести одну корисну інформацію про обробника клавіатуриBIOS. Байт пам'яті з адресою 40h:17h містить інформацію про стан спеціальнихклавіш клавіатури:
Бит 7 — INSertактивний
Бит 6 — CapsLockактивний
Бит 5 — NumLockактивний
Бит 4 — ScrollLock активний
Бит 3 — Altнатиснутий
Бит 2 — Ctrlнатиснутий
Бит 1 — LeftShift натиснутий
Бит 0 — RightShift натиснутий

Висновок
Навіщо можезнадобитися низькорівневе програмування клавіатури? Саме, мабуть, головне, цете, що при написанні дуже багатьох програм (в основному, звичайно, ігор)необхідно уміти «уловлювати» одночасне натиснення декількох клавіш(наприклад, одночасне натиснення стрілки вгору і пропуску і т.д). Стандартнізасоби BIOS дозволяють це робити, але тільки не з будь-якими клавішами, а зфункціональними (такими, як Shift, Alt і др). Насправді, у недосвідченогопрограміста може скластися враження, що, наприклад, Shift — клавіша особлива,оскільки вона, нібито, змінює значення останніх, тоді як насправді вона зпогляду контроллера клавіатури абсолютно нічим не відрізняється від всіхостанніх клавіш. Відмінності здійснюються тільки на рівні BIOS.
Інша причинапрямого програмування контроллера клавіатури — це небажання програміставирішувати BIOS обробку клавіш, що натискують, наприклад, з метою блокуванняроботи комбінацій Ctrl+Break або Ctrl+Alt+Del. Відмова від використання буферавведення — теж вимушена необхідність, оскільки деякі версії BIOS при натисненніна клавішу видають дуже короткий звуковий сигнал, який, звичайно, буде поритьвласні звуки програми (наприклад фонову музику).

 
Списоклітератури
 
1. Вострікова З. П.Программірованіє на мові асемблера ЄС ЕОМ. М.: Наука, 1985.
2.Галісєєв Г. В. Ассемблер для Win 32. Самовчитель. — М.: «Діалектика», 2007. — З. 368. — ISBN 978-5-8459-1197-1
3.Зубків С. В. Ассемблер для DOS, Windows і UNIX.
4.Кіп Ірвіна. Мова асемблера для процесорів Intel = Assembly Language forIntel-Based Computers. — М.: «Вільямс», 2005. — З. 912. — ISBN 0-13-091013-9
5.Магда Ю. З. Асемблер. Розробка і оптимізація Windows-приложений. СПб.:БХВ-Петербург, 2003.
6.Нортон П., Соухе Д. Язик асемблера для IBM РС. М.: Комп'ютер, 1992.
7.Владислав Пірогов. Асемблер для Windows. — СПб.: БХВ-Петербург, 2007. — 896 з.- ISBN 978-5-9775-0084-5
8.Владислав Пірогов. Асемблер і дизасемблювання… — СПб.: БХВ-Петербург, 2006. — 464 з. — ISBN 5-94157-677-3
9.Сингер М. Міні-ЕВМ PDP-11: Програмування на мові асемблера і організаціямашини. М.: Мир, 1984.
10.Ськенлон Л. Персональниє ЕОМ IBM РС і XT. Програмування на мові асемблера. М.:Радіо і зв'язок, 1989.
11.Юров Ст, Хорошенко З. Assembler: учбовий курс. — СПб.: «Пітер», 2000. — З. 672.- ISBN 5-314-00047-4
12.Юров Ст І. Assembler: підручник для вузів. / 2-е видавництво СПб.: «Пітер»,2004.
13.Юров Ст І. Assembler. Практикум.: підручник для вузів / 2-е видавництво СПб.:«Пітер», 2004.
14.Юров Ст І. Assembler. Спеціальний довідник. СПб.: «Пітер», 2000.
15.Річард Саймон. Microsoft Windows API Довідник системного програміста.
16.Фрунзе А. Ст Мікроконтролери? Це ж просто! Т. 1.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.