Мова програмування Assembler
p align="left">Користувальницький Вищий Нижчий ROM ЗовнішнійЯк показано вище, переривання від тичина 20 до тичина 62 зарезервовані для операцій DOS. Нижче приведені найбільш основні з них: INT 20H Завершення програми. Запит завершує виконання програми і передає керування в DOS. Даний запит звичайно знаходиться в основній процедурі. INT 21H Запит функцій DOS. Основна операція DOS, яка визиває визначену функцію відповідно до коду в регістрі AH. Призначення функцій DOS описано в наступному розділі. INT 22H Адреса підпрограми обробки завершення задачі. (см.INT 24H). INT 23H Адреса підпрограми реакції на Ctrl/Break. (см.INT 24H). INT 24H Адреса підпрограми реакції на фатальну помилку. У цьому елементі й у двох попередніх містяться адреси, які ініціалізуються системою в префіксі програмного сегмента і, які можна змінити для своїх цілей. Подробиці приведені в технічному описі DOS. INT 25H Абсолютне читання з диска. Див.гл.17. INT 26H Абсолютний запис на диск. Див.гл.17. INT 27H Завершення програми, що залишає її резедентною. Дозволяє зберегти COM-програму в пам'яті. Докладно дана операція показана в наступному розділі "Резидентні програми". 3. Використання переривань у програмах Засобу ініціювання й обробки переривань є важливою складовою частиною будь-якої обчислювальної системи, в тому числі і персональної ЕОМ. Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив виконання поточного завдання і приділив увагу зовнішньому пристрою. У IBM PC клавіатура посилає сигнал переривання кожного раз, коли натискається одна з клавіш. Це переривання повідомляє мікропроцесору, що потрібно припинити поточну роботу і вважати символ із клавіатури. Неважко зрозуміти походження терміна "переривання": сигнал переривання "перериває" поточну роботу мікропроцесора. Переривання є гарним поміч- ником для мікропроцесора, оскільки звільняє його від постійного контролю за зовнішніми пристроями. Якби, наприклад, клавіатура не викликала переривання, то мікропроцесору приходилося б постійно перевіряти стан клавіатури, щоб визначити, чи не була натиснута якась із клавіш. Будь-яка написана для ЕОМ програма повинна була б містити ту саму процедуру, і у процесі свого виконання досить часто здійснювати перевірку стану клавіатури. Однак наявність переривання, знімає це обмеження, і програма може виконуватися без такої перевірки. Клавіатура сигналізує мікропроцесору, щораз, коли їй треба передати інформацію мікропроцесору. Після того, як мікропроцесор задовільнить запит клавіатури, він може відновити нормальний хід виконання програми. У мікропроцесорі 8088 обробка переривань багато в чому схожа на виконання підпрограм. Якщо виникає переривання, то воно не може зупинити мікропроцесор під час виконання ним команди. Насамперед мікропроцесор 8088 завершує виконання поточної команди. Потім, не звертаючи уваги на наступну команду програми, він діє як у випадку виклику підпрограми. Мікропроцесор записує адреса наступної команди в стек і переходить до спеціальної підпрограми, названою обробкою переривання. Ця підпрограма містить команди, що вимагаються пристроєм, який визиває переривання. Для клавіатури, в обробку переривання входять зчитування і запис символу в пам'ять для наступного його використання. Після того, як підпрограма обробки переривання закінчила роботу з пристроєм, він здійснює повернення в крапку програми, де відбулося переривання. Мікропроцесор зчитує зі стека адреса повернення, і програма продовжує виконуватися, начебто нічого не відбулося. Оскільки переривання викликається зовнішніми пристроями, воно може відбутися в будь-який момент виконання програми. Неможливо передбачити в програмі ніяких спеціальних мір підготовки до виникнення переривання, тому що для програми момент уведення символу з клавіатури оператором є непередбаченим. Звідси випливає, що підпрограма обробки переривання не повинна модифікувати значення дані, використо- вувані перерваною програмою. У випадку модифікації їх програма після повернення їй керування не зможе виконуватися правильно. Частина процедури переривання полягає в тому, що коли вона виникає, мікропроцесор 8088 автоматично записує в стек деякі дані перерваної програми. У свою чергу, підпрограма обробки переривань відповідає за запис у пам'ять будь-яких інших даних, що вона може змінити в час свого виконання. Звичайно ці дані записуються в стекову пам'ять. Потім, перед поверненням керування перерваній програмі, підпрограма обробки переривань повинна відновити програмні параметри відповідно до їх значення в момент переривання. Факт виникнення переривання не повинен відбитися на виконуваній програмі. Оскільки існує багато пристроїв, що посилають мікропроцесору сигнали переривання, у мікропроцесорі 8088 мається механізм переривання по вектору. Це означає, що мікропроцесор 8088 визначає, який з пристроїв запросив переривання, і передає керування потрібній програмі обробки переривань, що відповідає цьому пристрою. Мікропроцесор автоматично виконує векторизацію запитів на переривання. Програма обробки переривань не повинна перед обслуговуванням пристрою визначати, яке з них запросило переривання. Це зменшує тривалість переривання і спрощує програму його обробки. У програмах зустрічаються такі ділянки, виконання яких не може бути перервано. Можливо, що частина деякої конкретної програми повинна виконуватися дуже швидко для того, щоб одержати визначений результат, або програма працює з даними, що зберігалися у пам'яті, які можуть бути змінені при обробці переривань. У кожному з цих випадків програма повинна мати можливість заборонити переривання, тобто не допускати виконання переривання на цих критичних ділянках програми. Після прохо- дження цих ділянок, функціонування ситеми переривань повинне бути відновлено програмою. Програма не може блокувати систему переривань занадто довго, інакше в обслуговуванні пристрою, який запросив перерива- ння, може відбутися збій. Якщо програма обробки переривання, яке надійш- ло з клавіатури, не встигне обдумати символ перед тим, як оператор надрукує наступний, то цей другий символ може бути загублений. У мікропроцесорі 8088 є можливість увести заборону на всі зовнішні переривання. У IBM PC, крім того, є можливість задавати пристрою, що можуть викликати переривання. Це дозволяє вибрати в програмі найбільш важливі пристрої, яким дозволене переривання, і одночасно заборонити переривання від інших, менш важливих. Методи заборони переривань будуть розглянуті в наступних главах. 4. Основні переривання та їх функції (крім 21h) Принтери класифікуються по якості друку. Матричний принтер формує символи у виді матриці крапок і забезпечує нормальний, вузький і широкий формати символів. Більш модернізовані матричні принтери забезпечують крапкову графіку, похилий шрифт, жирний друк і подвійну щільність, а також можуть друкувати, наприклад, символи гральних карт і інші алфавітно-цифрові символи. Високоякісні друкуючі пристрої, що тануть, обмежені набором символів на змінної "ромашці" чи барабані, але забезпечують відмінну якість друку і велику розмаїтість принтерів. Багато з високоякісних принтерів забезпечують друк в 10,12 чи 15 символів на дюйм, а також пропорційне розташування пробілів, підкреслення, тіньового і напівжирного друку. Лазерні принтери мають переваги як для матричної графіки, так і для якісного друку текстів. Інша класифікація друкувальних пристроїв зв'язана з інтерфейсами. Комп'ютери IBM PC мають рівнобіжний інтерфейс, що дозволяє передавати одночасно вісім бітів інформації на принтер. Крім того, існує послідовний інтерфейс, який виконує побітову передачу даних. Багато принтерів мають буфер пам'яті, обсягом у декілька тисяч байтів. Принтери також можуть приймати біти контролю на парність (непарність). Принтери повинні "розуміти" спеціальні сигнали з процесора, наприклад, для прогону листа, перекладу чи рядка горизонтальної табуляції. У свою чергу, процесор повинен "розуміти" сигнали від принте- ра, що вказують на кінець папера або стан "зайняте". На жаль багато типів принтерів по різному реагують на сигнали процесора й однією з найбільш складних проблем для програмістів - забезпечити відповідність власних програм наявним друкувальним пристроєм. СИМВОЛИ КЕРУВАННЯ ПЕЧАТКОЮ Стандартними символами керування печаткою є: Горизонтальна табуляція. Горизонтальна табуляція (тичина.09) можлива тільки на принтерах, що мають відповідне забезпечення, інакше символи табуляції ігноруються. В останньому випадку можна імітувати табуляцію висновком відповід- ного числа пробілів. Переклад рядка. Символ перекладу рядка (тичина.OA) використовується для прогону листа на один інтервал. Відповідно для друку через два інтервали використо-вується два символи перекладу рядка. Прогін сторінки. Установка паперу після включення принтера визначає початкову позицію друку сторінки. Довжина сторінки за замовчуванням складає 11 дюймів. Ні процесор, ні принтер автоматично не визначають кінець сторінки. Якщо ваша програма продовжує друкувати після закінчення сторінки, то відбу- деться перехід через міжсторінкову перфорацію на початок наступної сто- рінки. Для керування сторінками необхідно підраховувати число надрукова- них рядків і при досягненні максимального значення (наприклад, 55 рядків) видати код прогона сторінки (тичина.OC), а потім скинути лічильник рядків у 0 чи 1. Наприкінці друку необхідно видати символ "перекладу рядка" або "прогону сторінки" для видачі на друк даних останнього рядка, що знаходяться в буфері друкуючого пристрою. Використання останнього символу "прогін сторінки" дозволяє встановити надрукований останній лист у положення для відриву. ФУНКЦІЇ ПЕЧАТКИ В РОЗШИРЕНІЙ ВЕРСІЇ DOS В операційній системі DOS 2.0 наявні файлові покажчики, що були показані в главах по керуванню екраном дисплея і дискової печатки. Для висновку на друкуючий пристрій використовується функція DOS тичина.40 і стандартний файловий номер 04. Наступний приклад демонструє печатка 25 символів з області HEADG: У випадку помилки операція встановлює прапор CF і повертає код помилки в регістрі AX. ПРОГРАМА: ПОСТОРІНКОВА ПЕЧАТКА З ЗАГОЛОВКАМИ Програма, приведена на рис.19.1, аналогічна програмі на рис.9.1, за винятком того, що після введення імен з клавіатури виводить їх не на екран, а на друкуючий пристрій. Кожна надрукована сторінка містить заголовок, і через подвійний інтервал список введених імен у наступному виді: List of Employee Names Page 01 Clancy Alderson Ianet Brown David Christie Програма підраховує число надрукованих рядків і при досягненні кінця сторінки виконує прогін до початку наступної сторінки. У програмі існують такі процедури: D10INPT Видає на екран запит і потім вводить ім'я з клавиатури. E10PRNT Виводить ім'я на друкуючий пристрій (довжина імені береться з вступного списку параметрів); у кінці сторінки викликає процедуру M10PAGE. M10PAGE Виконує прогін на нову сторінку, друкує заголовок, скидає лічильник рядків і збільшує лічильник сторінок на одиницю. P100UT Загальна підпрограма для безпосереднього висновку на друкува льний пристрій. На початку виконання необхідно надрукувати заголовок, але не робити перед цим переклад сторінки. Процедура M10PAGE обходить переклад сторінки, якщо лічильник PAGECTR містить 01 (початкове значення). Поле PAGECTR - визначене як PAGECTR DB '01'. У результаті буде згенеровано число в ASCII коді - тичина. 3031. Процедура M10PAGE збільшує лічильник PAGECTR на 1 так, що значення стає послідовно 3032, 3033 і т.д. Ці значення коректні до 3039, далі випливає 303A, яке буде роздруковано, як двокрапка (:). Тому, якщо в правому байті лічильника PAGECTR з'являється тичина 3A, то це значення заміняється на тичину 30, а до лівого байта додається одиниця. У такий спосіб тичина 303A перекодується в тичину 3130, тобто в 10 у символьному представленні. Перевірка на кінець сторінки до (але не після) печатки імені гарантує, що на останній сторінці буде надруковане по крайній мірі одне ім'я під заголовком. ПЕЧАТКА ASCII-ФАЙЛІВ І ТАБУЛЯЦІЯ Табуляція, яка забезпечується, наприклад, відеоадаптерами, полягає в заміні одного символу табуляції (код 09) декількома пробілами при висновку так, щоб наступна позиція була кратна 8. Таким чином, стандартні позиції табуляції є 8, 16, 24 і т.д. Багато принтерів, однак, ігнорують символи табуляції. Тому, така програма, як DOS PRINT, призначена для печатки ASCII файлів (наприклад асемблерних вихідних текстів) перевіряє кожен символ, посилається на принтер. І, якщо виявляється символ табуляції, то програма видає кілька пробілів до позиції кратної 8. Програма, приведена на рис 19.2, виводить на екран запит на введення імені файлу і, потім, друкує вміст зазначеного файлу. Ця програма на відміну від приведеної на рис.17.3 (виведення файлів на екран) здійснює заміну виведених символів табуляції на відповідне число пробілів. У результаті символ табуляції в позиціях від 0 до 7 приводить до переходу на позицію 8, від 8 до 15 - на 16 і т.д. Команди, що реалізують дану логіку, знаходяться в процедурі G10XFER після мітки G60. Розглянемо три приклади обробки символу табуляції: У програмі організовані наступні процедури: З10PRMP Запитує введення імені файлу. Натискання тільки клавіші Return приводить до завершення роботи програми. E10OPEN Відкриває дисковий файл по зазначеному імені. G10XFER Контролює кінець сектора, кінець файлу, кінець області висновку, символи "переклад рядка" і табуляціі. Пересилає звичайні символи в область висновку. P10PRNT Роздруковує вивідний рядок і очищає область висновку. R10READ Зчитує сектор з дискового файлу. Коди "повернення каретки", "переклад рядка" і "прогін сторінки" дійсні для будь-яких принтерів. Можна модифікувати програму для підрахунку рядків, що роздруковуються, і виконання прогону сторінки (тичина.OC) при досягненні, наприклад, рядка 62. Деякі користувачі воліють установлювати символи "прогін сторінки" у ASCII файлах за допомогою текстового редактора в конкретних місцях тексту, наприклад, наприкінці асемблерних процедур. Крім того, можна змінити програму для функції 05 базової версії DOS. Ця функція виконує виведення кожного символу безпосередньо на принтер. Таким чином можна виключити визначення і використання області висновку. ПЕЧАТКА ПІД КЕРУВАННЯМ БАЗОВОЇ DOS Для друку в базовій версії DOS необхідно встановити в регістрі AH код функції 05, а в регістр DL помістити символ, що роздруковується, і, потім, виконати команду INT 21H у такий спосіб: MOV AH,05; Запит функції печатки MOV DL,char; символ, ЩоРоздруковується INT 21H; Виклик DOS За допомогою цих команд можна передавати на принтер керуючі символи. Однак, печатка, звичайно, припускає виведення повного чи часткового рядка тексту і покрокову обробку області даних, відформатова- ної по рядках. Нижче показана програма печатки повного рядка. Спочатку в регістр SI завантажується початкова адреса області HEADG, а в регістр CX - довжина цієї області. Цикл, що починається по мітці P20, виділяє черговий символ з області HEADG і посилає його на принтер. Оскільки перший символ області HEADG - "прогін сторінки", а останні два - "переклади рядка", тому заголовок друкується на початку нової сторінки і після нього випливає подвійний інтервал. HEADG DB 0CH,'Industrial Bicycle Mfrs',0DH,0AH,0AH LEA SI,HEADG ;Установка адреси і MOV CX,27 ; довжини заголовка P20: MOV AH,05 ;Запит функції печатки MOV DL,[SI] ;Символ із заголовка INT 21H ;Виклик DOS INC SI ;Наступний символ LOOP P20 Поки принтер не включений, DOS видає повідомлення "Out of paper". Після включення харчування програма починає працювати нормально. Для припинення печатки можна натиснути клавіші Ctrl/Break. СПЕЦІАЛЬНІ КОМАНДИ ПРИНТЕРА Вище вже був показаний ряд команд, що є основними для більшості друкувальних пристроїв. Крім того існують наступні команди: Є команди, що розпізнаються по попередньому символу Esc (тичина.IB). Деякі з них у залежності від друкуючого пристрою представлені нижче: 1B 30 Встановити щільність 8 рядків на дюйм 1B 32 Встановити щільність 6 рядків на дюйм 1B 45 Включити жирний формат 1B 46 Виключити жирний формат Коди команд можна посилати на принтер двома різними способами: 1. Визначити команди в області даних. Наступний приклад установлює вузький формат, 8 рядків на дюйм, потім друкує заголовок із завершальними командами "повернення каретки" і " переклад рядка": HEADG DB 0FH, 1BH, 30H, 'Title...', 0DH, 0AH 2. Використовувати команди з безпосередніми даними: MOV AH,05 ;Запит функції печатки MOV DL,0FH ;Уключити вузький формат INT 21H Усі наступні символи будуть друкуватися у вузькому форматі доти, поки програма не видасть на принтер команду, що виключає цей формат. Приведені команди не обов'язково працюють на принтерах будь-яких моделей. Для перевірки можливих команд керування варто ознайомитися з посібником конкретного друкуючого пристрою. Команда BIOS INT 16H виконує спеціальну операцію, яка відповідно до коду в регістрі AH забезпечує наступні три функції введення з клавіатури. AH=00: Читання символу. Дана функція поміщає в регістр AL черговий ASCII символ, уведений із клавіатури, і встановлює скен код у регістрі AH. (Скен-коди порозуміваються у наступному розділі). Якщо на клавіатурі натиснута одна з спеціальних клавішею, наприклад, Ноmе чи F1, то в регістр AL заноситься 00. Автоматична луна символу на екран по цієї функції не відбувається. AH=01: Визначення наявності введеного символу. Дана функція скидає прапор нуля (ZF=0), якщо є символ для читання з клавіатури; черговий символ і скен-код будуть поміщені в регістри AL і AH відповідно і даний елемент залишиться в буфері. AH=02: Визначення поточного стану клавіатури. Дана функція повертає в регістрі AL стан клавіатури з адреси пам'яті тичина 417: Біт 7 Стан вставки активно (Ins) 6 Стан фіксації верхнього регістра (Caps Lock) переключено 5 Стан фіксації цифрової клавіатури (Num Lock) переключено 4 Стан фіксації прокручування (Scroll Lock) переключено 3 Натиснута комбінація клавішею Alt/Shift 2 Натиснута комбінація клавішею Ctrl/Shift 1 Натиснута ліва клавіша Shift 0 Натиснута права клавіша Shift ФУНКЦІОНАЛЬНІ КЛАВІШІ Клавіатура має три основні типи клавіш: 1. Символьні (алфавітно-цифрові) клавіші: букви від a до z, цифри від 0 до 9, символи %, $, # і т.д. 2. Функціональні клавіші: Ноmе, End, Повернення на позицію, стрілки, Return, Del, Ins, PgUp, PgDn і програмно- функціональні клавіші. 3. Керуючі клавіші: Alt, Ctrl і Shift, що працюють разом з іншими клавішами. Функціональна клавіша не виробляє який-небудь символ, але частіше формує запит на деякі дії. Апаратна реалізація не жадає від функціональних клавіш виконання яких-небудь специфічних дій. Задачею програміста є визначити, наприклад, що натискання клавіші Ноmе повинно привести до установки курсору у верхній лівий кут екрана, або натискання клавіші End повинне установити курсор у кінець тексту на екрані. Можна легко запрограмувати функціональні клавіші для виконання всіляких дій. Кожна клавіша має власний скен-код від 1 (Esc) до 83 (Del) чи від тичина 01 до тичина 53. За допомогою цих скен-кодів програма може визначити натискання будь-якої клавіші. Наприклад, запит на введення одного символу з клавіатури включає завантаження 00 у регістр AH і звертання до BIOS через INT 16H: MOV AH,00 ;Функція введення з клавіатури INT 16H ;Викликати BIOS Дана операція має два типи відповідей у залежності від того, натиснута символьна чи функціональна клавіша. Для символу (наприклад, буква A) клавіатура посилає в комп'ютер два елементи інформації: 1. ASCII-код символу A (тичина 41) у регістрі AL; 2. Скен-код для клавіші A (тичина 1E) у регістрі AH. Якщо натиснута функціональна клавіша (наприклад, Ins) клавіатура також передає два елементи: 1. Нуль у регістрі AL; 2. Скен-код для клавіші Ins (тичина.52) у регістрі AH. Таким чином, після виконання команди INT 16H необхідно колись перевірити вміст регістра AL. Якщо AL містить нуль, то була натиснута функціональна клавіша, якщо не нуль, то отриманий код - символьної клавіші. Нижче приведений приклад такої перевірки: MOV AH,00 ;Функція введення INT 16H ;Викликати BIOS CMP AL,00 ;Функціональна клавіша? JZ exit ; так - вийти Скен-Коди Клавіатура має по дві клавіші для таких символів як *, + і -. Натискання "зірочки", наприклад, встановлює код символу тичина 2A у регістрі AL і один із двох скен-кодів у регістрі AH в залежності від того, яка з клавіш була натиснута: тичина 09 для зірочки над цифрою 8 чи тичина 29 для зірочки на клавіші PrtSc. Нижче приведена логіка перевірки скен-коду для зірочки: Приведемо приклад програми для установки курсору в рядок 0 і cтовбця 0 при натисканні клавіші Ноmе (скен-код 47): MOV AH,00 ; Виконати введення з клавіатури INT 16H ; CMP AL,00 ; Функціональна клавіша? JNE EXIT1 ; немає -і вийти CMP AH,47H ; Скен-код для клавіші Home? JNE EXIT2 ; немає -і вийти MOV AH,02 ; MOV BH,00 ; Установити курсор MOV DX,00 ; по координатах 0,0 INT 10H ; Викликати BIOS Функціональні клавіші F1 - F10 генерують скен-коди від тичини 3B до тичини 44. Наступний приклад виконує перевірку на функціональну клавішу F10: CMP AH,44H ; Клавіша F10? JE EXIT1 ; Так За адресою EXIT1 програма може виконати будь-яку необхідну дію. Повний список скен-кодів приводиться в посібнику з мови BASIC. Технічний опис IBM PC містить докладний опис усіх скен-кодів, а також опис використання клавіш Alt, Ctrl і Shift. Лекція 9 1. Функції переривання 21h 2. Функції введення/виведення символу та стрічки 3. Керування кольором 1. Функції переривання 21h Переривання 21H є перериванням, через яке відбувається звертання до основним функціям DOS. Це переривання забезпечує доступ до системи введення-висновку, керованої DOS. На рис.5.4 представлені всі можливі функції, що використовують це переривання. Вибір функції в програмі здійснюється за допомогою запису в регістр AH потрібного значення перед виконанням переривання 21H. ФУНКЦІЇ ПЕРЕРИВАННЯ DOS INT 21H Нижче приведені базові функції для переривання DOS INT 21H. Код функції встановлюється в регістрі AH: 00 Завершення програми (аналогічно INT 20H). 01 Уведення символу з клавіатури з луною на екран. 02 Виведення символу на екран. 03 Уведення символу з асинх. комунікаційного каналу. 04 Виведення символу на асинх. комунікаційний канал. 2. Функції введення/виведення символу та стрічки ВИВЕДЕННЯ НА ЕКРАН: БАЗОВА ВЕРСІЯ DOS Виведення на екран у базовій версії DOS вимагає визначення текстового повідомлення в області даних, установки в регістрі AH значення 09 (виклик функції DOS) і вказівки команди DOS INT 21H. В процесі виконання операції кінець повідомлення визначається по oбмежнику ($), як це показано нижче: NAMPRMP DB 'Ім'я покупця?','$ MOV AH,09 ;Запит висновку на екран LEA DX,NAMPRMP ;Завантаження адреси сообщ. INT 21H ;Виклик DOS Знак обмежувача "$" можна кодувати безпосередньо після cимвольного рядка (як показано в прикладі), усередині рядка: Ім'я покупця?$', чи в наступному операторі DB '$'. Використовуючи дану операцію, не можна вивести на екран символ долара "$". Крім того, якщо знак долара буде відсутній у кінці рядка, то на екран будуть виводитися всі наступні символи, поки знак "$" не зустрінеться в пам'яті. Команда LEA завантажує адресу області NAMPRMP у регістр DX для передачі в DOS адреси виведеної інформації. Адреса NAMPRMP, що завантажується в DX по команді LEA, є oтносительным, тому для обчислення абсолютної адреси даних DOS складає значення регістрів DS і DX (DS:DX). ПРОГРАМА: ВИВЕДЕННЯ НА ЕКРАН НАБОРУ СИМВОЛІВ КОДУ ASCII Більшість з 256 кодів ASCII мають символьне позначення, і можуть бути виведені на екран. Коди 00 і FF не мають символів і виводяться на екран у виді пробілів, хоча символ пробілу має в ASCII шіст. код 20. На рис. 8.1 показана COM-програма, що виводить на екран повний набір символів коду ASCII. Програма викликає три процедури; B10CLR, C10SET і D10DISP. Процедура B10CLR очищає екран, а процедура C10SET встановлює курсор у положення 00,00. Процедура D10DISP виводить вміст CTR, що на початку иніціалізується значенням 00 і потім збільшується на 1 при кожному висновку на екран, поки не досягне шіст. значення FF. Оскільки символ долара не виводиться на екран і крім того коди від 08 до 0D є спеціальними керуючими cимволами, тому це приводить до переміщення курсору й іншим керуючим впливам. Завдання: уведіть програму, виконайте асемблювання, компоновку і перетворення в COM-файл. Для запуску програми введіть її ім'я, наприклад, У:ASCII.COM. Перший виведений рядок починається з пробільного символу (тичина.00), двох "усміхнених облич" (тичина. 01 і 02) і трьох карткових символів (тичина.03, 04 і 05). Код 07 видає звуковиття сигнал. Код 06 повинний відобразитися картковим символом "піки", але керуючі символи від тичина 08 до 0D зітруть його. Код 0D є "поверненням каретки" і приводить до переходу на новий (наступний) рядок. Код тичина 0E - представляється у виді музичної ноти. Символи після тичини 7F є графічними. Можна змінити програму для обходу керуючих символів. Нижче приведений приклад фрагмента програми, що дозволяє обійти усі символи між тичинами 08 і 0D. Ви можете поекспериментувати, oбходячи тільки, скажімо, тичину 08 (повернення на символ) і 0D (повернення каретки): CMP CTR,08H ; Менше ніж 08? JB D30 ; так - прийняти CMP CTR,0DH ; Менше/дорівнює 0D? JBE D40 ; так - обійти D30: MOV AH,40H ; Виведення символів < 08 INT 21H ; і > 0D D40: INC CTR УВЕДЕННЯ ДАНИХ ІЗ КЛАВІАТУРИ: БАЗОВА ВЕРСІЯ DOS Процедура введення даних із клавіатури простіше, ніж виведення на екран. Для введення, що використовує базову DOS, область уведення вимагає наявності cписка параметрів, що містить поля, що необхідні при виконанні команди INT. По-перше, повинна бути визначена максимальна довжина тексту, що вводиться. Це необхідно для попередження користувача звуковим сигна брухт, якщо набраний занадто довгий текст; символи, що перевищують максимальну довжину не приймаються. По-друге, у списку параметрів повинне бути визначене поле, куди команда повертає дійсну довжину введеного тексту в байтах. Нижче приведений приклад, у якому визначений список параметрів для області введення. LABEL являє собою директиву з атрибутом BYTE. Перший байт містить максимальну довжину даних, що вводяться. Оскільки це однобайтове поле, то можливо його максимальне значення - тичина FF чи 255. Другий байт необхідний DOS для занесення в нього дійсного числа введених символів. Третім байтом починається поле, що буде містити введені символи. NAMEPAR LABEL BYTE ;Список параметрів: MAXLEN DB 20 ; Максимальна довжина ACTLEN DB ? ; Реальна довжина NAMEFLD DB 20 DUP (' ') ; Уведені символи Оскільки в списку параметрів директива LABEL не займає місця, то NAMEPAR і MAXLEN вказують на той самий aдрес пам'яті. У трансляторі MASM для визначення списку параметрів у виді структури може використовуватися також директива STRUC. Однак, у зв'язку з тим, що посилання на імена, визначені всередині, вимагають спеціальної адресації, утримаємося cейчас від розгляду даної теми до глави 24 "Директиви асемблера". Для запиту на введення необхідно помістити в регістр AH номер функції - 10 (тичина. 0AH), завантажити адреса списку параметрів (NAMEPAR у нашому прикладі) у регістр DX і виконати INT 21H: MOV AH,0AH ;Запит функції введення LEA DX,NAMEPAR ;Завантажити адреси списку параметрів INT 21H ;Викликати DOS Команда INT очікує поки користувач не введе з клавіатури текст, перевіряючи при цьому, щоб число введених cимволів не перевищувало максимального значення, зазначеного в списку параметрів (20 у нашому прикладі). Для вказівки кінця введення користувач натискає клавішу Return. Код цієї клавіші (тичина. 0D) також заноситься в поле введення (NAMEFLD у нашому прикладі). Якщо, наприклад, користувач ввів ім'я BROWN (Return), то cписок параметрів буде містити інформацію: дес.: :20:5: В: R: O: W: N: #: : : : : ... шіст.: :14:05:42:52:4F:57:4E:0D:20:20:20:20: ... В другий байт списку параметрів (ACTLEN у нашому прикладі) команда заносить довжину введеного імені - 05. Код Return знаходиться за адресою NAMEFLD +5. Символ # використаний тут для індикації кінця даних, тому що 0D не має відображуваного символу. Оскільки максимальна довжина в 20 символів включає тичина.0D, то дійсна довжина що вводиться текстом може бути тільки 19 символів. ПРОГРАМА: ВВЕДЕННЯ І ВИВЕДЕННЯ ІМЕН EXE-програма, приведена на рис. 8.2, запитує введення імені, потім відображає в середині екрана введене ім'я і включає звуковий сигнал. Програма продовжує запитувати і відображати імена, поки користувач не натисне Return у відповідь на черговий запит. Розглянемо ситуацію, коли користувач ввів ім'я TED SMITH: 1. Розділимо довжину 09 на 2 одержимо 4, і 2. Віднімемо це значення від 40, одержимо 36 Команда SHR у процедурі E10CENT зрушує довжину 09 на oдин біт вправо, виконуючи таким чином розподіл на 2. Значення біт 00001001 переходить у 00000100. Команда NEG змінює знак +4 На -4. Команда ADD додає значення 40, одержуючи у регістрі DL номер початкового стовпця - 36. При установці курсору на рядок 12 і стовпець 36 ім'я буде виведене на екран у наступному виді: Рядок 12: TED SMITH Стовпець: 36 40 У процедурі E10CODE існує команда, що встановлює cимвол звукового сигналу (07) в області введення безпосередньо після імені: MOV NAMEFLD[BX],07 Попередня команда встановлює в регістрі BX значення довжини, і команда MOV потім, комбінуючи довжину в регістрі BX і адресу поля NAMEFLD, пересилає код 07. Наприклад, при довжині імені 05 код 07 буде поміщений за адресою NAMEFLD+05 (заміщаючи значення коду Return). Остання команда в процедурі E10CODE встановлює обмежувач "$" після коду 07. Таким чином, коли процедура F10CENT виводить на екран ім'я, то генеpується також звуковий сигнал. Уведення єдиного символу Return При введенні імені, що перевищує по довжині максимальне значення, зазначене в списку параметрів, виникає звуковий сигнал і система oчікує уведення тільки символу Return. Якщо узагалі не вводити ім'я, а тільки натиснути клавішу Return, то система прийме її і yстановить у списку параметрів нульову довжину в такий спосіб: Список параметрів (тичина.): :14:00:0D:. Для позначення кінця імен, що вводяться, користувач може просто натиснути Return у відповідь на черговий запит на введення імені. Прогpамма визначає кінець уведення по нульовій довжині. Заміна символу Return Значення, що вводяться, можна використовувати для самих різних цілей, наприклад: для печатки повідомлень, збереження в таблиці, запису на диск. При цьому, можливо, з'явиться необхідність заміни символу Return (тичина.0D) в області NAMEFLD на символ пробілу (тичина.20). Поле NAMELEN містить дійсну або відносну довжину адреси коду 0D. Якщо, наприклад, NAMELEN містить довжину 05, то адреса коду 0D дорівнює NAMEFLD+5. Можна занести цю довжину в регістр BX для індексної адресації в поле NAMEFLD: MOV BH,00 ;Установити в регістрі BX MOV BL,NAMELEN ; значення 0005 MOV NAMEFLD[BX],20H ;Замінити 0D на пробіл Третя команда MOV заносить символ пробілу (тичина.20) по адресі, визначенній першим операндом: адреса поля NAMEFLD плюс вміст регістра BX, тобто NAMEFLD+5. 3. Керування кольором БАЙТ АТРИБУТІВ Байт атрибутів, як для монохромного, так і для графічного дисплея в текстовому (не графічному) режимі визначає характеристики кожного відображуваного символу. Атрибут-байт-атрибут має наступні 8 біт: Фон Текст Атрибут: BL R G B I R G B Номер бітів: 7 6 5 4 3 2 1 0 Букви RGB представляють бітові позиції, керуючі червоним (red), зеленим (green) і синім (blue) променем у кольоровому моніторі. Біт 7 (BL) установлює миготіння, а біт 3 (I) - рівень яскравості. На монохроматичних моніторах текст висвічується зеленим чи жовтогарячим на темному фоні, хоча в даному розділі таке зображення називається чорно-білим (BW). Для модифікації атрибутів можна комбінувати біти наступним чином: Ефект виділення Фон Текст RGB RGB Невідображуваний (чорний по чорному) 000 000 Підкреслення (не для кольору) 000 001 Нормальний (білий по чорному) 000 111 Інвертований (чорний по білому) 111 000 Кольорові монітори не забезпечують підкреслення; замість цього установка біт підкреслення вибирає синій колір для тексту і виходить відображення синім по чорному. Нижче приведено деякі атрибути, засновані на комбінації бітів фону, тексту, миготіння і виділення яскравістю: Двійковий Тичина. Ефект виділення код код 0000 0000 00 Невідображуваний (для паролів) 0000 0111 07 Білий по чорному (нормальний) 1000 0111 87 Білий по чорному (миготіння) 0000 1111 0F Білий по чорному (яскравий) 0111 0000 70 Чорний по білому (інвертований) 1111 0000 F0 Чорний по білому (инверт. миготливий) Ці атрибути підходять для текстового режиму, як для монохромних, так і для кольорових дисплеїв. У наступній главі буде показано, як вибирати конкретні кольори. Для генерації атрибуту можна використовувати команду INT 10H. При цьому регістр BL повинен містити значення байта-атрибута, а регістр AH один з наступних кодів: 06 (прокручування нагору), 07 (прокручування вниз), 08 (уведення чи атрибута символу), 09 (виведення атрибута чи символу). Якщо програма встановила деякий атрибут, то він залишається таким, доки програма його не змінить. Якщо встановити значення байта атрибута рівним тичина.00, то символ взагалі не буде відображений. Лекція 10 1. Переривання 10h 2. Функції екранного режиму. Функції малювання крапки та прямої 3. Керування кольором 1. Переривання 10h Переривання INT 10H забезпечує керування всім екраном. В регістрі AH встановлюється код, що визначає функцію переривання. Команда зберігає зміст регитрів BX, CX, DX, SI і BP. Нижче описані всі можливі функції. AH=00: Установка режиму. Дана функція дозволяє периключати кольоровий монітор у текстовий чи графічний режим. Установка pежиму для виконуваної в сучасний момент програми здійснюється c допомогою INT 10H. При установці відбувається очищення екрану. Зміст регістру AL може бути наступним: 00 40 х 25 чорно-білий текстовий режим 01 40 х 25 стандартний 16-кольоровий текстовий режим 02 80 х 25 чорно-білий текстовий режим 03 80 х 25 стандартний 16-кольоровий текстовий режим 04 320 х 200 стандартний 4-кольоровий графічний режим 05 320 х 200 чорно-білий графічний режим 06 640 х 200 чорно-білий графічний режим 07 80 х 25 чорно-білий стандартний монохроматичний 08 - 0A формати для моделі PCjr 0D 320 х 200 16-кольоровий графічний режим (EGA) 0E 640 х 200 16- кольоровий графічний режим (EGA) 0F 640 х 350 чорно-білий графічний режим (EGA) 10 640 х 350 64- кольоровий графічний режим (EGA) EGA (Enhanced Graphics Adapter) - позначає удосконалений графічний адаптер. Наступний приклад показує установку стандартного 16- кольорового текстового режиму
Страницы: 1, 2, 3, 4, 5, 6
|