Смекни!
smekni.com

Низькорівневе програмування контроллера клавіатури (стр. 2 из 4)

Злом програм. «Оригінал» ПО, копії якого продаються незаконно, якщо в нім використовувалися технічні засоби захисту авторських прав, ймовірно, був зламаний за допомогою відладчика і знань мови асемблера. Це дозволяє за допомогою відладчика або дизасемблера знайти усередині коду програми функцію, відповідальну за введення коду активації або припинення роботи демонстраційної версії програми. Зломщик може змінити початковий код програми за допомогою спеціального редактора, або створити генератор ключа. Перший спосіб простіший для кінцевого користувача. Другою менш караний (УК РФ, ст. 272: до 2 років).

Створення вірусів і інших шкідливих програм (УК РФ, ст. 273: до 3 років, при тяжких наслідках до 7 років).

2. Види асемблерів

Асемблери для DOS. Найбільш відомими асемблерами для операційної системи DOS були Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM), і Watcom Assembler (WASM). Також свого часу був популярний простою асемблер A86.

Microsoft Windows. При появі операційної системи Microsoft Windows з'явилося розширення TASM, іменоване TASM32, що дозволило створювати програми для виконання в середі Windows. Остання відома версія TASM - 5.3, що підтримує інструкції MMX, на даний момент включена в Turbo C++ Explorer. Але офіційний розвиток програми повністю зупинено.

Microsoft підтримує свій продукт під назвою Microsoft Macro Assembler. Вона продовжує розвиватися і до цього дня, останні версії включені в набори DDK. Але версія програми, направлена на створення програм для DOS, не розвивається. Крім того, Стівен Хатчессон створив пакет для програмування на MASM під назвою «MASM32».

GNU і GNU/Linux. Сюди перенаправляється запит «GNU Assembler». На цю тему потрібна окрема стаття.

Сюди перенаправляється запит «gas». На цю тему потрібна окрема стаття.

До складу операційної системи GNU входить пакет binutils, асемблер gas (GNU Assembler), що включає, використовуючий AT&T-синтаксис, на відміну від більшості інших популярних асемблерів, які використовують Intel-синтаксис.

Переносимі асемблери. Також існує відкритий проект асемблера, версії якого доступні під різні операційні системи і який дозволяє отримувати об'єктні файли для цих систем. Називається цей асемблер NASM (Netwide Assembler).

Yasm - це переписана з нуля версія NASM під ліцензією BSD (з деякими виключеннями).

flat assembler (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.