Працювати з клавіатурою з асемблера
Працювати з клавіатурою з асемблера можна використовуючи один із трьох методів: порти, BIOS або DOS. Кожен з цих способів має свої переваги, обмеження та можливості.
Робота з клавіатурою через порти
Через порти можна працювати і в реальному та захищеному режимі роботи процесора. Але для повноцінної роботи з клавіатурою необхідно мати обробник переривання клавіатури (IRQ 1).
Робота з клавіатурою через сервіс BIOS (INT 16H)
У BIOS є стандартний спосіб взаємодії з клавіатурою – переривання 16h. Ця точка входу має кілька функцій:
AH = 01h – визначити наявність символів у буфері
AH = 02h – визначити статус клавіш-модифікаторів (Shift/Control/Alt)
Функція 00 INT 16h
Для читання чергового символу, прийнятого від клавіатури, існує функція 00 переривання 16h. Для її виклику потрібно помістити номер функції (00) у регістр AH і викликати переривання 16h:
; після цього в регістрі al виявиться ASCII-код символу, а в регістрі ah - сканкод.
Якщо символу в черзі не виявилося, то функція чекатиме на символ. Якщо al помістився 0, то в регістр ah міститься розширений сканкод. Ця функція дуже стара. Вона робилася ще перших IBM-PC XT комп'ютерів, коли клавіатурі було 84 клавіші. Не рекомендується використовувати цю функцію для сучасних клавіатур.
Функція 01 INT 16h
Функція з номером 1 використовується для визначення наявності символів у буфері клавіатури. Якщо буфер порожній, то прапор ZF встановлюється в 1. Якщо в буфері є символ, то AH і AL міститься інформація про нього, як і при виклику функції 00. Якщо символ є і функція повернула його код в регістрі AL, він нікуди не подінеться з буфера. Функцію 01h можна порівняти із промацуванням буфераклавіатури. Ще цю операцію називають Peek. Приклад виклику:
; ZF = 1 якщо символу немає
; ZF = 0 якщо символ є
Функція 02 INT 16h
Якщо викликати функцію 02 переривання 16h, то регістрі AL будуть встановлені прапори відповідні стану про shift-клавиш. Приклад використання:
; AL = бітове поле
Опис біт регістра AL після виклику функції 02h:
Робота з клавіатурою через сервіс DOS
DOS надає доступ до клавіатури за допомогою програмного переривання 21h. Хоча насправді доступ забезпечується не до клавіатури, а до стандартного потоку введення-виводу.
beg1:movah,0;Опитування клавіатури та перевірка на вибір мелодії
oriniflag,1; Зведення прапора звуч.
jmpbeg1; Перехід початку циклу
beg5:;Відновлення старого вектора 1Ch і вихід
new_int1c proc far;Новийобробникпереривання1ch
muze:inal,61h; Читання стану системного порту
andal,0FCh; Заборона звучання (біти 0 та 1)
out61h,al; Запис у системний порт
jmpex; Вихід, якщо прапор не зведено
muz1:movsi,cs:tek_mel; Адреса поточної ноти
;Програмування дільника частоти 2 каналу
out42h,al; Мл.байт частоти. канал 2 таймера
out42h,al; ст. байт частоти. канал 2 таймера
oral,3; Роздільна здатність звучання (біти 0 і 1)
out61h,al; Запис у системний порт
new_int1c endp;Процедура отримання чергового звуку
; Мелодія "Чижик Пижик"
mel1db17,17,255,13,13,255,17,17,255,13,13,255,18,18,255
; Мелодія "Підмосковні вечори"
menudb10 dup(0ah), 30 dup(20h), 'Enter the point of menu :'
db0Dh,0Ah,30 dup(20h),'1 - CHIZHIK-PYZHIK',0Dh,0Ah,30 dup(20h),'2 - PODMOCKOVNYE VECHERA',0dh,0ah,30 dup(20h), 'q - Quit',5 dup(0Ah),"$"
erdb'Incorrect input! Try again!',0Dh,0Ah,"$"
notydw0eeeh,0e18h,0d49h,0c8eh,0bdfh,0b2fh,0abeh
old_int1c_offdw0;Зміщеннястароговектора
old_int1c_segdw0; Сегмент старого вектора
tek_meldw?; Адреса поточної ноти вибраної мелодії
1. Архітектура реального режиму
1.1. Пам'ять та процесор
1.3. Регістри процесора
1.4. Сегментна структура програм
1.6. Система переривань
1.7. Система введення-виведення
1.1. Пам'ять та процесор
Серед пристроїв та вузлів, що входять до складу комп'ютера, найбільш важливими для виконання будь-якої програми катаються оперативна пам'ять та центральний мікропроцесор, який ми для стислості називатимемо надалі просто процесором. В оперативній пам'яті зберігається програма, що виконується разом з належними їй даними; процесор виконує обчислення та інші дії, описані у програмі.
Процесор зчитує з пам'яті першу команду програми, знаходить у пам'яті чи своїх регістрах дані, необхідні її виконання (якщо, звісно, команда вимагає даних) і, виконавши необхідну операцію, повертає у пам'ять чи, можливо, залишає у регістрах результат своєї роботи ( рис.1.1).
Мал. 1.1. Взаємодія оперативної пам'яті та процесора.
Виконавши першу команду, процесорпереходить до наступної, і так довше до кінця програми. Завершивши програму, процесор не знатиме, що йому далі робити, тому будь-яка програма має завершуватися командами, які передають управлення операційній системі комп'ютера.
Деякі дані (наприклад, коди символів) вимагають для зберігання одного байта; для інших даних цього місця не вистачає, і під них у пам'яті виділяється 2, 4, 8 або ще більше байтів. Зазвичай кілька байтів називають словами, а четвірки - подвійними словами (рис. 1.2), хоча іноді терміном " слово " позначають будь-яку порцію машинної інформації.
Мал. 1.2. Байт, слово та подвійне слово.
При обговоренні вмісту багатобайтового даного доводиться посилатися на його байти; ці байти умовно нумеруються від нуля і розташовуються (при їх зображенні на папері) у порядку зростання номера справа наліво, так що зліва виявляються байти з більшими номерами, а праворуч - байти з меншими номерами. Крайній ліворуч байт прийнято називати старшим, а крайній праворуч - молодшим. Такий порядок розташування байтів пов'язані з звичною нам формою запису чисел: у багаторозрядному числі зліва вказуються старші розряди, а праворуч - молодші. Наступне число, якщо його написати за попереднім, знову розпочнеться зі старшого розряду та закінчиться молодшим. Однак у пам'яті комп'ютера дані розташовуються в природнішому порядку безперервного зростання номерів байтів і, таким чином, кожне слово або подвійне слово в пам'яті починається з його молодшого байта і закінчується старшим (рис. 1.3).
Мал. 1.3. Нумерація байтів у багатобайтових даних.
Строго кажучи, у пам'яті комп'ютера можна зберігати лише цілі двійкові числа, оскільки пам'ять складається з двійкових елементів, що запам'ятовують. Для запису інших даних, наприклад, символів абодробових чисел, їм передбачаються правила кодування, тобто. уявлення
у вигляді послідовності бітів тієї чи довжини. Так, дійсне число одинарної точності займає у пам'яті подвійне слово (32 біт), у якому 23 біт відводяться під мантису, 8 біт під лад і ще один біт під знак числа. Програми, що працюють з такими даними, повинні, природно, знати правила їх запису і керуватися ними при обробці та поданні цих даних.
Двійкова система числення, в якій працюють усі цифрові електронні пристрої, незручна для людини. Для зручності представлення двійкового вмісту осередків пам'яті або регістрів процесора використовують іноді вісімкову, а частіше - шістнадцяткову систему числення. Для процесорів Intel використовується шістнадцяткова система.
Кожен розряд шістнадцяткового числа може набувати 16 значень, з яких перші 10 позначаються звичайними десятковими цифрами, а останні 6 - літерами латинського алфавіту від А до F, де А позначає 10, В - І, С - 12, D - 13, Е - 14 , a F - 15. У мові асемблера шістнадцяткові числа, щоб відрізняти їхню відмінність від десяткових, завершуються літерою h (або Н). Таким чином, 100 – це десяткове число, a l00h – шістнадцяткове (рівне 256). Оскільки одна шістнадцяткова цифра вимагає для запису її в пам'ять комп'ютера чотирьох двійкових розрядів, то вміст байта описується двома шістнадцятеричними цифрами (від 00h до FFh, або від 0 до 255), а вміст слова - чотирма (від 0000h до 0000h 0 до 65 535).
Крім осередків оперативної пам'яті, для зберігання даних використовуються ще запам'ятовують комірки, розташовані в процесорі і звані регістрами. Гідність регістрів полягає в їх високій швидкодії, набагато більшій, ніж у оперативної пам'яті, аНедолік у тому, що їх дуже мало – всього близько десятка. Тому регістри використовуються лише для короткочасного зберігання даних. У режимі МП 86, який ми тут обговорюємо, всі регістри процесора мають довжину 16 розрядів, або 1 слово (насправді в сучасних процесорах їхня довжина становить 32 розряди, але в МП 86 кожного регістру використовується лише його половина). За кожним регістром закріплено певне ім'я (наприклад, АХ чи DS), яким до нього можна звертатися у програмі. Склад та правила використання регістрів процесора будуть докладно описані нижче, тут же торкнемося тільки призначення сегментних регістрів, за допомогою яких здійснюється звернення процесора до осередків оперативної пам'яті.
- вхідний буфер клавіатури, куди надходять коди клавіш, що натискаються користувачем;
- осередки для відліку поточного часу і т.д.
Область даних BIOS заповнюється інформацією в процесі початкового завантаження комп'ютера, потім динамічно модифікується системою в міру необхідності. Багато прикладних програм, особливо написаних мовою асемблера, звертаються до цієї області з метою читання або модифікації даних, що містяться в них. З деякими осередками області даних BIOS ми зіткнемося під час розгляду прикладів конкретних програм.
Вся пам'ять, що залишилася, до кордону 640 Кбайт вільна для завантаження будь-яких системних або прикладних програм. Як правило, на початку сеансу на згадку завантажують резидентні програми (русифікатор, антивірусні програми). За наявності резидентних програм обсяг вільної пам'яті зменшується.
Оскільки функціонування розширеної пам'яті підпорядковується специфікації розширеної пам'яті (Extended Memory Specification, скорочено XMS), то і саму пам'ять часто називають XMS-пам'яттю. Як зазначалося вище,Доступ до розширеної пам'яті здійснюється в захищеному режимі, тому для MS-DOS, що працює тільки в реальному режимі, розширена пам'ять недоступна. Однак у сучасні версії MS-DOS включається драйвер HIMEM.SYS, підтримує розширену пам'ять, тобто. що дозволяє її використовувати, хоч і обмеженим чином. Безпосередньо у розширеній пам'яті можна розмістити електронні диски (за допомогою драйвера RAMDRIVE.SYS) або дискові кеш-буфери (за допомогою драйвера SMARTDRV.SYS).
1.3. Регістри процесора
Як уже зазначалося вище, в сучасних мікропроцесорах типу, наприклад, Pentium, можна виділити частину (ми назвали її МП 86), призначену для використання в реальному режимі та практично відповідну процесору 8086. Нижче, використовуючи термін "процесор", ми матимемо на увазі саме МП 86.
пересилає старший байт регістру АХ в молодший байт регістра ВХ, не торкаючись у своїй других байтів цих регістрів. Зауважте, що спочатку вказується операнд-приймач, а після коми - .операнд-джерело, тобто. команда ніби виконується праворуч наліво.
Мал. 1.6. Регістри процесора.
У багатьох випадках регістри даних цілком еквівалентні, проте краще користуватися регістром АХ, оскільки багато команд займають у пам'яті менше місця і виконуються швидше, якщо їх операндом є регістр АХ (або його половина AL). З іншого боку, низка команд використовує певні регістри неявним чином. Так, всі команди циклів використовують регістр СХ як лічильник числа повторень; у командах множення та поділу регістри АХ і DX виступають як неявні операнди; операції вводу-виводу можна здійснювати лише через регістри АХ чи AL тощо.