Розробка віртуальних лабораторних робіт засобами емулятора Emu8086

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Зміст

Введення

1. Віртуальний лабораторний практикум в інженерній освіті

1.1 Особливості лабораторного практикуму для природничих дисциплін

1.2 Роль технології віртуальних приладів навчання в технічному вузі

2. Програмний емулятор (віртуальний ПК) Emu8086

2.1 Використання емулятора Emu8086

2.2 Компіляція коду Асемблера

2.3 Редактор вихідного коду

2.4 Асемблер

Лабораторна робота № 1

Лабораторна робота № 2

Лабораторна робота № 3

Лабораторна робота № 4

3. Висновок значення байта в десятеричній системі числення

3.1 Методика виконання

Лабораторна робота № 5, 6

Висновок

Список використаних джерел

Введення

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

Одним з яскравих прикладів цього є Програма зниження інформаційного нерівності в Республіці Казахстан на 2007-2009 роки розроблена з метою реалізації Указу Президента Республіки Казахстан від 10 листопада 2004 року N 1471 "Про Державну програму формування" електронного уряду "в Республіці Казахстан на 2005-2007 роки ".

Концепцією постіндустріального суспільства є інформаційне суспільство - нова історична фаза розвитку цивілізації, в якій головними продуктами виробництва є інформація і знання. Відмінними рисами інформаційного суспільства є:

збільшення ролі інформації і знань в житті суспільства;

зростання частки інформаційних комунікацій, продуктів і послуг у валовому внутрішньому продукті;

створення глобального інформаційного простору, що забезпечує:

а) ефективне інформаційну взаємодію людей;

б) їх доступ до світових інформаційних ресурсів;

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

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

Реалізація завдань "Програми зниження інформаційного нерівності в Республіці Казахстан" забезпечується виконанням наступних заходів ... "Методичне забезпечення процесу навчання населення комп'ютерної грамотності за дистанційною і очній формами навчання".

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

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

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

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

1) Сучасна напівпровідникова та інтегральна елементна база дуже чутлива до перегріву, перенапруги, статичної електрики, має мініатюрні розміри і тому вимагає складної, дорогої технологічної оснастки для реальної роботи з сучасними електронними схемами. Використання шкідливих хімічних речовин при монтажі вимагає відповідного обладнання приміщення (теж не дешевого).

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

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

4) В існуючому практикумі відсутня можливість діагностики несправності електронного пристрою, навчання навичкам ремонту електронних схем, пуско-налагоджувальних робіт, тобто тих обов'язкових навичок, якими зобов'язаний володіти електронщик при розробці та експлуатації електронної апаратури.

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

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

Одне з таких напрямків розглянуто в даній роботі - використання в лабораторному практикумі комп'ютерного моделювання на базі програмного пакету Emu8086.

У цього пакету є цілий ряд достоїнств, що привертають увагу:

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

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

Можна отримати вичерпну інформацію про процеси в даному вузлі.

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

4. Не вимагає знань з програмування. Потрібна лише знайомство з середовищем Windows. Інтуїтивний інтерфейс дозволяє швидко навіть непідготовленому користувачеві (буквально за півгодини) познайомиться з основами і приступити безпосередньо до електронних дослідженням.

5. Не можна не згадати великий, ретельно підготовлений Help, який би як контекстну допомогу по меню, компонентів, опціям моделювання, так і загальні питання моделювання, можливі помилки.

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

До теперішнього часу, студенти виконували лабораторні роботи на Лабораторній установці, яка складається з навчального мікропроцесорного комплекту / УМК /, що випускається ризьким заводом "ВЕФ", набору модулів, що підключаються до її системної шині і різних периферійних пристроїв УМК є навчальну мікро-ЕОМ, призначену для вивчення програмування, проектування і налаштування мікропроцесорних пристроїв і систем, виконаних на МП KP580.

Як вже зрозуміло, ризький завод "ВЕФ", вже знаходитися в іншій державі, морально і фізично застарів (вже не випускається). Мікропроцесор МП KP580В вже давно знятий з виробництва, не випускається, весь світ давно перейшов на мікропроцесори фірми Intel, AMD, Motorolla і т.д.

Останні п'ять років - лабораторний практикум виконувався на емуляторі МП086, але він був виконаний під операційну систему ДОС, ще сучасні операційні системи підтримують емуляцію ДОС, але наступні ОС перестають підтримувати ДОС.

Тому виникла потреба вибору програмного продукту, що працює під Windows.

До того ж, необхідної літератури не є, знайшов посилання, але вони тільки в загальному розповідають про роботу емулятора Emu8086. Це свого роду - перша робота про даний продукт. Може застосовуватися для проведення лабораторних робіт з дисципліни "Основи мікропроцесорної техніки", "Організація ЕОМ" і т.д.

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

1. Віртуальний лабораторний практикум в інженерній освіті

У навчальних планах Казахської академії транспорту і комунікацій ім. Тинишпаева (КазАТК) час, що відводиться під лабораторний практикум, становить 15-25% від загального обсягу аудиторних занять. Приблизно такий же за кількістю годин (15-27%) лабораторний практикум передбачений і в навчальних планах Алматинському енергетичного. Дані цифри свідчать, що в інженерній освіті лабораторний практикум є важливим елементом, без якого немислима підготовка повноцінного спеціаліста.

Розвиток інформаційних технологій привів до появи поняття "віртуальний лабораторний практикум" (ВЛП), в основі якого лежить імітаційне комп'ютерне моделювання. Основні способи використання ВЛП в навчальному процесі:

в якості комп'ютерного "тренажера" для підготовки до виконання практикуму в реальному лабораторії (при цьому програми комп'ютерного та фізичного експериментів, як правило, однакові);

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

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

Якщо ВЛП використовується як доповнення до реального практикуму, то він повинен бути орієнтований на проведення досліджень підвищеного рівня складності або досліджень, що вимагають дорогого обладнання, яким не має в своєму розпорядженні університет.

За технологіями створення ВЛП можна виділити наступні основні варіанти.

1. ВЛП на основі універсальних пакетів програм, що забезпечують можливість застосування в широкому спектрі предметних областей. Прикладом може служити система LabVIEW фірми National Instruments. Універсальні пакети містять великі бібліотеки елементів, призначених для розробки віртуальних інтерфейсів фізичних приладів і лабораторних установок.

2. ВЛП на основі спеціалізованих предметно-орієнтованих пакетів програм, призначених для порівняно обмеженого набору предметних областей. В якості прикладу відзначимо систему Multisim фірми Electronics Workbench, створену для моделювання електронних схем, систему ChemOffice фірми CambridgeSoft, призначену для моделювання та аналізу хімічних процесів і т.п. Так само як і в попередньому випадку, програмне забезпечення даного класу представляє собою універсальну середу, призначену для вирішення прикладних завдань користувача.

3. ВЛП на основі Java-аплетів. На відміну від попередніх випадків, де користувач (викладач) зазвичай працює в режимі графічного програмування, процес створення Java-аплетів є набагато більш трудомістким і вимагає програмування в кодах. Тим не менш, дана технологія має і певні переваги, особливо коли мова заходить про ВЛП, призначеному для мережевого застосування. Так, наприклад, додатки, створювані в системі LabVIEW, займають приблизно 2,5-3 Мбайт пам'яті, а типовий розмір віртуальної лабораторної роботи на основі Java-аплета - десятки-сотні кілобайт.

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

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

Тим не менш, будь-який, навіть як завгодно висококласний ВЛП, в більшості випадків не замінить за своїм обучающему впливу, який чиниться на студента, роботу з реальним обладнанням.

Це усвідомлюють і самі студенти, що підтверджується результатами анкетування, що проводилося на кафедрі АТС КазАТК в рамках педагогічного експерименту з апробації ВЛП з дисципліни "Схемотехніка аналогових електронних пристроїв". У цілому, давши позитивну оцінку новому ВЛП (84% опитаних), 54% студентів, що брали участь в опитуванні, відповіли, що вважають роботу з реальним лабораторним обладнанням більш корисною в порівнянні з віртуальними лабораторними роботами.

1.1 Особливості лабораторного практикуму для природничих дисциплін

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

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

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

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

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

Розрізняють такі види навчального експерименту:

Демонстраційний експеримент. (Проводиться під час пояснення для ілюстрації законів і явищ та їх застосування, демонстрації принципів дії технічних установок, а також для знайомства учнів з фундаментальними дослідами. Готується і виконується тільки викладачем).

Фронтальні лабораторні роботи, досліди і спостереження. (Виконуються на уроці всіма учнями одночасно на однотипному обладнанні, під безпосереднім керівництвом викладача).

Практикум. (Є формою самостійної роботи учнів, готується учнями заздалегідь і виконується за письмової інструкції).

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

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

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

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

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

Крім того, з'являється можливість продемонструвати досліди, які неможливо провести в умовах навчального кабінету.

Відзначимо характерні особливості комп'ютерного експерименту.

Формою роботи є діалог учня з комп'ютером. При цьому у функції комп'ютера входить:

Реалізація програмними засобами моделі досліджуваного об'єкта, установки, процесу або ситуації

Імітація засобів вимірювання і виконання рутинної частини обробки вимірів.

Оцінка дій учня.

Функції учня (дещо відрізняються від його функцій у традиційному експерименті):

Аналіз інформації, яку програма видає на екран дисплея.

Вибір умов експерименту.

Проведення серій експериментів для досягнення мети, сформульованої на початку роботи.

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

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

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

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

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

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

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

1.2 Роль технології віртуальних приладів навчання в технічному вузі

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

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

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

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

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

Техніко-економічні оцінки показують, що робоче місце, що включає мінімальний типовий набір традиційних вимірювальних приладів (осцилограф, імпульсний і низькочастотний генератори, частотомір, цифровий тестер), за поточними каталогам цін обходиться в три рази дорожче в порівнянні з витратами на віртуальний еквівалент, включаючи придбання сучасної персональної ЕОМ типу Pentium IV.

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

Так, оціночні розрахунки, проведені для загальнотехнічної кафедри, показують, що для повної модернізації приладового обладнання п'яти навчальних лабораторій, в кожній з яких організовано за 5 робочих місць, необхідно затратити близько 8,0 млн. тг. (Ціни на 2006 р), якщо модернізацію здійснювати традиційне покупкою необхідних "реальних" приладів.

При використанні технології віртуальних приладів, з урахуванням вже наявних на кафедрі комп'ютерів, модернізація обійдеться приблизно в 8 разів дешевше - в 1 000 млн. тг. Останні цифри вже прийнятні і підйомні, особливо при поетапному підході до модернізації.

Наприклад, при щорічному вкладенні по 400 тис. тг, повне переоснащення лабораторій можна завершити протягом 2.5-3 років.

2. Програмний емулятор (віртуальний ПК) Emu8086

Все для вивчення асемблера в одному пакеті! Emu8086 поєднує в собі потужний редактор вихідного коду, асемблер, дізассемблер, програмний емулятор (віртуальний ПК) з відладчиком і поетапне навчання.

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

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

Арифметико-логічний пристрій (АЛП) показує внутрішню роботу центрального процесора (CPU).

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

Машинний код 8086 повністю сумісний з усіма послідували за ним поколіннями мікропроцесорів Intel, включаючи Pentium II і Pentium 4, і я впевнений, що Pentium 5 буде також підтримувати команди 8086. Це робить код 8086 дуже привабливим, тому що він виконується як на старих, так і на сучасних комп'ютерних системах. Іншою перевагою є те, що набір команд 8086 порівняно невеликий, і тому вивчити його буде легше.

Emu8086 має легший синтаксис, ніж будь-які інші асемблери, але буде генерувати програму, яка зможе бути виконана на будь-якому комп'ютері, що підтримує машинний код 8086. Це великий плюс для початківців! Примітка: Якщо ви не використовуєте Emu8086 для компіляції коду, ви не зможете виконати ваш вихідний код в покроковому режимі.

Примітка: Якщо при спробі запустити вашу програму, вам видаються повідомлення про те, що ті чи інші команди не підтримуються, то ви не зможете виконати цю програму в отладочном режимі. Однак її можна просто відкомпілювати і запустити звичайним чином (не під управлінням Emu8086).

Як розпочати?

Запустіть Emu8086, вибравши її піктограму в меню "Пуск", або безпосередньо запустіть додаток Emu8086. exe.

Виберіть "Samples (приклади)" з меню "File".

Натисніть кнопку [Compile and Emulate] (або натисніть клавішу F5).

Натисніть кнопку [Single Step] (покроковий режим) (або натисніть клавішу F8), і спостерігайте за виконанням коду.

Спробуйте відкрити інші приклади. Всі приклади мають докладні коментарі, так що для навчання вони вельми корисні.

2.1 Використання емулятора Emu8086

Надрукуйте ваш код всередині текстової області, і після клацання кнопки [Compile]. Вас запитають про місце, де зберегти компільований файл.

Після успішної компіляції Ви можете клацати кнопку [Emulate], щоб завантажити компільований файл в емуляторі.

Якщо Ви хочете завантажити ваш код в емулятор, тільки клацніть кнопку "Emulate".

Але Ви також можете використовувати емулятор, щоб завантажити executables, навіть якщо Ви не маєте початкового вихідного тексту. Виберіть "Show Emulator", меню "Emulator".

Спроба, завантажувати файли від папки "MyBuild". Якщо немає ніяких файлів в "MyBuild" папці, повертають вихідного редактору, вибирають Samples від меню File, завантажують будь-який зразок, вибирають і потім завантажуються в емулятор.

2) провести дослідження області пам'яті згідно варіанту завдання. У результаті дослідження необхідно заповнити табл.1.1;

У пам'яті перераховують перший рядок - зсув, другий рядок - значення hexadecimal, третій рядок - десяткове значення, і останній рядок - значення символу ASCII.

Кнопка [Single Step] виконує команди, один за одним зупиняють після кожної команди.

[Run] кнопка виконує команди один за одним з затримкою, встановленої затримкою кроку між командами.

Двічі клацніть на текстових полях регістра, відкривається вікно "Extended Viewer" зі значенням того регістра, перетвореного до всіх можливих формах. Ви можете змінювати значення регістра безпосередньо в цьому вікні.

Двічі клацніть на елементі списку пам'яті, відкривається "Extended Viewer" зі значенням WORD, завантаженим зі списку пам'яті у вибраному місцезнаходженні. Менш суттєвий байт - у молодшому адресу: LOW BYTE завантажений від обраної позиції і HIGH BYTE від наступного адреси пам'яті. Ви можете змінювати значення слова пам'яті безпосередньо у вікні "Extended Viewer",

Ви можете змінювати значення регістрів в часі виконання, друкуючи за існуючими значень.

Кнопка [Flags] дозволяє Вам розглядати і змінювати прапорці на часі виконання.

2.2 Компіляція коду Асемблера

Надрукуйте ваш код всередині тексту та натисніть кнопку [Compile]. Вас запитають, де зберегти відкомпільований файл. Після завершення компіляції ви можете натиснути кнопку [Emulate] для завантаження відкомпільованого файлу в емулятор.

Директиви, що визначають тип виконуваного файлу:

# MAKE_COM #

# MAKE_BIN #

# MAKE_BOOT #

# MAKE_EXE #

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

Опис типів здійснимих файлів:

# MAKE_COM # - самий старий і самий простий формат виконуваного файлу. Такі файли завантажуються з префіксом 100h (256 байтів). Виберіть СОМ Template з меню New, якщо ви плануєте компілювати COM-файл. Директива компілятора ORG 100h повинна бути додана перед кодом. Виконання завжди починається з першого байта файлу. Підтримується командним рядком DOS і Windows.

# MAKE_EXE # - більш "просунутий" формат виконуваного файлу. Не обмежені розмір і кількість сегментів. Сегмент стека повинен бути визначений в програмі. Ви можете вибрати EXE Template з меню New для створення простої ЕХЕ-програми з певними сегментмамі Даних, Стека і Коду. Точка входу (де починається виконання) визначається програмістом. Підтримується командним рядком DOS і Windows.

# MAKE_BIN # - простий здійснимих файл. Ви можете визначити значення всіх регістрів, сегмент і зсув для області пам'яті, куди цей файл буде завантажений. Якщо завантажити файл "MY. BIN" в емулятор, він буде видний для файлу - "MY. BINF" і завантажиться файл "MY. BIN" до розташування, визначене в файлі "MY. BINF". Регістри також встановляться з урахуванням інформації з цього файлу (відкрийте цей файл у редакторі для зміни або вивчення). У тому випадку, якщо емулятор не знайде файл "MY. BINF", буде використовуватися поточні значення регістрів і файл "MY. BIN" завантажиться в поточний CS: IP.

Виконання починається зі значення в CS: IP.

Цей тип файлу унікальний для Emu8086.

Файл ". BINF створюється автоматично компілятором, якщо він знаходить директиву # MAKE_BIN #.

Обережно! якщо файл ". binf" існує, то він буде перезаписаний!

Значення повинні бути шістнадцяткові! Якщо ці значення не визначені, то вони встановлюються за замовчуванням:

LOAD_SEGMENT = 0100 LOAD_OFFSET = 0000 CS = ES = SS = DS = 0100 IP = 0000 Якщо LOAD_SEGMENT і LOAD_OFFSET не визначені, то використовуються значення CS і IP, і навпаки.

Якщо значення Load to offset не дорівнює нулю (0000), то ORG???? h повинна бути додана в файл. BIN, де???? h - це зміщення для завантаження. Це має бути зроблено для того, щоб компілятор міг обчислити правильні адреси.

# MAKE_BOOT # - ця директива копіює першу доріжку дискети (завантажувальний сектор).

Ви можете записати завантажувальний сектор віртуального дисковода (FLOPPY_0) через меню емулятора:

[Virtual Drive] -> [Write 512 bytes at 7C00 to Boot Sector] Спочатку ви повинні відкомпілювати ". Boot"-файл, а потім завантажити його в емулятор (див. "micro-os_loader. Asm" і "micro-os_kernel. Asm "в розділі "Samples").

Потім виберіть у меню [Virtual Drive] -> [Boot from Floppy], щоб завантажити емулятор з віртуального дисковода.

Потім, якщо вам цікаво, ви можете записати віртуальну дискету на реальну дискету і завантажити з неї ваш комп'ютер. Я рекомендую використовувати "RawWrite for Windows" з: http://uranus. it. swin.edu. au / ~ jn / linux / rawwrite. htm (врахуйте, що "micro-os_loader. asm" не використовує MS-DOS-сумісний завантажувальний сектор, так що краще використовувати чисту дискету, хоча вона повинна бути відформатована IBM (MS-DOS)).

Директива компілятора ORG 7C00h повинна бути додана перед кодом, якщо комп'ютер починає завантажуватися з першої доріжки дискети на адресу 0000: 7C00.

Розмір. BOOT-файлу повинен бути менше 512 байтів (обмежений розміром сектора дискети).

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

Обробка помилок

Компілятор виводить звіт про помилки в окремому вікні:

MOV DS, 100 - це неприпустима команда, тому що в сегментний регістр не можна встановлювати безпосереднє значення - повинні використовуватися регістри загального призначення:

MOV AX, 100 MOV DS, AX MOV AL, 300 - це неприпустима команда, т.к регістр AL має тільки 8 бітів, і його максимальне значення 255 (або 11111111b), а мінімальне - 128.

Компілятор робить кілька проходів перед генерацією правильного машинного коду. Якщо він знаходить помилку і не виконує необхідну кількість проходів, він може видати неправильне повідомлення про помилку. Наприклад:

# Make_COM #

ORG 100h

MOV AX, 0

MOV CX, 5

m1: INC AX

LOOP m1; це не справжня помилка!

MOV AL, 0FFFFh; помилка тут.

RET

Список генеруються помилок:

(7) Condition Jump out of range (Умова переходу за межами діапазону)!: LOOP m1 (9) Wrong parameters (Неправільнве параметри): MOV AL, 0FFFFh (9) Operands do not match (Операнди не відповідають): Second operand is over 8 bits (Другий операнд більше 8 бітів)! Перше повідомлення (7) - неправильне. Компілятор не закінчив обчислення зміщень для міток, тому він думає, що зміщення мітки m1 - це 0000. Ця адреса лежить за межами діапазону, т.к ми починаємо зі зсуву 100h.

Внесіть виправлення в цей рядок: MOV AL, 0FFFFh (AL не може містити значення 0FFFFh). Це усуне обидві помилки! Наприклад:

# Make_COM #

ORG 100h

MOV AX, 0

MOV CX, 5

m1: INC AX

LOOP m1; той же самий код без помилок!

MOV AL, 0FFh; все!

RET

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

asm - цей файл містить оригінальний вихідний код, який був використаний для створення виконуваного файлу.

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

symbol - Таблиця символів. Вона містить інформацію, яка дозволяє відображати вікно "Variables" (Змінні). Це текстовий файл, так що ви можете подивитися його з текстового редактора.

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

2.3 Редактор вихідного коду

Використання миші Редактор підтримує такі дії миші:

Гарячі клавіші редактора:

Допустимі правила синтаксису виразів для пошуку і заміни

Якщо з'являться проблеми з редактором вихідного коду, ви можете вручну скопіювати файл "cmax20. Ocx" з каталогу, де встановлена ​​програма, в папку Windows \ System або Windows \ System32, замінивши існуючу версію цього файлу (після цього може знадобитися перезавантаження комп'ютера

2.4 Асемблер

Що таке асемблер? Асемблер - це програма, перетворює вихідний текст програми, написаної мовою асемблера, в машинний код. Додатково асемблер може створювати лістинг програми з номерами рядків, адресами змінних, операторами вихідного мови та таблицею перехресних посилань символів і змінних, які використовуються у програмі. Спільно з асемблером використовується програма, яка називається компонувальником (linker) або редактором зв'язків (linkage editor). Вона об'єднує окремі файли, створені асемблером, в єдину виконувану програму. У блок базових програм входить також відладчик (debugger) дозволяє програмісту покроково виконувати програму, перевіряти і змінювати вміст пам'яті.

Які типи програм ми будемо створювати? Ми будемо писати два основних типи програм, які перераховані нижче.

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

32-розрядні програми для захищеного режиму. Ці програми призначені для запуску у вікні текстового терміналу (консолі) чиряк операційної системи Microsoft Windows. З їх допомогою ви зможете відобразити на екрані монітора як текстові, так і графічні дані.

Як мова асемблера пов'язаний з машинним кодом? По-перше, машинний код - це набір чисел, які інтерпретуються центральним процесором комп'ютера і визначають виконувані ним дії. Наприклад, всі процесори Intel сімейства IA-32 мають сумісний між собою машинний код. Машинний код складається виключно з двійкових чисел. По-друге, мова асемблера складається з набору операторів, зрозумілих людині. Кожен оператор починається з короткого мнемонічного позначення виконуваних процесором дій, наприклад ADD (скласти), MOV (переслати), SUB (відняти) або CALL (викликати). Мова асемблера однозначно пов'язаний з машинним кодом. Це означає, що кожен оператор мови асемблера відповідає одній команді машинного коду.

Яке відношення має мова асемблера до мов високого рівня, таким як C + + або Java? Мови високого рівня, такі як C + + або Java, не мають однозначної відповідності з мовою асемблера і, отже, з машинним кодом. Наприклад, один оператор мови C + + транслюється в кілька операторів мови асемблера або кілька машинних команд. Давайте подивимося, як відбувається процес трансляції оператора мови C + + в машинний код. Оскільки аналізувати двійковий машинний код дуже важко, замість нього ми розглянемо еквівалентні оператори мови асемблера. У наведеному нижче операторі мови C + + виконуються дві арифметичні операції і отриманий результат присвоюється змінної. Припустимо, що існують цілочисельні змінні X і Y:

X = (У + 4) 3;

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

mov ЕАХ, У; Завантажити значення змінної Y в регістр ЕАХ

add eax, 4; Додати число 4 до регістру ЕАХ

mov ebx, 3; Завантажити число 3 в регістр ЕВХ

imul ebx; Помножити вміст регістра ЕАХ на вміст ЕВХ

mov Х, ЕАХ; Переслати вміст регістра ЕАХ в змінну X

З точки зору програміста регістри - це звичайні змінні, яким присвоєно стандартні імена, що знаходяться усередині центрального процесора. Зазвичай регістри використовуються в якості одного з операндів при виконанні команд процесором.

За допомогою цього прикладу ми зовсім не хотіли показати, що мова C + + "краще" чи що він потужніший мови асемблера. Нашою метою було продемонструвати, як один оператор мови високого рівня породжує кілька команд мови асемблера. Як ви вже знаєте, мова асемблера однозначно пов'язаний з машинним кодом. Останній складається з набору чисел, за допомогою яких закодовані виконуються процесором дії.

Чи є програми на мові асемблера стерпними? Важливою відмінністю мови асемблера від мов високого рівня є те, що написані на ньому програми не є стерпними. Кажуть, що мова програмування є стерпним {portable), якщо написані на ньому програми можна скомпілювати і запустити на різних комп'ютерних платформах. Наприклад, програми, написані на мові C + +, Moiyr бути скомпільовані і запущено практично на будь-якому комп'ютері і п будь-якій операційній системі за умови, що в них не використовуються виклики бібліотечних функцій, характерні для конкретної операційної системи. Основною відмінністю мови Java є те, що написані на ньому програми після компіляції можуть виконуватися в будь-комп'ютерній системі, для якої існує реалізація віртуальної машини Java.

З огляду на викладені вище моменти, мова асемблера не може бути стерпним за визначенням, оскільки він тісно пов'язаний з архітектурою процесорів певного сімейства. Таким чином, на сьогоднішній день існує декілька абсолютно різних мов асемблера. Кожен з них прив'язаний або до конкретного сімейства процесорів, або до конкретної архітектуру комп'ютера. Серед них можна виділити сімейство процесорів Motorola 68x00, Intel IA-32, SUN Sparc, VAX і IBM-370. Команди в мові асемблера відповідають командам конкретного процесора. Наприклад, мова асемблера, розглянутий у цій книзі, призначений для програмування тільки процесорів Intel, що належать сімейству 1А-32.

Навіщо вивчати мову асемблера? А якщо взяти хорошу книгу, в якій описана архітектура конкретного комп'ютера і структура його процесора? Невже вона не замінить це опис програмування мовою асемблера?

Я впевнений, що ви пов'язані з написанням програм для вбудованих комп'ютерних систем. Подібні програми зазвичай пишуть на мовах С, Java або асемблері, після чого отриманий машинний код записують в запам'ятовуючий пристрій (постійне або перепрограммируемой) мікроконтролера. Потім сам мікроконтроллер встановлюють на кероване ним пристрій. Як приклад вбудовуваних пристроїв можна навести системи живлення і запалювання автомобілів, системи управління кондиціонерами, охоронні системи, системи управління польотами, електронні записні книжки, модеми, принтери і інші "розумні" пристрої, що містять вбудований мікропроцесор.

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

Для прикладного програміста мова асемблера допоможе подолати обмеження, що накладаються використовуються ними мовою високого рівня в плані виконання певних типів операцій. Наприклад, у мові Microsoft Visual Basic обробка строкових даних виконується вкрай неефективно. Тому для виконання операцій з рядками, такими як шифрування даних і обробка бітових рядків, програмісти зазвичай використовують підпрограми, написані на мові C + + або асемблері й розмішені в DLL (Dynamic Link Libraries, або виконувані бібліотеки).

Якщо ви пов'язані з розробкою спеціалізованого обладнання, то напевно вам доведеться написати драйвер пристрою, керуючий роботою того обладнання, яке випускає ваша фірма. Драйвери пристроїв (device drivers) - це низькорівневі системні програми, безпосередньо взаємодіють з обслуговуваними ними пристроями. У завдання драйвера входить перетворення узагальнених запитів, надісланих операційною системою на конкретний пристрій, в послідовність низькорівневих команд, характерних для даного конкретного пристрою. Наприклад, виробники принтерів комплектують кожне випускається ними пристрій окремими драйверами для кожної з операційних систем, таких як Microsoft Windows, Mac OS, Linux і ін

Чи існують які-небудь правила у мові асемблера? Так, звичайно, у мові асемблера прийнято кілька правил, зумовлені внутрішньої фізичною структурою самого процесора і його системою команд. Наприклад, два операнди, використовувані в одній команді, повинні мати однаковий розмір. Тим не менш, у мові асемблера набагато менше правил, що, наприклад, нд + +.

У програмах на мові асемблера можна легко обійти будь-які обмеження, прийняті в мовах високого рівня. Наприклад, в мові C + + не дозволяється присвоювати значення покажчика одного типу вказівником іншого типу. Як правило, в цьому обмеження немає нічого поганого, оскільки воно дозволяє уникнути логічних помилок у програмах.

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

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

Лабораторна робота № 1

Ознайомлення з роботою емулятора Emu8086

Мета роботи: ознайомлення зі структурою навчальної мікроЕОМ (емулятора Emu8086), органами управління та режимами її роботи.

1. Короткі теоретичні відомості

1.1 Структура ассемблерной програми

Кожна мова програмування має свої особливості. Мова асемблера - не виняток. Традиційно перша програма виводить вітальне повідомлення на екран 'Hello World'.

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

Мова асемблера є РЕГИСТРОНЕЧУВСТВИТЕЛЬНЫМ.Т. е. в більшості випадків немає різниці між великими та малими буквами. Команда може бути ДИРЕКТИВОЮ - вказівкою транслятору. Вони виконуються в процесі перетворення програми в машинний код. Багато директиви починаються з точки. Для зручності читання програми вони звичайно пишуться ВЕЛИКИМИ ЛІТЕРАМИ. Крім директив ще бувають ІНСТРУКЦІЇ - команди процесора. Саме вони і будуть складати машинний код програми.

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

1.2 Особливості створення ассемблерной програми в середовищі DOS засобами TASM і MASM

Мова асемблера є самим низькорівневим мовою программірованія.Т. е. він ближче будь-яких інших наближений до архітектури ЕОМ та її апаратним можливостям, дозволяючи отримати до них повний доступ. На відміну від мов високого рівня (МВР) ассемблерних програма містить тільки той код, який ВВІВ ПРОГРАММИСТ. Ніяких додаткових "обв'язок". Вся відповідальність за "логічність" коду ПОВНІСТЮ лежить на вузьких плечах ПРОГРАМІСТА.

Простий приклад. Зазвичай підпрограми закінчуються командою повернення. Якщо її не поставити явно, транслятор все одно додасть її в кінець підпрограми. Ассемблерние підпрограма без команди повернення НЕ ПОВЕРНЕТЬСЯ в точку виклику, а буде виконувати код, наступний за підпрограмою, як-ніби він є її продовженням. Ще приклад. Можна спробувати "виконати" дані замість коду. Часто це позбавлено сенсу. Але якщо програміст це зробить, транслятор промовчить. Мова асемблера дозволяє робити все! Тут немає НІЯКИХ обмежень. Але з іншого боку це часто є джерелом помилок.

Ці особливості призводять до того, що асемблерні програми часто "підвішують" комп'ютер, особливо у початківців програмістів.

Виділимо три різновиди "зависання" за способом боротьби з ним.

Просте - для виходу з нього досить натиснути Ctrl + Break або Ctrl + C (спочатку натискається клавіша Ctrl і, не відпускаючи її, натискається другому клавіша - C або Break; відпускаються у зворотному порядку). Програма при цьому аварійно завершується виходом в DOS.

М'яке - машина не реагує на Ctrl + Break, але клавіатура "дихає". Т. тобто при натисканні на клавіші, типу NumLock, моргають відповідні світлодіоди. У цьому випадку машину потрібно буде перевантажити, натиснувши Ctrl + Alt + Del. У середовищі Windows потрібно просто "убити" сеанс, закривши вікно.

Жорстке - машина ніяк не реагує на клавіатуру і не сприймає комбінацію Ctrl + Alt + Del. У цьому випадку допоможе апаратний скидання за допомогою кнопки "Reset", розташованої на передній панелі системного блоку. Не потрібно вимикати і включати ЕОМ. Ви як майбутні розробники апаратури повинні знати, що вона виходить з ладу в основному при включенні і виключенні.

1.3 Процес обробки програми на мові асемблера

Через свою специфіку, а також за традицією, для програмування на мові асемблера немає ніяких середовищ-оболонок типу Turbo C, Turbo Pascal і т.д. Тут доводиться користуватися "утилітами командних рядків", як 30 років тому. Весь процес технічного створення ассемблерной програми можна розбити на 4 кроки (виключені етапи створення алгоритму, вибору структур даних і т.д.).

Набір програми в текстовому редакторі і зберегти її у окремому файлі. Кожен файл має ім'я і тип, званий іноді розширенням. Тип в основному використовується для визначення призначення файлу. Наприклад, програма на C має тип C, на Pascal - PAS, на мові асемблера - ASM.

Обробка тексту програми транслятором. На цьому етапі текст перетворюється в машинний код, званий об'єктним. Крім того, є можливість отримати лістинг програми, у якому крім тексту програми різну додаткову інформацію і таблиці, створені транслятором. Тип об'єктного файлу - OBJ, файлу лістингу - LST. Цей етап називається трансляцією.

Обробка отриманого об'єктного коду компонувальником. Тут програма "прив'язується" до конкретних умов виконання на ЕОМ. Отриманий машинний код називається виконуваним. Крім того, зазвичай виходить карта завантаження програми в ОЗУ. Виконуваний файл має тип EXE, карта завантаження - MAP. Цей етап називається компонування або компонування.

Запуск програми. Якщо програма працює не зовсім коректно, перед цим може бути присутнім етапі налагодження програми за допомогою спеціальної програми - отладчика. При знаходженні помилки доводиться проводити корекцію програми, повертаючись до кроку 1. Таким чином, процес створення ассемблерной програми можна зобразити у вигляді такої схеми. Кінцевою метою, нагадаємо, є працездатний виконуваний файл HELLO. EXE.

1.4 Особливості створення ассемблерной програми в середовищі емулятора EMU8086

Цей програмний продукт містить все необхідне для створення програми на мові Assembler.

Пакет Emu8086 поєднує в собі просунутий текстовий редактор, assembler, disassembler, емулятор програмного забезпечення (Віртуальну машину) з покроковим відладчиком, приклади.

У процесі виконання програми ми можемо спостерігати програмні регістри, прапори і пам'ять, АЛУ показує роботу центрального процесора.

Вбудована віртуальна машина повністю блокує звернення програми до реальних апаратних засобів ЕОМ, накопичувачів пам'яті, це робить процес налагодження набагато легшою

1.5 Правила оформлення ассемблерних програм

При наборі програм мовою асемблера дотримуйтеся наступних правил:

директиви набирайте великими літерами, інструкції - малими;

пишіть текст широко - не скупердяйнічайте;

не виходьте за край екрану, тобто не робіть текст ширше 80 знаків - його не зручно буде редагувати і друкувати;

для відступів користуйтеся табуляцією (клавіша TAB);

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

<TAB> <TAB> Mov <TAB> ax, <пробіл> bx <(1-3) TAB>; <пробіл> текст коментаря

Кількість табуляцій перед коментарем визначається довжиною аргументів команди і може бути від 1 до 3. Після знайомства із синтаксисом мови будуть приводитися додаткові правила.

2. Завдання для виконання

2.1 Запустити емулятор EMU8086.

2.2 Користуючись правилами оформлення ассемблерних програм, виправте слова "Please Register." на будь-які сподобалися (Не забудьте вкласти їх у апострофи).

2.3 Запустіть програму, натиснувши кнопку 'Emulate' або клавішу F5.

2.4 Запустіть отриманий код на виконання, використовуючи кнопку "RUN" або натисніть функціональну клавішу F9.

2.5 Відкомпілюйте програму. Поверніться до головного вікна форми, попередньо закривши всі відкриті вікна, далі натисніть кнопку "Compile".

2.6 Отриманий com-файл запустіть у вбудованій командному рядку WINDOWS 98 на виконання або запустіть сеанс dos в total commander'e.

2.7 Поекспериментуйте з іншими прикладами які відкриваються при натискання клавіші "Samples" у головному вікні емулятора.

2.8 Ознайомитеся з вбудованою в емулятор EMU8086 довідкою. У ній міститься вся необхідна інформація для роботи з програмою, ази написання програм на мові assembler та ін

3. Контрольні питання

3.1 Які основні відмінності ассемблерних програм від ЯВУ?

3.2 Яка структура ассемблерной програми?

3.3 У чому відмінність інструкції від директиви?

3.4 Які правила оформлення програм на мові асемблера?

3.5 Які етапи отримання виконуваного файлу?

3.6. Для чого потрібен етап налагодження програми?

3.7. Опишіть основні моменти створення виконуваного файлу і емуляції роботи програми?

3.8. Які кроки технічного створення ассемблерной програми в програмах TASM і MASM?

3.9 Основні можливості емулятора EMU8086?

3.10 Методи боротьби з зависанням в DOS'e?

Лабораторна робота № 2

РОЗРОБКА ПЕРШОЇ програми мовою асемблера

Мета роботи: Ознайомлення зі структурою ассемблерной програми, створення першої програми на мові асемблера.

Структура ассемблерной програми

Щоб програма виконалася будь-якої ОС, вона повинна бути скомпільована в здійснимих файл. Основні два формати здійснимих файлів в DOS - СОМ і ЕХЕ.

Файли типу СОМ містять тільки скомпільований код без будь-якої додаткової інформації про програму Весь код, дані і стек такий покладаються в одному сегменті і не можуть перевищувати 64 Кб.


. model tiny


. code


org 100h


begin:


mov ah, 9


mov dx, offset message


int 21h


ret


message db "Привіт", 0dh, 0ah, '$'


end begin

Розглянемо вихідний текст програми, щоб зрозуміти, як вона працює.

Перший рядок визначає модель пам'яті TINY, в якій сегменти коду, даних і стека об'єднані. Ця модель призначена для створення файлів типу СОМ.

У DOS для формування адреси використовується сегмент і зсув. Для формування адреси рядка "ПРИВІТ" використовується пара регістрів DS (сегмент) і DX (усунення). При завантаженні *. com-програми в пам'ять, усі сегментні регістри приймають значення рівне тому сегменту, в який завантажилася наша програма (в т. ч. і DS). Тому немає необхідності завантажувати в DS сегмент рядка (він вже завантажений).

Директива. CODE починає сегмент коду, що у нашому випадку також повинен містити і дані.

ORG 100h встановлює значення програмного лічильника (IP) в 100h, тому що при завантаженні СОМ-файлу в пам'ять DOS займає перші 256 байт (100h) блоком даних PSP і має в своєму розпорядженні код програми тільки після цього блоку. Усі програми, які компілюються у файли типу СОМ, повинні починатися з цієї директиви.

Мітка BEGIN: розташовується перед першою командою в програмі і буде використовуватися в директиві END (Begin - англ. Початок; end - кінець), щоб вказати, з якої команди починається програма.

Взагалі замість слова BEGIN можна було б використовувати що-небудь інше. Наприклад, START:. У такому разі, нам довелося б і завершувати програму END START.

Рядки (5) - (7) виводять на екран повідомлення "ПРИВІТ".

Розглянемо коротенько про регістрах процесора.

Регістр процесора - це спеціально відведена пам'ять для зберігання якого-небудь числа.

Наприклад:

Якщо ми хочемо скласти два числа, то в математиці запишемо так:

A = 5

B = 8

C = A + B.

A, B і C - це свого роду регістри (якщо говорити про комп'ютер), в яких можуть зберігається деякі дані. А = 5 можна прочитати як: Надаємо А число 5.

Для присвоєння регістру якого-небудь значення, в Асемблері існує оператор mov (від англ. Move - завантажити). Команда MOV АН, 9 поміщає число 9 в регістр АН - номер функції DOS "висновок рядка".

Команда MOV DX, OFFSET MESSAGE поміщає в регістр DX зсув мітки MESSAGE щодо початку сегменту даних, який в нашому випадку збігається з сегментом коду.

OFFSET (по-англійськи - це зміщення). Коли, при збирання, Асемблер дійде до цього рядка, він замінить OFFSET MESSAGE на АДРЕСА (зсув) цього рядка в пам'яті. Якщо ми запишемо OFFSET MESSAGE (хоча, правильніше буде MOV DX, WORD OFFSET MESSAGE), то в DX завантажиться не адресу (усунення), а перші два символи нашої рядка (в даному випадку "Пр"). Так як DX - шiстнадцятирозрядного регістр, в нього можна завантажити лише два байти (один символ завжди один байт).

Команда INT 21 H викликає системну функцію DOS (int від англ. Interrupt - переривання). Можна замінити рядок INT 21H на INT 33, програма буде працювати коректно. Проте в Асемблері прийнято вказувати номер переривання в шістнадцятковій системі.

Переривання MS-DOS - це свого роду підпрограма (частина MS-DOS), яка знаходиться постійно в пам'яті і може викликати у будь-який час з будь-якої програми.

Ця команда - основний засіб взаємодії програм з операційною системою. У прикладі викликається функція DOS номер 9 - вивести рядок на екран. Ця функція виводить рядок від початку, адреса якого задається в регістрах DS: DX, до першого зустрічного символу $. При запуску СОМ-файлу регістр DS автоматично завантажується сегментним адресою програми, а регістр DX був підготовлений попередньою командою.

Розглянемо вищесказане на прикладі (дрібним шрифтом виділимо примітки):

Програма складання двох чисел

Початок програми

A = 5 в змінну A заносимо значення 5

B = 8 в змінну B значення 8

Виклик підпрограми Додавання

зараз З дорівнює 13

A = 10 теж саме, тільки інші числа

B = 25

Виклик підпрограми Додавання

зараз З одно 35

Кінець Програми

...

Підпрограма Додавання

C = A + B

Повернення з підпрограми повертаємося в те місце, звідки викликали

Кінець підпрограми

У даному прикладі ми двічі викликали підпрограму Складання, яка склала два числа, передані їй у змінних A і B. Результат поміщається в змінну С. Коли викликається підпрограма, комп'ютер запам'ятовує з якого місця вона була викликана, а потім, коли закінчила роботу підпрограма, комп'ютер повертається в те місце, звідки вона викликалася. Т.ч. можна викликати підпрограми невизначену кількість разів з будь-якого місця.

Команда RET користується зазвичай для повернення з процедури. DOS викликається COM-програми так, що команда RET коректно завершує програму.

DOS при виклику СОМ-файлу поміщає в стек сегментний адресу програми і нуль, так що RET передає управління на нульовий адресу поточного сегмента, тобто на перший байт PSP. Там знаходиться код команди INT 20 H, яка і використовується для повернення управління в DOS. Можна відразу закінчувати програму командою INT 20h, хоча це довшим на 1 байт.

Наступний рядок прикладу визначає рядок даних, що містить текст "ПРИВІТ" керуючий символ ASCII повернення каретки з кодом ODh, керуючий символ ASCII переклад рядка з кодом 0Ah і символ $ завершальний рядок (якщо ми його приберемо, то 21h переривання продовжить вивід до тих пір, поки не зустрінеться де-небудь у пам'яті символ $, на екрані ми побачимо "сміття). Перше слово (message - повідомлення) - назва повідомлення. Воно може бути будь-яким (наприклад, mess або string і пр).

Керуючі символи (ODh і 0Ah) переводять курсор на першу позицію наступного рядка.

Директива END завершує програму, одночасно вказуючи, з якою мітки повинно починатися її виконання.

В якості додаткового прикладу створимо ще один рядок, яку назвемо message1. Потім, починаючи з рядка (9) вставимо наступні команди і скомпіліруем програму заново.

9

mov dx, offset message1

10

int 21h

11

int 20h

12

message db "Привіт", 0dh, 0ah, '$'

13

message1 db "Група", 0dh, 0ah, '$'

14

end begin

2. Завдання для виконання

2.1 Запустити емулятор EMU8086.

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

2.3 Відкомпілюйте приклад № 2;

2.4 Поверніться до головного вікна форми, попередньо закривши всі відкриті вікна, далі натисніть кнопку "Compile".

2.5 Отриманий com-файл запустіть в сеансі dos.

2.6 Створіть на мови Pascal програму що виводить на екран слово "Привіт" і порівняйте розміри одержуваних файлів (Pascal і Assembler).

3. Контрольні питання

3.1 Характеристика структури файлу типу *. com?

3.2 Яка структура ассемблерной програми?

3.3 З якою метою в код програми на асемблері для DOS вводиться рядок ORG 100h?

3.4 Призначення команди MOV?

3.5 Переривання 21h і 20h. Призначення?

3.6 Сутність і доцільність використання команди RET замість переривання 20h?

3.6. Символ '$' методика застосування?

3.7. Зв'язка "BEGIN: - END BEGIN". Правила застосування?

ЛАБОРАТОРНА РОБОТА № 3

СТРУКТУРА Здійснимих файли ТИПУ *. EXE.

Прості арифметичні дії на мові Асемблер

Мета роботи: Вивчення принципів складання найпростіших *. exe програм. Вивчення прийомів роботи з найпростішими операторами арифметичних дій.

Короткі теоретичні відомості (програма типу *. ЕХЕ).

Файли типу ЕХЕ містять заголовок, в якому описується розмір файлу, необхідний обсяг пам'яті, список команд у програмі, що використовують абсолютні адреси, які залежать від розташування програми в пам'яті, і т.д. ЕХЕ-файл може мати будь-який розмір. Формат ЕХЕ також використовується для здійснимих файлів у різних версіях DOS-розширювачів і Windows, але зі значними змінами.

Операційна система DOS не використовує розширення для визначення типу файлу. Перші два байти заголовка ЕХЕ-файла - символи "MZ" або "ZM", і якщо файл починається з цих символів і довше деякого порогового значення, різного для різних версій DOS, він завантажується як ЕХЕ, якщо немає - як СОМ.

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

Простий приклад ЕХЕ-файла:

. model small

; Сегмент стека розміром в 256 байт


. stack 100h

; Сегмент стека розміром в 256 байт

. code

; Сегмент коду, який містить і дані.

Begin:

; Мітка початку коду програми

mov ax, @ data;

; Сегментний адреса рядка message поміщається в DS

mov ds, ax


mov dx, offset string

поміщає в регістр DX зсув мітки String щодо початку сегменту даних

mov ah, 9

; Поміщаємо номер функції DOS "висновок рядка (9)" в регістр АН.

int 21h

; Функція DOS "висновок рядка"

mov ax, 4C00h

; Завершення програми типу - exe

int 21h

; Функція DOS "завершити програму"

. data

; Початок сегмента даних

string db "Privet", 0Dh, 0Ah, '$'

; Дані для з містить виводяться дані.

end begin

; Мітка закінчення коду програми

У прикладі визначаються три сегменти - сегмент стека директивою. STACK розміром в 256 байт, сегмент коду, що починається з директиви. CODE, і сегмент даних, що починається з. DATA. При запуску ЕХE-програми регістр DS вже не містить адреси сегмента з рядком string (він вказує на сегмент, що містить блок даних PSP), а для виклику використовуваної функції DOS цей регістр повинен мати сегментний адреса рядка. Команда MOV AX, @ DATA завантажує в АХ сегментний адресу групи сегментів даних @ DATA, a MOV DS, AX копіює його в DS. Програми типу ЕХЕ повинні завершуватися системним викликом DOS 4Ch: в регістр АН поміщається значення 4Ch, в регістр AL міститься код повернення (в даному прикладі код повернення 0 і регістри АН і AL завантажуються однією командою MOV AX, 4C00h), після чого викликається переривання 21h.

Прості арифметичні оператори.

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

2.1 Додавання.

Команда ADD (Addition - додавання (гол. to add - скласти)) здійснює складання першого і другого операндів. Початкове значення першого операнда (приймача) втрачається, заміщаючи результатом складання. Другий операнд не змінюється. Як перший операнд команди ADD можна вказувати регістр (крім сегментного) або елемент пам'яті, як другий - регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте не допускається визначати обидва операнди одночасно як елементи пам'яті. Операнди можуть бути байтами або словами і представляти числа із знаком або без знаку. Команду ADD можна використовувати для складання як звичайних цілих чисел, так і двійково-десяткових (з використанням регістра АХ для зберігання результату). Команда впливає на прапори OF, SF, ZF, AF, PF і CF.

Команда

Призначення

Процесор

ADD приймач, джерело

Додавання

8086

Приклади:

mov al, 10 - -> завантажуємо в регістр AL число 10

add al, 15 - -> al = 25; al - приймач, 15 - джерело

mov ax, 25000 - -> завантажуємо в регістр AX число 25000

add ax, 10000 - -> ax = 35000; ax - приймач, 10000 - джерело

mov cx, 200 - -> завантажуємо в регістр CX числа 200

mov bx, 760 - -> а в регістр BX - 760

add cx, bx - -> cx = 960, bx = 760 (bx не змінюється); cx - приймач, bx - джерело

2.2 Вирахування.

Команда SUB (Subtraction - віднімання) віднімає другий операнд (джерело) з першого (приймача) і поміщає результат на місце першого операнда. Початкове значення першого операнда (зменшуване) втрачається. Таким чином, якщо команду вирахування записати в загальному вигляді

SUB операнд1, операнд2

то її дію можна умовно зобразити наступним чином:

операнд1 - операнд2 -> операнд1

Як перший операнд можна вказувати регістр (крім сегментного) або елемент пам'яті, як другий - регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте не допускається визначати обидва операнди одночасно як елементи пам'яті. Операнди можуть бути байтами або словами і представляти числа із знаком або без знаку. Команда впливає на прапори OF, SF, ZF, AF, PF і CF.

Команда

Призначення

Процесор

SUB приймач, джерело

Віднімання

8086

Приклади:

mov al, 10

sub al, 7 - -> al = 3; al - приймач, 7 - джерело

mov ax, 25000

sub ax, 10000 - -> ax = 15000; ax - приймач, 10000 - джерело

mov cx, 100

mov bx, 15

sub cx, bx - -> cx = 85, bx = 15 (bx не змінюється); cx - приймач, bx - джерело

2.3 Інкремент (збільшення на 1).

Команда INC (Increment - інкремент) додає 1 до операнду, в якості якого можна указувати регістр (окрім сегментного) або елемент пам'яті розміром як в байт, так і в слово.

Не допускається використовувати як операнд безпосереднє значення. Операнд інтерпретується як число без знака. Команда впливає на прапори OF, SF, ZF, AF і PF. Команда не впливає на прапор CF; якщо потрібна дія на цей прапор, необхідно використовувати команду Add Op, l.

Команда INC (Increment - інкремент) збільшує на одиницю регістр або значення операнда в пам'яті.

Вона еквівалентна команді ADD джерело, 1 тільки виконується набагато швидше.

Команда

Призначення

Процесор

INC приймач

Збільшення на одиницю

8086

Приклади:

mov al, 15

inc al - -> тепер AL = 16 (еквівалентна add al, 1)

mov dh, 39h

inc dh - -> DH = 3Ah (еквівалентна add dh, 1)

mov cl, 4Fh

inc cl - -> CL = 50h (еквівалентна add cl, 1)

2.4 декремент (зменшення на 1).

Команда DEC (Decrement - декремент) віднімає 1 з операнда, в якості якого можна указувати регістр (окрім сегментного) або елемент пам'яті розміром як в байт, так і в слово. Не допускається використовувати як операнд безпосереднє значення. Операнд інтерпретується як число без знака. Команда впливає на прапори OF, SF, ZF, AF і PF.

Вона еквівалентна команді SUB джерело, 1 тільки виконується набагато швидше.

Команда

Призначення

Процесор

INC приймач

Збільшення на одиницю

8086

Приклади:

mov al, 15

dec al - -> тепер AL = 14 (еквівалентна sub al, 1)

mov dh, 39h

dec dh - -> DH = 38h (еквівалентна sub dh, 1)

mov cl, 4Fh

dec cl - -> CL = 4Dh (еквівалентна sub cl, 1)

3. Завдання для виконання.

3.1 Запустити емулятор EMU8086.

3.2 Отримайте завдання у викладача (один з п'яти варіантів табл. № 1) і, користуючись правилами оформлення ассемблерних програм, напишіть програми розрахунку значення A (два-три варіанти).

2.3 Програму ассембліруйте у файл типу *. exe;

3. Контрольні питання

3.1 Структура файлів типу *. exe?

3.2 Структурні відмінності файлів *. exe від *. com в операційному середовищі DOS?

3.3 Команда add основне призначення?

3.4 Команда sub основне призначення?

3.5 Команда inc основне призначення?

3.6. Команда dec основне призначення?

Табл. № 1

вар.

Розрахункова формула

B

C

D

A = B + CD

1

35

23

A = B + C + D

65

1

1

A = C-D + B

1

33

1

A = D + AB

18

1

88

A = B-C + D

45

10

1

За погодженням з викладачем можна змінити як розрахункову формулу, так і значення коефіцієнтів (B, C, D).

Лабораторна робота № 3

Способи адресації мовою Асемблер

Мета роботи: Вивчити основні способи адресації.

Способи адресації.

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

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

В архітектурі сучасних 32-розрядних процесорів Intel передбачені досить витончені способи адресації; в МП 86 способів адресації менше. Ми в цій лабораторній роботі ознайомимося з режимами адресації, використовувані в МП 86.

Розрізняють такі режими адресації:

регістровий;

безпосередній;

прямої;

регістровий непрямий (базовий або індексний);

регістровий непрямий зі зміщенням (базовий або індексний);

базово-індексний;

базовий індексний зі зміщенням.

1.1 Регістровий режим

Значення операнда-джерела попередньо запам'ятовується в одному із вбудованих регістрів мікропроцесора.

Сам регістр стає ефективним адресою. Операнд (байт або слово) знаходиться в регістрі. Цей спосіб застосовується до всіх програмно-адресуються регістрів процесора:

inc CX

; Збільшення на 1 вмісту CX

push DS

; Сегментний адресу зберігається в стеку

xchg BX, BP

; Регістри BX і BP обмінюються вмістом

mov ES, AX

; Вміст AX пересилається в ES

1.2 Безпосередній режим

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

mov АН, 40h

; Число 40h завантажується в АН

mov AL, '*'

; Код ASCII символу "* 'завантажується в AL

int 21h

; Команда переривання з аргументом 21h

limit equ 528

; Число 528 отримує позначення limit

mov CX, limit

; Число, позначене limit, завантажується в СХ

Команда mov, використана в останньому реченні, має два операнди; перший операнд визначається за допомогою реєстрової адресації, другий - за допомогою безпосередньої.

Важливим застосуванням безпосередньої адресації є пересилання відносних адрес (зсувів), для цього використовується описувач o ff set (зсув):

; Сегмент даних

string db "Privet"; Рядок символів

; Сегмент команд

mov DX, offset string; Адреса рядка засилається в DX

1.3 Прямий режим.

Адресується пам'ять; адресу комірки пам'яті (слова або байта) вказується в команді (зазвичай у символічній формі) і надходить в код команди:

; Сегмент даних

meml dw 0; Слово пам'яті містить 0

mem2 db 230; Байт пам'яті містить 230

; Сегмент команд

inc meml; Вміст слова meml збільшується на 1

mov DX, meml; Вміст слова з ім'ям menu завантажується в DX

mov AL, mem2; Вміст байти з ім'ям mem2 завантажується в АL

Порівнюючи цей приклад з попереднім, ми бачимо, що вказівка ​​в команді імені комірки пам'яті позначає, що операндом є вміст цього осередку; вказівка ​​імені осередку з описувачем offset - що операндом є адреса комірки.

Пряма адресація пам'яті на першій погляд, здається, простий і наочної. Якщо ми хочемо звернутися, наприклад, до осередку meml, ми просто вказуємо її ім'я в програмі. У дійсності, однак, справа йде складніше. Адреса будь-якої комірки складається з двох компонентів: сегментної адреси і зсуву. Позначення meml і mem2 в попередньому прикладі, є зсувами. Сегментні ж адреси зберігаються в сегментних регістрах. Однак сегментних регістрів чотири: DS, ES, CS і SS. Яким чином процесор дізнається, з якого регістра взяти сегментну адресу, і як повідомити йому про це в програмі?

Процесор розрізняє групу кодів, що носять назву префіксів. Є декілька груп префіксів: повторення, розміру адреси, розміру операнда, заміни сегменту. Тут нас будуть цікавити префікси заміни сегменту.

Команди процесора, які звертаються до пам'яті, можуть в якості першого байта свого коду містити префікс заміни сегменту, за допомогою якого процесор визначає, з якого сегментного регістра взяти сегментний адресу. Для сегментного регістра ES код префікса становить 26h, для SS - 361i, для CS - 2Eh. Якщо префікс відсутня, сегментна адреса береться з регістра DS (хоча для нього теж передбачений свій префікс).

У наведеному прикладі, за замовчуванням, всі дані адресуються через сегментний регістр DS, так що замість i nc meml можна було написати inc DS: mem. У разі заміни сегментного регістра його обов'язково потрібно вказувати явно:

inc ES: mem1

inc CS: mem2

Звернення до комірки пам'яті за відомим абсолютною адресою здійснюється наступним чином:

mov AL, DS: [17h]

Завантаження в AL вмісту клітинки зі зсувом 17h в сегменті, що визначається вмістом DS

1.4 Регістровий непрямий (базовий і індексний).

Адресується пам'ять (байт або слово). Відносний адреса комірки пам'яті знаходиться в регістрі, позначення якого полягає в прямі дужки. У МП 86 непряма адресація допустиме лише через регістри ВХ, ВР, SI і DI. При використанні регістрів ВХ або ВР адресацію називають базовою, при використанні регістрів SI або DI - індексного.

Якщо непряма адресація здійснюється через один з регістрів ВХ, SI або DI, то мається на увазі сегмент, що адресується через DS, тому при адресації через цей регістр позначення DS: можна опустити:

mov es: [bx], "1" ---- → mov [bx], '1 '

До речі, цей фрагмент трохи ефективніше попереднього в сенсі витрачання пам'яті. Через відсутність в коді останньої команди префікса заміни сегменту він займає на 1 байт менше місця.

Регістри ВХ, SI і DI в даному застосуванні зовсім рівнозначні, і з однаковим успіхом можна скористатися будь-яким з них:

Не так стоїть справа з регістром ВР. Цей регістр спеціально призначений для роботи зі стеком, і при адресації через цей регістр в режимах непрямої адресації мається на увазі сегмент стека; іншими словами, як сегментного регістра за замовчуванням використовується регістр SS.

Зазвичай непряма адресація до стека використовується в тих випадках, коли необхідно звернутися до даних, що містяться в стеку, без вилучення їх звідти (наприклад, якщо до ці дані доводиться зчитувати неодноразово).

Позначення цього способу адресації:

[BX]

(Мається на увазі DS: [BX])

[BP]

(Мається на увазі SS: [BP])

[SI]

(Мається на увазі DS: [SI])

[DI]

(Мається на увазі DS: [DI])

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

Приклади:

mov SI, offset string

; У SI завантажується відносний адресу осередку string

mov AX, [SI]

; Вміст осередку string завантажується в AX

inc [SI]

; Збільшуватись вміст комірки string

mov BX, [SI]

; Новий вміст комірки string завантажується в BX

mov DI, SI

; Відносний адресу осередку string копіюється в DI

1.5 Регістровий непрямий режим із зсувом (базовий і індексний).

Адресується пам'ять (байт або слово). Відносний адресу операнда визначається, як сума вмісту регістра BX, BP, SI або DI і зазначеної в команді константи, іноді званої зміщенням. Зсув може бути числом або адресою. Так само, як і у випадку базової адресації, при використанні регістрів BX, SI і DI мається на увазі сегмент, що адресується через DS, а при використанні ВР мається на увазі сегмент стека і, відповідно, регістр SS.

зміщення = {SP, BP, DI, SI, BX} + зміщення з команди

Іноді можна зустрітися з альтернативними позначеннями того ж способу адресації, які допускає асемблер. Замість, наприклад, 4 [ВХ] можна з таким же успіхом написати [ВХ +4], 4 + [ВХ] або [ВХ] +4. Така неоднозначність мови нічого, крім плутанини, не приносить, однак її треба мати на увазі, так як з цими позначками можна зіткнутися, наприклад, розглядаючи текст деассемблірованной програми.

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

зміщення = {SP, BP, DI, SI, BX} + зміщення з команди

Тут квадратні дужки [] - це теж оператор. Він обчислює адресу як суму того, що знаходиться всередині дужок з тим, що знаходиться зовні.

array db 0, 10, 20, 30, 40, 50, 60; Нехай у сегменті даних визначено масив:

Послідовність команд:

mov BX, 5

mov AL, array [5]; завантажить в AL елемент масиву з індексом 5, тобто 50.

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

mov BX, offset array

mov AL, 5 [BX]

або

mov AL, [BX] +5

mov AL, [BX +5]

1.6 Базово-індексний режим

Адресується пам'ять (байт або слово). Відносний адресу операнда визначається, як сума вмісту наступних пар регістрів:

зміщення [BX] [SI]

(Мається на увазі DS: зміщення [BX] [SI])

зміщення [BX] [DI]

(Мається на увазі DS: зміщення [BX] [DI])

зміщення [BP] [SI]

(Мається на увазі SS: зміщення [BP] [SI])

зміщення [BP] [DI]

(Мається на увазі SS: зміщення [BP] [DI])

У всіх цих випадках можна також писати:

зміщення [BX + SI]

[Зсув + BX + SI]

[BX + SI] + зсув

Це надзвичайно поширений спосіб адресації, особливо, при роботі з масивами. У ньому використовуються два регістри, при цьому одним з них повинен бути базовий (ВХ або ВР), а іншим - індексний (SI або DI). Як правило, в одному з регістрів знаходиться адреса масиву, а в іншому - індекс в ньому, при цьому абсолютно байдуже, в якому що.

1.7 Базово-індексна адресація зі зміщенням.

Адресується пам'ять (байт або слово). Відносний адресу операнда визначається як сума вмісту двох регістрів і зсуву.

Це спосіб адресації є розвитком попереднього. У ньому використовуються ті ж пари регістрів, але отриманий з їх допомогою результуючий адресу можна ще змістити на значення вказаної в команді константи. Як і у випадку базово-індексної адресації, константа може представляти собою індекс (і тоді в одному з регістрів повинен міститися базовий адресу пам'яті), але може бути і базовою адресою. В останньому випадку регістри можуть використовуватися для зберігання складових індексу.

Наведемо формальний приклад розглянутого режиму адресації.

Нехай у сегменті даних визначено масив з 24 байт

syms db 'ЙЦУКЕНГШЩЗХ''

db 'йцукенгшщзх''

Послідовність команд

mov BX, 12mov SI, 6

mov DL, syms [BX] [SI]; завантажить в регістр DL елемент з індексом 6 з другого ряду, тобто код ASCII літери г

Той самий результат буде отриманий і в такому варіанті:

mov BX, offset syms

mov SI, 6

mov DL, 12 [BX] [SI]

2. Порядок виконання роботи:

1. За допомогою редактора емулятора EMU 8086 напишіть програму, вихідний текст якої наводиться в лістингу № 1:

2. Створіть виконуваний файл типу MZ.

3. Вивчіть структуру програми, також вивчіть структуру сегмента даних програми: знайдіть у ньому всі змінні, визначені в тексті програми.

4. Переробіть програму з використанням спрощених директив сегментації так, щоб отримати виконуваний файл тіпа.com і порівняйте розміри програм.

5. Виконайте перші 5 кроків програми, аналізуючи і записуючи стан регістрів на кожному кроці.

6. Занесіть в СХ 00FFh. Визначте за способом адресації елемент пам'яті в сегменті, де відбудуться зміни, записати її адресу.

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

8. Підготуйте звіт, який повинен містити тексти програм, адреси сегментних регістрів і запису адрес комірок пам'яті проти відповідних команд, а також запис вмісту цих осередків.

9. У звіті повинні міститися відповіді на такі питання.

3. Контрольні питання

Як переслати вміст X в Y?

Чим відрізняються команди

MOV [si], cx

і

MOV si, cx?

До якого способу адресації стосується команда MOV dx, offset message?

Які сегменти використовуються при наступних варіантах адресації: [BX] [SI], [BX] [DI], [BP] [SI], [BP] [DI]?

5. Що станеться при виконанні інструкції

MOV AL, DS: 17h?

Чим ця команда відрізняється від наступної:

MOV AL, DS: [17h]?

6. Нехай у сегменті даних визначено масив

Array db 0,15,22,31,44,45,62,67,76,99

Що опиниться в регістрі AL після виконання команд:

MOV BX, 5

MOV AL, array [BX]?

7. Який це спосіб адресації (приклад питання 6)?

8. Вкажіть, які інструкції в програмі (лістинг № 1), створеної в даній лабораторній роботі, відносяться до інструкцій:

з безпосереднім;

непрямим режимом адресації?

9. Вкажіть спосіб запису звернення безпосередньо до комірки пам'яті за відомим абсолютною адресою?

10. Префікси, Види префіксів. Префікси заміни сегменту?

11. Перелічіть регістри непрямої і базової адресації. Опишіть відмінності?

12. Сутність ефективності базової адресації в порівнянні з прямою?

Лістинг № 1.

TITLE MOVE2 MOVE2 SEGMENT 'CODE' ASSUME CS: MOVE2, DS: DATA MYPROC PROC OUTPROC:

MOV AX, DATA MOV DS, AX MOV AH, BH MOV AH, X MOV CH, 3 MOV AX, 3 MOV AX, Y MOV [SI], CX MOV [BP], CX MOV [SI], 258 MOV [BP + 516], 1027 MOV BYTE PTR X, 255 MOV BYTE PTR [DI +515], 4 MOV WORD PTR [DI +515], 4 MOV [DI + BP +515], 258 MOV AX, [SI + BX +258] MOV AH, 4CH INT 21H MYPROC ENDP MOVE2 ENDS DATA SEGMENT X DB 1 Y DW 2 DATA ENDS END MYPROC

ЛАБОРАТОРНА РОБОТА № 5,6

ВИСНОВОК НА ЕКРАН У Текстовий режим

Мета роботи: Ознайомитися з основними засобами виведення текстових даних на екран за допомогою засобів операційної системи DOS, засобами BIOS і засобами безпосереднього (прямого) відображенням у відеобуфер.

Засоби DOS.

1.1 Функція DOS 02h.

Функція DOS 02h - Записати символ у STDOUT з перевіркою на Ctrl-Break

Введення:

АН = 02h

DL = ASCII-код символу

Висновок:

Ніякого, згідно з документацією, але насправді: AL = код останнього записаного символу (дорівнює DL, крім випадку, коли DL = 09h (табуляція), тоді в AL повертається 20h).

Ця функція при виведенні на екран обробляє деякі керуючі символи - висновок символу BEL (07h) призводить до звукового сигналу, символ BS (08h) призводить до руху курсора вліво на одну позицію, символ НТ (09h) замінюється на кілька прогалин, символ LF (0Ah ) опускає курсор на одну позицію вниз, і CR (0Dh) призводить до переходу на початок поточного рядка.

Якщо в ході роботи цієї функції була натиснута комбінація клавіш Ctrl-Break, викликається переривання 23h, яке за замовчуванням здійснює вихід з програми.

Простий приклад роботи функції DOS 02h.

Приклад № 1.1

. model tiny

; Модель пам'яті в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov dl, <ASCII-код символу>

; Заносимо в регістр dl - будь-який ASCII-код символу

mov ah, 2

; Номер функції DOS "висновок символу"

int 21h

; Виклик DOS

ret

; Функція DOS "завершити програму"

end begin

; Мітка закінчення коду програми

Ця програма, виводить на екран будь-ASCII-символ, у встановлену позицію курсору.

Всі функції DOS виводу на екран використовують пристрій STDOUT, стандартний висновок. Це дозволяє перенаправляти висновок програми у файл або на стандартне введення іншої програми. Наприклад, якщо відкомпілювати наведено приклад (створити файл cod. Com) і написати в командному рядку

cod. com> cod. out

то на екран нічого видано не буде, а в поточному каталозі з'явиться файл cod. out, що містить ASCII-код символу.

Функція DOS 06h.

Функція DOS 06h - Записати символ в STDOUT без перевірки на Ctrl-Break

Введення:

АН = 06h

DL = ASCII-код символу (крім FFh)

Висновок:

Ніякого, згідно з документацією, але насправді: AL = код записаного символу (копія DL)

Ця функція не обробляє керуючі символи (CR, LF, HT і BS виконують свої функції при виведенні на екран, але зберігаються при перенапрямку виводу у файл) і не перевіряє натискання Ctrl-Break.

Замінимо в прикладі № 1.1 MOV АН, 2 на MOV АН, 6 і перекомпіліруем цей приклад. Роботу відкомпільованого прикладу дивимося в операційній системі MS - DOS.

Функція DOS 09h

Функція DOS 09h - Записати рядок у STDOUT з перевіркою на Ctrl-Break

Введення:

АН = 09h DS: DX = адреса рядка, що закінчується символом $ (24h)

Висновок:

Ніякого, згідно з документацією, але насправді: AL = 24h (код останнього символу)

Дія цієї функції повністю аналогічно дії функції 02h, але виводиться не один символ, а цілий рядок (дивися лабораторну роботу № 2).

1.4 Функція DOS 40h

Функція DOS 40h - Записати у файл або пристрій

Введення:

АН = 40h ВХ = 1 для STDOUT або 2 для STDERR DS: DX = адресу початку рядка СХ = довжина рядка

Висновок:

CF = 0, АХ = число записаних байтів

Ця функція призначена для запису у файл, але, якщо в регістр ВХ помістити число 1, функція 40h буде виводити дані на STDOUT, а якщо ВХ = 2 - на пристрій STDERR. STDERR завжди виводить дані на екран і не перенаправляється у файли. На цій функції засновані використовувані в С функції стандартного виводу - фактично функція З fputs () просто викликає це переривання, поміщаючи свій перший аргумент на ВХ, адреса рядка (другий аргумент) - в DS: DX і довжину - в спілку художників.

Простий приклад роботи функції DOS 40h.

Приклад № 1.2

. model tiny

; Модель пам'яті в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov ah, 40h

; Номер функції DOS

mov bx, 2

; Вказуємо пристрій STDERR

mov dx, offset message

; DS: DX - адреса рядка

mov cx, 25

; CX - довжина рядка

int 21h

; Виклик DOS

ret

; Функція DOS "завершити програму"

message db "This function can print $"

; Дані для з містить виводяться дані.

end begin

; Мітка закінчення коду програми

Якщо скомпілювати цей приклад і запустити її командою

dosout.com> dosout. out

то повідомлення з'явиться на екрані, а файл dosout2. out виявиться порожнім.

Переривання INT 29H

INT 29h: Швидкий виведення символу на екран

Введення:

AL = ASCII-код символу

Простий приклад роботи переривання INT 29 h.

Приклад № 1.3

. model tiny

; Модель пам'яті в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov ax, <ASCII-код символу>

; Заносимо в регістр ax - будь-який ASCII-код символу

int 29h

; Виклик переривання DOS - виклик символу;

ret

; Функція DOS "завершити програму"

end begin

; Мітка закінчення коду програми

У більшості випадків INT 29h просто негайно викликає функцію BIOS "виведення символу на екран у режимі телетайпа", так що ніяких переваг, крім економії байт при написанні як можна більш коротких програм, вона не має.

2. Засоби BIOS

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

2.1 Вибір відеорежиму

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

2.1.1 Стандартні відеорежими

INT 10h, АН = 00 - Встановити відеорежим

Введення:

AL = номер режиму в молодших 7 бітах

Висновок:

Зазвичай ніякого, але деякі BIOS (Phoenix і AMI) поміщають в AL 30Н для текстових режимів і 20h для графічних

Приклад роботи.

Приклад № 2.1

. model tiny

; Модель пам'яті в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov ah, 00

; Встановлюємо відеорежим

mov al, 5

; Встановлюємо номер режиму

int 10h

; Виклик переривання DOS - виклик відеосервісу;

ret

; Функція DOS "завершити програму"

end begin

; Мітка закінчення коду програми

Виклик цієї функції призводить до того, що екран перекладається у вибраний режим. Якщо старший біт AL не встановлений в 1, екран очищується. Номери текстових режимів - 0, 1, 2, 3 і 7.0 і 1 - 16-кольорові режими 40x25 (з 25 рядками по 40 символів у рядку), 2 і 3 - 16-кольорові режими 80x25, 7 - монохромний режим 80x25. Існує ще багато текстових режимів з більш високою роздільною здатністю (80x43, 80x60, 132x50 і т.д.), але їх номери для виклику через цю функцію різні для різних відеоадаптерів (наприклад, режим 61h - 132x50 для Cirrus 5320 і 132x29 для Genoa 6400) . Однак, якщо відеоадаптер підтримує стандарт VESA BIOS Extention, в режими з високим дозволом можна переключатися, використовуючи функцію 4Fh.

2.1.2 SuperVGA-відеорежим

INT 10h, АН = 4Fh, AL = 02 - Встановити SuperVGA-відеорежим

Введення:

ВХ = номер режиму в молодших 13 бітах

Висновок:

AL = 4Fh, якщо ця функція підтримується АН = 0, якщо перемикання відбулося успішно АН = 1, якщо відбулася помилка

Якщо біт 15 регістра ВХ встановлено у 1, відеопам'ять не очищається. Текстові режими, які можна викликати з використанням цієї функції: 80x60 (режим 108h), 132x25 (109h), 132x43 (10Ah), 132x50 (10Bh), 132x60 (10Ch).

Відеорежим, використовуваний в DOS за замовчуванням, - текстовий режим 3.

2.2 Управління положенням курсору

2.2.1 Встановлюємо положення курсору

INT 10h, АН = 02 - Встановити положення курсору

Введення:

АН = 02 ВН = номер сторінки DH = рядок DL = стовпець

Приклад роботи.

Приклад № 2.2.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov ah, 02

; Встановлюємо положення курсору

mov bh, 0

; Встановлюємо номер сторінки

mov dh, 12

; Рядок 12

mov dl, 29

; Стовпець 29

int 10h

; Переривання DOS - встановити положення курсору в точку 12,29

mov ax, <ASCII-код символу>

; Заносимо в регістр ax - будь-який ASCII-код символу

int 29h

; Виклик переривання DOS - виклик символу;

ret

; Функція DOS "завершити програму"

end begin

; Мітка закінчення коду програми

За допомогою цієї функції можна встановити курсор в будь-яку позицію екрана, і подальший висновок тексту буде відбуватися з цієї позиції. Відлік номери рядка і стовпця ведеться від верхнього лівого кута екрана (символ в лівій верхній позиції має координати 0,0). Номери сторінок 0 - 3 (для режимів 2 і 3) і 0 - 7 (для режимів 1 і 2) відповідають області пам'яті, вміст якої в даний момент відображається на екрані. Можна вивести текст в неактивну зараз сторінку, а потім перемкнутися на неї, щоб зображення змінилося миттєво.

2.2.2 Прочитуємо положення і розмір курсору

INТ 10h, АН = 03 - Вважати положення і розмір курсору

Введення:

АН = 03 ВН = номер сторінки

Висновок:

DH, DL = рядок і стовпець поточної позиції курсору СН, CL = перша і остання рядка курсору

Повертає поточний стан курсору на обраній сторінці (кожна сторінка використовує власний незалежний курсор).

2.3 Висновок символів на екран

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

Атрибут символу:

Біт 7: символ блимає (за замовчуванням) або фон яскравого кольору (якщо його дію було перевизначено відеофункціям 10h).

Біти 6 - 4: колір фону. Біт 3: символ яскравого кольору (за замовчуванням) або фон блимає (якщо його дію було перевизначено відеофункціям 11h).

Біти 2 - 0: колір символу.

Кольори кодуються в бітах, як показано в таблиці № 2.3.

Таблиця № 2.3 Атрибути символів


Звичайний колір

Яскравий колір

000b

чорний

темно-сірий

001b

синій

світло-синій

010b

зелений

світло-зелений

011b

блакитний

світло-блакитний

100b

червоний

світло-червоний

101b

пурпурний

світло-пурпурний

110b

коричневий

жовтий

111b

світло-сірий

білий

2.3.1 Прочитуємо символ і атрибут символу в поточній позиції курсора.

INT 10h, АН = 08 - Вважати символ і атрибут символу в поточній позиції курсору

Введення:

АН = 08 ВН = номер сторінки

Висновок:

АН = атрибут символу AL = ASCII-код символу

2.3.1 Виводимо символ із заданим атрибутом на екран

INT 10h, АН = 09 - Вивести символ із заданим атрибутом на екран

Введення:

АН = 09 ВН = номер сторінки AL = ASCII-код символу BL = атрибут символу СХ = число повторень символу

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

Приклад роботи.

Приклад № 2.2.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov ah, 09

; Поміщаємо номер функції DOS "висновок рядка (9)" в регістр АН.

mov bh, 0

; Встановлюємо номер сторінки

mov al, <ASCII-код символу>

; Рядок 12; заносимо в регістр al - будь-який ASCII-код символу

mov bl, 00011111b

; Атрибут символу (білий на блакитному)

mov cx, 555

; Встановлюємо в лічильник кількість символів, що виводяться

int 10h

; Виклик переривання DOS - виклик символу;

ret

; Функція DOS "завершити програму"

end begin

; Мітка закінчення коду програми

2.3.2 Виводимо символ з поточним атрибутом на екран

INT 10h, АН = 0Ah - Вивести

Введення:

АН = 0Ah ВН = номер сторінки AL = ASCII-код символу СХ = число повторень символу

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

2.3.3 Виводимо символ в режимі телетайпа

INT 10h, АН = 0Eh - Вивести символ в режимі телетайпа

Введення:

АН = 0Eh ВН = номер сторінки AL = ASCII-код символу

Символи CR (0Dh), LF (0Ah), BEL (7) інтерпретуються як керуючі символи. Якщо текст при записі виходить за межі нижнього рядка, екран прокручується вгору. Як уособлення використовується атрибут символу, що знаходився в цій позиції.

2.3.4 Виводимо рядок символів з ​​заданими атрибутами

INT 10h, AH = 13h - Вивести рядок символів з заданими атрибутами

Введення:

АН = 13h AL = режим виводу:

Біт 0 - перемістити курсор в кінець рядка після виведення біт 1 - рядок містить не тільки символи, але також і атрибути, так що кожен символ описується двома байтами: ASCII-код і атрибут біти 2 - 7 зарезервовані

СХ = довжина рядка (тільки число символів) BL = атрибут, якщо рядок містить тільки символи DH, DL = рядок і стовпець, починаючи з яких буде виводитися рядка ES: BP = адресу початку рядка в пам'яті

Функція 13h виводить на екран рядок символів, інтерпретуючи керуючі символи CR (0Dh), LF (0Ah), BS (08) і BEL (07). Якщо рядок підготовлена ​​у форматі символ, атрибут - набагато швидше просто скопіювати її в відеопам'ять.

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

3. Пряма робота з відеопам'яттю

Все, що зображено на моніторі - і графіка, і текст, одночасно присутня в пам'яті, вбудованої в відеоадаптер. Для того щоб зображення з'явилося на моніторі, воно повинно бути записано в пам'ять відеоадаптера. Для цього відводиться спеціальна область пам'яті, що починається з абсолютної адреси 0B800h: 0000h (для текстових режимів) і закінчується на 0B800h: FFFFh. Все, що програми пишуть в цю область пам'яті, негайно пересилається в пам'ять відеоадаптера. У текстових режимах для зберігання кожного зображеного символу використовуються два байти: байт з ASCII-кодом символу і байт з його атрибутом, так що за адресою 0B800h: 0000h лежить байт з кодом символу, що знаходиться у верхньому лівому куті екрану; за адресою 0B800h: 0001h лежить атрибут цього символу; за адресою 0B800h: 0002h лежить код другого символу у верхній частині екрана і т.д.

Таким чином, будь-яка програма може вивести текст на екран, простою командою пересилання даних, не вдаючись до жодних спеціальних функцій DOS або BIOS.

Приклад робіт з відеопам'яттю.

Приклад № 3.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov ax, 0003h

; Відеорежим 3 (очищення екрана)

int 10h

; Переривання DOS - очищення екрана;

mov ax, 0B800h

; Завантажуємо в сегментний регістр ES число 0B800h

mov es, ax


mov di, 0

; Завантажуємо в регістр DI нуль

mov ah, 31

; Заносимо в регістр ah - атрибут символу

mov al, <ASCII-код символу>

заносимо в регістр al - будь-який ASCII-код символу

mov es: [di], ax

; Заносимо за адресою 0B800: 0000h атрибут і ASCII-код символу

mov ah, 10h

; Викликаємо функцію 10h - щоб можна було зупинити програму до натискання будь-якої клавіші

int 16h

; Викликаємо переривання 16h - сервіс роботи з клавіатурою BIOS

ret

; Функція DOS "завершити програму"

end begin

; Мітка закінчення коду програми

При підготовці даних для копіювання в відеопам'ять в цій програмі в рядках (7) і (8) завантажуємо в сегментний регістр ES число 0B800h, яке відповідає сегменту дисплея в текстовому режимі. У рядку (9) завантажуємо в регістр DI нуль. Це буде зсув щодо сегмента 0B800h. У рядках (10) і (11) у регістр AH заноситься атрибут символу (31 - яскраво-білий символ на синьому тлі) і в AL - ASCII-код символу (01 - пика) відповідно.

У рядку (12) заносимо за адресою 0B800: 0000h (тобто перший символ у першому рядку дисплея - верхній лівий кут) атрибут і ASCII-код символу (31 і 01 відповідно).

4. Завдання для виконання.

4.1 За допомогою редактора емулятора EMU 8086 напишіть програми приклади, яких наведені в даній лабораторній роботі.

4.2 Створіть файли типу MZ і *. com.

4.3 Вивчіть структуру скомпільованих програм.

4.4 Отримайте завдання у викладача (один з п'яти варіантів табл. № 1) напишіть програму виведення на екран рядка 'Hello'.

4.5 Напишіть програму роботи перемикання SuperVGA-відеорежимів (згідно варіантів табл. № 2)

4.6 Підготуйте звіт, який повинен містити тексти програм, а також вкажіть опис роботи команд програм.

4.7 У звіті повинні міститися відповіді на такі питання.

5. Контрольні питання

5.1 Перерахуйте функції виводу на екран засобами операційної системи DOS?

5.2 Принцип роботи функції DOS 02h?

5.3 Вкажіть основні керуючі символи виведення на екран?

5.4 Яким чином здійснити виведення програми у файл?

5.5 Вкажіть відмінність функції DOS 02h від 06h?

5.6 Переривання int 29h. Переваги використання?

5.7 За допомогою яких функцій можна встановити потрібний режим відео (текстовий, кольоровий, монохромний)?

5.8 Відзначте основні моменти установки super VGA-відеорежимів?

5.9 Вкажіть функції і переривання керування положенням курсору.

5.10 Перерахуйте функції зчитування положення та розміру курсору?

5.11 Висновок символів на екран засобами BIOS. Функції?

5.12 Пряма робота з відеопам'яттю. Принципи роботи з відеопам'яттю?

5.13 Вкажіть переваги виведення на екран за допомогою безпосередньої роботи з відеопам'яттю?

5.14 Область пам'яті відеоадаптера?

5.15 Вкажіть код третім символу у верхній частині екрана для роботи з відеопам'яттю?

5.16 Якщо в прикладі № 1.2 довжину рядок вказати більшу, ніж вказана що в даному випадку буде виводитися на екрану

Табл. № 1

вар.

Функція виведення (DOS)

Функція виведення (BIOS)

Відеопам'ять


02h

Ah = 02h

'Hello'


06h

Ah = 08h



09h

Ah = 09h



40h

Ah = 0Ah



29h

Ah = 13h


Примітка: У прикладах, в яких можливе завдання різних параметрів виводу (колір символу, фону; номер рядка, стовпця, сторінки і т.д.) виводите на екран слово "hello" з параметрами відмінними від стандартних.

Табл. № 2

вар.

SuperVGA-відеорежим


108h


109h


10Ah


10Bh


10Ch

Лабораторна робота № 4

КОМАНДИ ЛОГІЧНИХ ОПЕРАЦІЙ

Мета роботи: ознайомитися з роботою команд логічних операцій: and, or, xor, test, not і реалізацією їх роботи на практиці.

Короткі теоретичні відомості.

Логічні операції є важливим елементом у проектуванні мікросхем і мають багато спільного в логіці програмування. Команди AND, OR, XOR і TEST - є командами логічних операцій. Ці команди використовуються для скидання і установки біт і для арифметичних операцій в коді ASCII. Усі ці команди обробляють один байт або одне слово в регістрі або в пам'яті, і встановлюють прапори CF, OF, PF, SF, ZF.

Команда AND.

Команда AND (Логічне І) здійснює логічне (побітове) множення першого операнда на другий. Початкове значення першого операнда (приймача) втрачається, заміщаючи результатом множення. Як перший операнд команди and можна вказувати регістр (крім сегментного) або елемент пам'яті, як другий - регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте не допускається визначати обидва операнди одночасно як елементи пам'яті. Операнди можуть бути байтами або словами. Команда впливає на прапори SF, ZF і PF.

Правила побітового множення:

Перший операнд-біт 0101

Біт результату 0001

Другий операнд-біт 0011


Приклад 1

mov AX, 0FFEh

and AX, 5555h; AX = 0554h

Приклад 2

mov ax, 00101001 b

add ax, 11110111 b; ax = 00100001 b

Команда OR

Команда OR (Логічне Включати чи) виконує операцію логічного (побітового) складення двох операндів. Результат заміщає перший операнд (приймач), другий операнд (джерело) не змінюється. Як перший операнд можна вказувати регістр (крім сегментного) або елемент пам'яті, як другий - регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте не допускається визначати обидва операнди одночасно як елементи пам'яті. Операнди команди OR можуть бути байтами або словами. Команда впливає на прапори OF, SF, ZF, PF і CF, при цьому прапори CF і OF завжди скидаються в 0.

Правила побітового складання:

Перший операнд-біт 0101

Біт результату 0111

Другий операнд-біт 0011


Приклад 1

mov AX, 000Fh

mov BX, 00F0h

or AX, BX; AX = 00FFh, BX = 00F0h

Приклад 2

mov AX, 00101001b

mov BX, 11110111b

or AX, BX; mov dx, 11111111b

Приклад 3

mov AX, 000Fh

or AX, 8001h; AX = 800Fh

Команда XOR.

Команда ХОR (Логічне ВИКЛЮЧАЄ АБО) виконує операцію логічного (побітового) виключає АБО над своїми двома операндами. Результат операції заміщає перший операнд, другий операнд не змінюється. Кожен біт результату встановлюється в 1, якщо відповідні біти операндів різні, і скидається в 0, якщо відповідні біти операндів збігаються.

Як перший операнд команди ХВ R можна вказувати регістр (крім сегментного) або елемент пам'яті, як другий - регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте не допускається визначати обидва операнди одночасно як елементи пам'яті. Операнди можуть бути байтами або словами. Команда впливає на прапори OF, SF, ZF, PF і CF, причому прапори OF і CF завжди скидаються, а інші прапори встановлюються в залежності від результату.

Правила побітового виключає або:

Перший операнд-біт 0101

Біт результату 0110

Другий операнд-біт 0011


Приклад 1

mov AX, 0Fh

хог AX, 0FFFFh; AX = FFF0h

Приклад 2

mov AX, 00101001b

mov BX, 11110111b

xor ax, bx; 11011110 b

Приклад 3

mov SI, 0AAAAh

mov BX, 5555h

xor SI, BX; SI = FFFFh, BX = 5555h

Приклад 4

хог ВХ, ВХ; Обнулення ВХ

Команда TEST.

Команда TEST (Логічне порівняння) виконує операцію логічного множення І над двома операндами і, залежно від результату, встановлює прапори SF, ZF і PF. Прапори OF і CF скидаються, a AF має невизначене значення. Стан прапорів можна потім проаналізувати командами умовних переходів. Команда TEST не змінює ні один з операндів.

Як перший операнд команди TEST можна вказувати регістр (крім сегментного) або елемент пам'яті, як другий - регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте не допускається визначати обидва операнди одночасно як елементи пам'яті. Операнди можуть бути байтами або словами і представляти числа із знаком або без знаку.

Правила побітового множення:

Перший операнд-біт 0101

Біт результату 0001

Другий операнд-біт 0011


Прапор SF встановлюється в 1, якщо в результаті виконання команди утворилося число з встановленим знаковим бітом.

Прапор ZF встановлюється в 1, якщо в результаті виконання команди утворилося число, що складається з одних двійкових нулів.

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

Приклад 1

test AX, 1

jne label 2:; Перехід, якщо біт 0 в АХ встановлений

je label 1:; Перехід, якщо біт 0 в АХ скинутий

Приклад № 1.4.1.1

. model tiny

; Модель пам'яті в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov СX, <число1>

; Завантажуємо в CX число1 <будь число1>

mov BX, <чісло2>

; Завантажуємо в BX чісло2 <будь чісло2>

test cx, bx

; Логічно порівнюємо числа в регістрах cx з bx

jne label2

; Якщо одне зі значень не дорівнює 0 то переходимо на мітку label2

je label1

; Якщо одне зі значень дорівнює 0 то переходимо на мітку label1

ret

; Функція DOS "завершити програму" (не виконується)

label1:

; Початок блоку мітки Label1

mov ah, 9

; Поміщаємо номер функції DOS "висновок рядка (9)" в регістр АН.

mov dx, offset string

поміщає в регістр DX зсув мітки String щодо початку сегменту даних

int 21h

; Функція DOS "висновок рядка"

ret

; Функція DOS "завершити програму"

String db 'одне з чисел дорівнює 0 $'

; Дані для з містить виводяться дані.

label2:

; Початок блоку мітки Label2

mov ah, 9

; Поміщаємо номер функції DOS "висновок рядка (9)" в регістр АН.

mov dx, offset string1

поміщає в регістр DX зсув мітки String1 щодо початку сегменту даних

int 21h

; Функція DOS "висновок рядка"

ret

; Функція DOS "завершити програму"

string1 db 'не рівні 0 $'

; Дані для з містить виводяться дані.

end begin

; Мітка закінчення коду програми

Даний приклад порівнює два значення (рядок (6)), якщо одне з двох значень дорівнює нулю тоді переходимо на мітку label 1 (рядок (10)) далі виконуються команди, наступні після цієї мітки, у разі якщо одне з двох значень дорівнює нулю тоді переходимо на мітку label 2

Приклад 2

test SI, 8

jne bityes; Перехід, якщо біт 3 в SI встановлений

je bitno; Перехід, якщо біт 0 в АХ скинутий

Приклад 3

test DX, 0FFFFh

jz null; Перехід, якщо DX = 0

jnz smth; Перехід, якщо DX не 0

Команда NOT.

Команда NOT (NOT Інверсія, доповнення до 1, логічне заперечення) виконує інверсію бітів зазначеного операнда, замінюючи 0 на 1 і навпаки. Як операнд можна вказувати регістр (крім сегментного) або елемент пам'яті розміром як в байт, так і в слово. Не допускається використовувати як операнд безпосереднє значення. Команда не впливає на прапори процесора.

Правила побітової інверсії:

Операнд-біт 0 1

Біт результату 1 0

Приклад 1

mov AX, 0FFFFh

not AX; AX = 0000h

Приклад 2

mov SI, 5551h

not SI; SI = AAAEh

Характерні приклади роботи команд логічних операцій.

Для наступних незв'язаних прикладів, припустимо, що:

AL містить 1100 0101

BH містить 0101 1100:

1. AND AL, BH; Встановлює в AL 0100 0100

2. OR BH, AL; Встановлює в BH 1101 1101

3. XOR AL, AL; Встановлює в AL 0000 0000

4. AND AL, 00; Встановлює в AL 0000 0000

5. AND AL, 0FH; Встановлює в AL 0000 0101

6. OR CL, CL; Встановлює прапори SF і ZF

Приклади 3 і 4 демонструють спосіб очищення регістра.

У прикладі 5 обнуляються ліві чотири біта регістра AL.

Можна застосувати команду OR для наступних цілей:

1. OR CX, CX; Перевірка CX на нуль

JZ; Перехід, якщо нуль

2. OR CX, CX; Перевірка знака в CX

JS; Перехід, якщо негативно

3. Завдання для виконання.

Запустити емулятор EMU8086.

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

Проаналізуйте роботу коду прикладу № 1.4.1.1

За допомогою довідки емулятора EMU8086 подальші роботу команд (jne, je, js, jz)

Отримайте завдання у викладача (один з чотирьох варіантів (команди (and, or, xor, test, not))) і, користуючись правилами оформлення ассемблерних програм, напишіть три програми характеризують (показують) роботу їх з числами (двійковій, десятеричной, шістнадцятковій систем числення) згідно перерахуванню наведених прикладів.

Результати роботи продемонструйте викладачеві.

4. Контрольні питання

4.1 Призначення команд логічних операцій?

4.2 Команда and основне призначення?

4.3 Команда or основне призначення?

4.4 Команда xor основне призначення?

4.5 Команда test основне призначення?

4.6 Команда not основне призначення?

4.7 Альтернативна робота команд (test, xor, and)?

4.8 Припустимо що будить

4.9 У чому полягає робота зв'язки команд jne, je?

4.10 У чому полягає робота зв'язки команд js, jz?

4.11 Що станеться, якщо в прикладі № 1.4.1.1 ми змінимо рядок (8) на наступну (jne label1)?

ЛАБОРАТОРНА РОБОТА № 8

Ознайомлення з роботою ЦИКЛІВ

Мета роботи: ознайомитися зі структурою та реалізацією циклів у програмі.

Короткі теоретичні відомості.

Цикли, що дозволяють виконати певний ділянку програми багато разів, в будь-якій мові є однією з найбільш уживаних конструкцій. У системі команд МП 86 цикли реалізуються, головним чином, за допомогою команди loop (петля), хоча є і інші способи організації циклів. У більшості випадках число кроків в циклі визначається вмістом регістра СХ, тому максимальне число кроків становить 64 К.

Організація циклічних переходів, як на мовах високого рівня, так і мовою assembler являє собою чудовий засіб, що дозволяє значно знизити код виконуваної програми.

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

Організація циклу за допомогою команди LOOP (Перший спосіб).

Команда loop (анг. петля) виконує декремент вмісту регістра СХ (лічильник), і якщо воно не дорівнює 0, здійснює перехід на вказану мітку вперед або назад в тому ж програмному сегменті в діапазоні - 128 ... + 127 байт. Зазвичай мітка поміщається перед першою пропозицією тіла циклу, а команда loop є останньою командою циклу. Вміст регістра СХ розглядається як ціле число без знака, тому максимальне число повторень групи включених в цикл команд складає 65536 (якщо перед входом у цикл СХ = 0). Команда не впливає на прапори процесора.

Команда

Призначення

Процесор

LOOP мітка

Організація циклів

8086


Найпростіший приклад організації циклічного переходу (з лічильником в регістрі cx) мовою Assembler:

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить і дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov cx, 10

; Завантажуємо в (регістр-лічильник) CX кількість повторів (відлік буде йти від 10 до 0)

Label1:

; Створюємо мітку (Label - мітка).

mov ah, 9

; Поміщаємо номер функції DOS "висновок рядка (9)" в регістр АН.

mov dx, offset String

поміщає в регістр DX зсув мітки String щодо початку сегменту даних

int 21h

; Функція DOS "висновок рядка"

loop Label1

; Оператор loop зменшує на одиницю CX і, якщо він не дорівнює нулю, переходить на мітку Label1 (рядок 6)

ret

; Функція DOS "завершити програму"

string db 'privet $'

; Дані для з містить виводяться дані.

end begin

; Мітка закінчення коду програми

У рядку (5) завантажуємо в CX кількість повторів (відлік буде йти від 10 до 0). У рядку (6) створюємо мітку (Label - мітка). Далі (рядки (7) - (9)) виводимо повідомлення. І в рядку (10) оператор loop зменшує на одиницю CX і, якщо він не дорівнює нулю, переходить на мітку Label1 (рядок (6)). Таким чином, рядок буде виведена на екран десять разів. Коли програма перейде на рядок (11), регістр CX буде дорівнює нулю.

Організація циклу за допомогою команди JMP (Другий спосіб).

Команда jmp передає управління у вказану точку того ж або іншого програмного сегмента. Адреса повернення не зберігається. Команда не впливає на прапори процесора.

Команда jmp має п'ять різновидів:

перехід прямий короткий (у межах - 128 ... + 127 байтів);

перехід прямий ближній (в межах поточного програмного сегмента);

перехід прямий дальній (в інший програмний сегмент);

перехід непрямий ближній;

перехід непрямий дальній.

Всі різновиди переходів мають одну і ту ж мнемоніку jmp, хоча і різняться коди операцій. У багатьох випадках транслятор може визначити вид переходу на контекст, в тих же випадках, коли це неможливо, слід використовувати атрібутних оператори (short - прямий короткий перехід; near ptr - прямий ближній перехід; far ptr - прямий дальній перехід; word ptr - непрямий ближній перехід; dword ptr - непрямий дальній перехід).

Команда

Призначення

Процесор

JMP мітка

Безумовний перехід

8086

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

label1:

; Створюємо мітку

mov ah, 9

; Поміщаємо номер функції DOS "висновок рядка (9)" в регістр АН.

mov dx, offset String

поміщає в регістр DX зсув мітки String щодо початку сегменту даних

int 21h

; Функція DOS "висновок рядка"

jmp Label1

; Перехід на рядок з міткою Label1

add cx, 12

; Додати до значення регістра cx число 12

(Дана команда не виконується)

dec cx

; Зменшити значення регістра cx на 1

(Дана команда не виконується)

ret

; Функція DOS "завершити програму"

string db "PRIVET", 13,10, '$'

; Дані для з містить виводяться дані.

end begin

; Мітка закінчення коду програми

У результаті роботи програми буде зациклений блок рядків (6) - (10) (Висновок рядка PRIVET численна кількість разів) Рядки (10) - (11).

Організація циклу за допомогою команд DEC і JNZ (Третій спосіб).

З допомогу цих операторів можна створювати цикли, які будуть працювати швидше оператора Loop. Комбінована робота команд DEC і JNZ зменшує вміст регістра CX на 1 і виконує перехід на мітку, якщо в CX не дорівнює нулю.

Команда DEC, крім того, встановлює прапор нуля під флагової регістрі у стан 0 або 1. Команда JNZ потім перевіряє цю установку.

Аналогічно командам JMP і LOOP операнд в команді JNZ містить значення відстані між кінцем команди JNZ та адресою переходу (Label 1), яке додається до командного вказівником. Ця відстань повинна бути в межах від - 128 до +127 байт.

Наступний приклад буде працювати так само, як і Приклад № 1.1, тільки швидше.

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov cx, 10

; Завантажуємо в (регістр-лічильник) CX кількість повторів (відлік буде йти від 10 до 0)

Label1:

; Створюємо мітку (Label - мітка).

mov ah, 9

; Поміщаємо номер функції DOS "висновок рядка (9)" в регістр АН.

mov dx, offset String

поміщає в регістр DX зсув мітки String щодо початку сегменту даних

int 21h

; Функція DOS "висновок рядка"

dec cx

; Оператор DEC зменшує на одиницю CX і, якщо він не дорівнює нулю, переходить на мітку Label1

jnz Label1

; Умовний перехід на рядок з міткою Label1

ret

; Функція DOS "завершити програму"

string db 'priver', 13,10, '$'

; Дані для з містить виводяться дані

end begin

; Мітка закінчення коду програми

2. Програма для практики.

Напишемо програму, що виводить на екран всі символи ASCII (16 рядків по 16 символів у рядку).

. model tiny

; Модель пам'яті в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov cx, 256

; Задаємо значення лічильника (256 символів)

mov dl, 0

; Перший символ - з кодом 00

mov ah, 2

; Номер функції DOS "висновок символу"

cloop: int 21h

; Виклик DOS

inc dl

; Збільшення DL на 1 - наступний символ

test dl, 0Fh

; Якщо DL не кратний 16

jnz continue_loop;

; Продовжити цикл,

push dx

; Інакше: зберегти поточний символ

mov dl, 0Dh

; Вивести CR

int 21h

; Виклик DOS

mov dl, 0Ah

; Вивести LF

int 21h

; Виклик DOS

pop dx

; Відновити поточний символ

continue_loop:

; Мітка

loop cloop

; Продовжити цикл

ret

; Завершення СОМ-файлу

end begin

; Мітка закінчення коду програми

Тут за допомогою команди LOOP оформляється цикл, що виконується 256 разів (значення регістра СХ на початку циклу). Регістр DL містить код символу, який дорівнює нулю на початку циклу і збільшується кожного разу на 1 командою INC DL. Якщо значення DL відразу після збільшення на 1 кратне 16, воно тимчасово зберігається в стеку і на екран виводяться символи CR і LF, виконують перехід на початок нового рядка. Перевірка виконується командою TEST DL, 0Fh - результат операції AND над DL та 0Fh буде нулем, тільки якщо молодші чотири біта DL дорівнюють нулю, що і відповідає кратності шістнадцяти.

3. Зміст звіту.

3.1 Титульний лист.

3.2 Індивідуальний варіант завдання.

3.3 Тестові набори даних і передбачувані результати.

3.4 Текст програми до налагодження.

3.5 Список помилок, виявлених при налагодженні.

3.6. Результати виконання тестів.

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

4. Завдання для виконання.

4.1 Виконайте всі приклади, що містяться в описі даної лабораторної роботи.

4.2 Проаналізуйте роботу програми приклад для практики.

4.3 Вивчити умови організації циклічних переходів на мові Асемблера.

4.4 Напишіть програму, що виводить на екран слово "!!!!!!!!!! Hello !!!!!!!!!!" використовуючи команди циклічних переходів (3 варіанти).

4.5 Отримайте завдання у викладача (один з п'яти варіантів табл. № 1) і, користуючись правилами оформлення ассемблерних програм, створіть програму, що виводить на екран слово, D число разів.

4.6 Програму ассембліруйте у файл типу *. com або *. exe (на вибір);

5. Контрольні питання

5.1 Організація циклу за допомогою команди loop?

5.2 Значимість регістра cx?

5.3 Максимальне число повторень команд циклу визначається регістром сх?

5.4 Організація циклу за допомогою команди jmp?

5.5. Різновиди команди jmp?

5.6. Організація циклу за допомогою команд dec і jnz?

Табл. № 1

вар.

Виведені дані

Формула розрахунку

А

B

З


Циклічний перехід

D = A + B + C

101

345

121


Hello world

D = A-B + C

578

152

149


Good Bye

D = A + BC

333

223

16


Група

D = A-B + C

1502

834

1


Лабораторна робота

D = ABC

1056

33

125

ЛАБОРАТОРНА РОБОТА № 9

СПОСОБИ І МЕТОДИ ВИВЕДЕННЯ ЧИСЕЛ

Мета роботи: Освоїти методи виведення чисел у двійковому, шістнадцятковому і десятковому коді.

1. Висновок двійкового коду числа, записаного в регістр DH.

Методика виконання.

Потрібно послідовно проаналізувати біти числа. У даній роботі обмежимося байтом, який будемо зберігати в DH. Якщо біт нульової (скинутий), то потрібно вивести "0", якщо встановлено, то "1".

Алгоритм вирішення задачі:

проаналізувати значення одного біта;

вивести значення біта;

перейти до наступного біту. І так 8 разів (БАЙТ!) - ЦИКЛ

Аналіз біта: При аналізі значення програмісти зазвичай використовують команду TEST, але в даній лабораторній роботі ми буде використовувати наступну команду SHL

Команда SHL здійснює зрушення вліво всіх бітів операнда. Старший біт операнда надходить в прапор CF. Якщо команда записана у форматі

SHL операнд, 1

зрушення здійснюється на 1 біт. У молодший біт операнда завантажується 0. Якщо команда записана у форматі

SHL операнд, CL

зрушення здійснюється на число бітів, вказане в регістрі-лічильнику CL, при цьому в процесі послідовних зрушень старші біті операнда, пройшовши через прапор CF, втрачаються, а молодші заповнюються нулями

Як операнд команди SHL можна вказувати будь-який регістр (окрім сегментного) або елемент пам'яті розміром, як в байт, так і в слово. Не допускається використовувати як операнд безпосереднє значення.

Кожен зсув вліво еквівалентний множенню знакового числа на 2, тому команду SHL зручно використовувати для зведення операнда до степеня 2.

Команда впливає на прапори OF, SF, ZF, PF і CF.

Прореагувати на значення прапора можна за допомогою команди

JNC <мітка>

Здійснюється перехід на мітку, якщо прапор CF дорівнює нулю, інакше виконується команда, безпосередньо йде після команди.

Приклад № 1.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov DH, <55>

; Заносимо в регістр dh - будь-який ASCII-код символу

mov AH, 2

; Поміщаємо номер функції DOS "висновок рядка (2)" в регістр АН.

mov CX, 8

; Ініціалізація змінної циклу

@ 1: mov DL, 0 "

; Заносимо в DL код символу "0"

shl DH, 1

; Зрушення на 1 біт

jnc @ 2

; Перехід, якщо "0"

inc DL

; Використовуємо той факт, що код символу "1" на одиницю більше коду символу "0"

@ 2: int 21h

; Виклик переривання DOS - виклик символу;

LOOP @ 1

; Переходимо на мітку @ 1

int 21h

; Виклик переривання DOS - виклик символу;

end begin

; Мітка закінчення коду програми

Зауваження: в описаному способі аналізу значення вихідного числа втрачається. Інакше слід використовувати команду ROL, але 8 разів для байта.

2. Висновок значення байта в шістнадцятковій системі числення

2.1 Методика виконання.

Алгоритм вирішення задачі:

Припустимо, що байт, значення якого потрібно вивести, знаходиться в регістрі DH, і є таблиця символів "0123456789ABCDEF". Байт складається з двох шістнадцяткових цифр. З урахуванням цього завдання можна вирішити так: потрібно вивести на екран два символи з цієї таблиці. Спочатку - символ із номером, рівним старшому полубайта числа, а потім з номером, рівним молодшому полубайта.

Для вирішення завдання потрібно вирішити дві невеликі проблеми:

Записати в AL символ з потрібним номером. Скористаємося реєстрових непрямим режимом адресації зі зміщенням. Для цього значення кожного полубайта слід записувати в BX;

Записати в BX значення полубайта.

Найпростіший спосіб вирішення задачі.

Приклад № 2.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov dh, 10

; Заносимо в регістр dh число 10

mov bl, dh

; Заносимо в регістр bl число 10

xor bh, bh

; Обнулення вх

and bl, 0F0h

; Здійснюємо логічне (побітове) множення dh на 0 f 0 h.

shr bl, 4

; Зрушення в право на 4 біта

mov al, table [bx]

; Заносимо в регістр al значення рядка даних

int 29h

; Виклик переривання DOS - виклик символу

mov bl, dh

; Заносимо в регістр bl значення регістра dh

and bl, 0Fh

; Здійснюємо логічне (побітове) множення dh на 0 fh.

mov al, table [bx]

; Заносимо в регістр al значення рядка даних

int 29h

; Виклик переривання DOS - виклик символу;

mov al, 13

; Заносимо в регістр al число 13

int 29h

; Виклик переривання DOS - виклик символу;

mov al, 10

; Заносимо в регістр al число 10

int 29h

; Виклик переривання DOS - виклик символу

ret

; Функція DOS "завершити програму"

table db '0123456789ABCDEF '

; C Троках з містить виводяться дані.

end begin

; Мітка закінчення коду програми

3. Висновок значення байта в десятеричній системі числення

3.1 Методика виконання

Алгоритм вирішення задачі:

Будемо вважати, що байт, значення якого потрібно вивести, знаходиться в регістрі DH. Однак тепер застосуємо інший спосіб виведення символу цифри на екран: використовуємо той факт, що коди символів, що позначають цифри, відрізняються від них на 30h. Але проблема тут інша: заздалегідь не відомо, скільки цифр потрібно відобразити, одну або три. Байт може приймати значення від 0 до 255. І є ще одна проблема. При записі числа із застосуванням позиційної системи запису в деякій системі числення поступають таким чином: обчислюють і записують залишки від ділення числа на основу системи. Так надходять до тих пір, поки частка від ділення не стане рівним нулю. Потім залишки виписують в порядку, зворотному тому, як вони отримані.

Приклад:

число = 251.

Ділимо на 10. Приватне 25, залишок "1".

Ділимо на 10. Приватне 2, залишок "5".

Ділимо на 10. Приватне 0, залишок "2".

Потрібно вивести на екран "2", "5", "1".

Завдання вирішується з використанням стека програми. Залишки будемо розміщувати в стек програми за допомогою оператора PUSH. Одночасно будемо підраховувати число залишків, поміщених в стек. Лічильник - CX. Потім його використовуємо для організації циклу, в якому будемо витягати залишки з стека оператором POP. Стек організований таким чином, що оператор POP витягує останнє слово, яке було поміщено туди оператором PUSH. Зазначимо, що оператор PUSH поміщає в стек слово (WORD) або подвійне слово (DWORD). Аналогічно працює і оператор POP

3.1.1 Команда PUSH (занесення операнда в стек).

Команда push зменшує на 2 вміст покажчика стека SP і заносить на цю нову вершину багатобайтових операнд-джерело (проштовхує в стек нове дане). Проштовхувати в стек можна тільки цілі слова (не байти). Програма повинна суворо стежити за тим, щоб кожній команді проштовхування в стек push відповідала зворотна команда виштовхування з стека pop. Якщо стек використовується для тимчасового зберігання деяких даних, то витягувати ці дані з стека слід в порядку, зворотному їх збереженню.

В якості операнда-джерела може використовуватися будь-який 16-розрядний регістр (включаючи сегментний) або елемент пам'яті. Команда push не впливає на прапори процесора.

Пара команд push - pop часто використовується для пересилки даного з регістра в регістр (особливо, в сегментний) через стек.

Приклад 1

push ES: mem; Збереження вмісту

push DS; слова пам'яті mem з

push BP; додаткового сегменту, а також регістрів DS і ВР

pop PP; Відновлення із стека

pop DS; трьох операндів

pop ES: mem; у зворотному порядку

Приклад 2

push DS; Пересилання DS через стек

pop ES; Тепер ES = DS

Найпростіший спосіб вирішення завдання виведення значення байта в десятеричній системі числення

Приклад № 3.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov dh, 33

; Заносимо в регістр dh число 33

mov al, dh

; Заносимо в регістр al число 33

xor ah, ah

; Обнулення ah

mov bl, 10

; Заносимо в регістр bl число 10

xor cx, cx

; Обнулення сх (лічильник)

@ 1:

; Встановлюємо мітку @ 1

div bl

; Ділимо ціле число (регістр ax) без знаку, на число (регістр bl)

push ax

; Пересилаємо ax через стек

inc cx

; Збільшуємо на 1 cx (лічильник)

xor ah, ah

; Обнулення ah

or ax, ax

; Логічного (побітового) складення саме на себе

jnz @ 1

; Якщо прапор zf не нуль, то переходимо на мітку @ 1

@ 2:

; Виклик переривання DOS - виклик символу;

pop ax

; Заносимо в регістр al число 10

xchg ah, al

; Обмін даними між операндами ah і al

add al, 30h

; Додаємо до al числа 30 h

int 29h

; Виклик переривання DOS - виклик символу

loop @ 2

; Реалізація циклу - переходимо на мітку @ 2

mov al, 13

; Заносимо в регістр al число 13

int 29h

; Виклик переривання DOS - виклик символу

mov al, 10

; Заносимо в регістр al число 10

int 29h

; Виклик переривання DOS - виклик символу

ret

; Функція DOS "завершити програму"

end begin

; Мітка закінчення коду програми

Завдання для виконання.

3.1 C допомогою редактора емулятора EMU 8086 напишіть програми, вихідний текст яких наводиться в прикладах даної лабораторної роботи.

3.2 Створіть виконувані файли типу *. com.

3.3 Вивчіть роботу отриманих програм.

3.4 Напишіть програму для виведення на екран вмісту регістра DS (на основі прикладу № 2.1). Порівняйте результат роботи своєї програми і того, що показує відладчик.

3.5 Опишіть роботу команд DIV, PUSH, POP, SHL, TEST.

3.6 Встановіть (знайдіть адреси та запишіть), де знаходяться числа, поміщені в стек.

3.7 Напишіть програму для виведення на екран вмісту регістра СS (на основі прикладу № 3.1).

3.8 Запропонуйте інші способи вирішення поставлених завдань.

5. Контрольні питання

Переваги використання команди SHL замість TEST (приклад № 1.1)?

Чим відрізняються команди

SHL dx, 1

і

SHL dx, cl

Як переслати вміст X в стек і отримати назад?

Опишіть методику виведення значення байта в десятеричній системі числення?

Опишіть методику виведення значення байта в шістнадцятковій системі числення?

Опишіть методику виведення двійкового коду числа, записаного в регістр X

Стек. Принцип роботи. Команди роботи зі стеком.

Вкажіть відмінності в роботі тандему команд

push DS

pop ES

від

push DS

pop ES

Л абораторная робота № 5, 6

Команд, які обслуговують РОБОТУ З КЛАВІАТУРОЮ

Мета роботи: Освоїти команди зчитування даних і управління клавіатурою. Вивчити способи роботи з процедурами.

1. Засоби BIOS

Так само як і для виведення на екран, BIOS надає більше можливостей у порівнянні з DOS для зчитування даних та управління клавіатурою. Наприклад, функціями DOS не можна визначити натискання комбінацій клавіш типу Ctrl-Alt-Enter або натискання двох клавіш Shift одночасно, DOS не може визначити момент відпускання клавіші, що натискує, і нарешті, в DOS немає аналога функції С ungetch (), помещающей символ в буфер клавіатури, як якщо б його ввів користувач. Все це можна здійснити, використовуючи різні функції переривання 16h та операції з байтами стану клавіатури.

INT 16h, АН = 0, 10h, 20h - Читання символу з очікуванням

Введення:

АН = 00h (83/84-key), 10h (101/102-key), 20h (122-key)

Висновок:

AL = ASCII-код символу, 0 або префікс скан-коду

АН = скан-код клавіші, клавіші або розширений ASCII-код

Кожній клавіші на клавіатурі відповідає так званий скан-код (див. додаток 1), відповідний тільки цій клавіші. Цей код надсилається клавіатурою при кожному натисканні та відпусканні клавіші і обробляється BIOS (обробником переривання INT 9). Переривання 16h дає можливість отримати код натискання, не перехоплюючи, цей обробник. Якщо самій клавіші відповідає ASCII-символ, то в АН повертається код цього символу, а в AL - скан-код клавіші. Якщо натиснутою клавіші відповідає розширений ASCII-код, в AL повертається префікс скан-коду (наприклад, Е0 для сірих клавіш) або 0, якщо префікса немає, а в АН - розширений ASCII-код. Функція 00Н обробляє тільки комбінації, які використовують клавіші 84-клавішною клавіатури, l0h обробляє всі 101 - 105-клавішні комбінації, 20h - 122-клавішні. Тип клавіатури можна визначити за допомогою функції 09h переривання 16h, якщо вона підтримується BIOS (чи підтримується ця функція, можна дізнатися за допомогою функції C0h переривання 15h).

INT 16h, АН = 1, 11h, 21h - Перевірка символу

Введення:

АН = 01h (83/84-key), 11h (101/102-key), 21h (122-key)

Висновок:

ZF = 1, якщо буфер порожній

ZF = 0, якщо в буфері присутній символ, в цьому випадку

AL = ASCII-код символу, 0 або префікс скан-коду

АН = скан-код клавіші, клавіші або розширений ASCII-код

Символ залишається в буфері клавіатури, хоча деякі BIOS видаляють символ з буфера при обробці функції 01h, якщо він відповідає розширеного ASCII-коду, відсутньому на 84-клавішних клавіатурах.

INT 16h, АН = 05h - Помістити символ в буфер клавіатури

Введення:

АН = 05h

СН = скан-код

CL = ASCII-код

Висновок:

AL = 00, якщо операція виконана успішно

AL = 01h, якщо буфер клавіатури переповнений

АН модифікується багатьма BIOS

Звичайно можна помістити 0 замість скан-коду в СН, якщо функція, яка буде виконувати читання з буфера, буде використовувати саме ASCII-код.

Наприклад, наступна програма при запуску з DOS викликає команду DIR (але при запуску з деяких оболонок, наприклад FAR, цього не станеться).

Приклад № 1.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

begin:

; Мітка початку коду програми

mov cl, 'd'

; Заносимо в регістр cl - ASCII-код літери "d"

call ungetch

; Переходимо на мітку ungetch: (виклик підпрограми)

mov cl, 'i'

; Заносимо в регістр cl - ASCII-код літери "i"

call ungetch

; Викликаємо підпрограму

mov cl, 'r'

; Заносимо в регістр cl - ASCII-код літери "r"

call ungetch

; Викликаємо підпрограму

mov cl, 0Dh

; Переклад рядка

Ungetch proc

; Мітка початку підпрограми

mov ah, 05h

; AH = номер функції

mov ch, 0

; CH = 0 (скан-код неважливий)

int 16h

; Виклик DOS (переривання)

ret

; Функція DOS "завершити роботу процедури"

Ungetch endp

; Закінчення підпрограми

end begin

; Мітка закінчення коду програми

Оформлення процедур (підпрограм).

______________

Call ungetch

Ungetch proc

Ungetch endp

______________

Ungetch - назва процедури

Call - виклик підпрограми

Proc - procedure - процедура

endp - end procedure - кінець процедури

Варто ще відзначити, що з однієї підпрограми можна викликати інші. З інших - треті. Частіше за все з метою спрощення програми і, тим самим, зменшення її розміру програмісти використовують просту зв'язку команд:

Call мітка

мітка:

Будь-який виклик підпрограм закінчується повернення до блоку коду командою ret (ret - return - повернення).

INT 16h, AH = 02h, 12h, 22h - Вважати стан клавіатури

Введення:

АН = 02h (83/84-key), 12h (101/102-key), 22h (122-key)

Висновок:

AL = байт стану клавіатури 1

АН = байт стану клавіатури 2 (тільки для функцій 12h і 22h)

Байт стану клавіатури 1 (цей байт завжди розташований в пам'яті за адресою 0000h: 0417h або 0040h: 0017h):

Біт 7: Ins включена

Біт 6: CapsLock включена

Біт 5: NumLock включена

Біт 4: ScrollLock включена

Біт 3: Alt натиснута (будь-яка Alt для функції 02h, часто тільки ліва Alt для 12h/22h)

Біт 2: Ctrl натиснута (будь-яка Ctrl)

Біт 1: Ліва Shift натиснута

Біт 0: Права Shift натиснута

Байт стану клавіатури 2 (цей байт завжди розташований в пам'яті за адресою 0000h: 0418h або 0040h: 0018h):

Біт 7: SysRq натиснута

Біт 6: CapsLock натиснута

Біт 5: NumLock натиснута

Біт 4: ScrollLock натиснута

Біт 3: Права Alt натиснута

Біт 2: Права Ctrl натиснута

Біт 1: Ліва Alt натиснута

Біт 0: Ліва Ctrl натиснута

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

Крім цих двох байт BIOS зберігає в своїй області даних і весь клавіатурний буфер, до якого також можна звертатися безпосередньо. Буфер займає 16 слів з 0h: 041Eh no 0h: 043Dh включно, причому за адресою 0h: 041Ah лежить адресу (ближній) почала буфера, тобто адресу, за якою розташовується наступний введений символ, а за адресою 0h: 041Ch лежить адреса кінця буфера, так що якщо ці два адреси рівні, буфер порожній. Буфер діє як кільце: якщо початок буфера - 043Ch, а кінець - 0420h, то в буфері знаходяться три символи за адресами 043Ch, 041Eh і 0420h. Кожен символ зберігається у вигляді слова - того ж самого, яке повертає функція 10h переривання INT 16h. У деяких випадках (якщо) буфер розміщується на інші адреси, тоді адресу його початку зберігається в області даних BIOS за адресою 0480h, а кінця - за адресою 0482h. Прямий доступ до буферу клавіатури лише трохи швидше, ніж виклик відповідних функцій BIOS, і для додатків, що вимагають максимальної швидкості, таких як ігри або демо-програми, використовують управління клавіатурою на рівні портів вводу-виводу.

2. Засоби DOS

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

Функція DOS 0Ah - Вважати рядок символів з STDIN в буфер

Введення:

АН = 0Ah

DS: DX = адресу буфера

Висновок:

Буфер містить введений рядок

Для виклику цієї функції треба підготувати буфер, перший байт якого містить максимальну кількість символів для введення (1-254), а вміст, якщо воно задане, може використовуватися як підказка для введення. При наборі рядки обробляються клавіші Esc, F3, F5, BS, Ctrl-C/Ctrl-Break і т.д., як при наборі команд DOS (тобто Esc починає введення спочатку, F3 відновлює підказку для введення, F5 запам'ятовує поточний рядок як підказку, Backspace стирає попередній символ). Після натискання клавіші Enter рядок (включаючи останній символ CR (0Dh)) записується в буфер, починаючи з третього байта. У другій байт записується довжина реально введеного рядка без врахування останнього CR.

Розглянемо приклад програми, яка виконує перетворення десяткового числа в шістнадцяткове.

Приклад № 2.1

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

start:

; Мітка початку коду програми

mov dx, offset messagel

; DS: DX - адреса рядки

mov ah, 9

; Номер функції DOS в АН

int 21h

; Вивести запрошення до введення message1

mov dx, offset buffer

; DS: DX - адреса рядки

mov ah, 0Ah

; Номер функції DOS в АН

int 21h

; Вважати рядок символів у буфер

mov dx, offset crlf

; DS: DX - адреса рядки

mov ah, 9

; Номер функції DOS в АН

int 21h

; Переклад рядка

xor di, di

; DI = 0 - номер байта в буфері

xor ax, ax

; АХ = 0 - поточне значення результату

mov cl, blength


xor ch, ch

; Обнуляємо регістр ch

xor bx, bx

; Обнуляємо регістр bx

mov si, cx

; SI - довжина буфера

mov cl, 10

; CL = 10, множник для MUL

asc2hex:

; Мітка початку блоку asc2hex:

mov bl, byte ptr bcontents [di]


sub bl, "0"

; Цифра = код цифри - код символу "0",

jb asc_error

; Якщо код символу був менше, ніж код "0",

cmp bl, 9

; Або більше, ніж "9",

ja asc_error

; Вийти з програми з повідомленням про помилку,

mul cx

; Інакше: помножити поточний результат на 10,

add ax, bx

; Додати до нього нову цифру,

inc di

; Збільшити лічильник

cmp di, si

; Якщо лічильник +1 менше числа символів -

jb asc2hex

; Продовжити (лічильник вважається від 0)

push ax

; Зберегти результат перетворення

mov ah, 9

; Номер функції DOS в АН

mov dx, offset message2

; DS: DX - адреса рядки

int 21h

; Вивести запрошення до введення message2

pop ax

; Вважати із стека

push ax

; Записати в стек

xchg ah, al

; Помістити в AL старший байт

call print_al

; Вивести його на екран

pop ax

; Відновити в AL молодший байт

call print_al

; Вивести його на екран

ret

; Завершення СОМ-файлу

asc_error:

; Початок блоку asc_error:

mov dx, offset err_msg

; DS: DX - адреса рядки

mov ah, 9

; Номер функції DOS в АН

int 21h

; Вивести повідомлення про помилку

ret

; Завершити програму

print_al:

; Мітка початку блоку print_al:

mov dh, al

; Заносимо в dh значення регістра al

and dh, 0Fh

; DH - молодші 4 біта

shr al, 4

; AL - старші

call print_nibble

; Вивести старшу цифру

mov al, dh

; Тепер AL містить молодші 4 біта

print_nibble:

; Процедура виведення 4 біт (шістнадцятковій цифри)

cmp al, 10

; Три команди, що переводять цифру в AL

sbb al, 69h

; У відповідний ASCII-код

das

; (Див. опис команди DAS)

mov dl, al

; Код символу в DL

mov ah, 2

; Номер функції DOS в АН

int 21h

; Висновок символу

ret

; Цей RET працює два рази - один раз для повернення з процедури print_nibble, викликаної для старшої цифри і другий раз - для повернення з print_al

messagel db "Десяткове число: $"

; C Троках з містить виводяться дані.

message2 db "Шістнадцяткове число: $"

; C Троках з містить виводяться дані.

err_msg db "Помилка вводу"

; C Троках з містить виводяться дані.

crlf db 0Dh, 0Ah, '$'

; C Троках з містить виводяться дані.

Buffer db 6

; Максимальний розмір буфера введення

blength db?

; Розмір буфера після зчитування

bcontents:

; Вміст буфера розташовується за кінцем СОМ-файлу

end start

; Мітка закінчення коду програми

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

Функція DOS 01h - Вважати символ з STDIN з луною, очікуванням і перевіркою на Ctrl-Break

Введення:

АН = 01h

Висновок:

AL = ASCII-код символу або 0. Якщо AL = 0, другий виклик цієї функції поверне в AL розширений ASCII-код символу

При читанні за допомогою цієї функції введений символ автоматично негайно відображається на екрані (надсилається в пристрій STDOUT - так що його можна перенаправити у файл). При натисканні Ctrl-C або Ctrl-Break виконується команда INT 23h. Якщо натиснута клавіша, яка не відповідає якому-небудь символу (стрілки, функціональні клавіші Ins, Del і т.д.), то в AL повертається 0 і функцію треба викликати ще один раз, щоб отримати розширений ASCII-код (див. додаток 1) .

У трьох наступних варіантах цієї функції код символу повертається в AL за таким же принципом.

Функція DOS 08h - Вважати символ з STDIN без луни, з очікуванням і перевіркою на Ctrl-Break

Введення:

АН = 08h

Висновок:

AL = код символу

Функція DOS 07h - Вважати символ з STDIN без луни, з очікуванням і без перевірки на Ctrl-Break

Введення:

АН = 07h

Висновок:

AL = код символу

Функція DOS 06h - Вважати символ з STDIN без луни, без очікування і без перевірки на Ctrl-Break

Введення:

АН = 07h

DL = 0FFh

Висновок:

ZF = 1, якщо не була натиснута клавіша, і AL = 00

ZF = 0, якщо клавіша була натиснута. У цьому випадку AL = код символу

2.2 службові функції DOS для роботи з клавіатурою.

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

Функція DOS 0Bh - Перевірити стан клавіатури

Введення:

АН = 0Bh

Висновок:

AL = 0, якщо не була натиснута клавіша

AL = 0FFh, якщо була натиснута клавіша

Цю функцію зручно використовувати перед функціями 01, 07 і 08, щоб не чекати натискання клавіші. Крім того, виклик цієї функції дозволяє перевірити, чи не зчитуючи символ з клавіатури, чи була натиснута комбінація клавіш Ctrl-Break, якщо це сталося, виконається переривання 23h.

Функція DOS 0Ch - Очистити буфер і вважати символ

Введення:

АН = 0Ch

AL = Номер функції DOS (01, 06, 07, 08, 0Ah)

Висновок:

Залежить від викликаної функції

Функція 0Ch очищає буфер клавіатури, так що наступна функція читання символу буде чекати введення з клавіатури, а не використовувати натиснутий раніше і ще не оброблений символ. Наприклад, саме ця функція використовується для зчитування відповіді на питання "Чи впевнений користувач в тому, що він хоче відформатувати диск?".

Функції посимвольного введення без луни можна використовувати для інтерактивного управління програмою.

. model tiny

; Модель пам'яті, в якій сегменти коду, даних і стека об'єднані.

. code

; Сегмент коду, який містить дані.

org 100h

; Початок СОМ-файлу

Begin:

; Мітка початку коду програми

call Wait_key

; Викликаємо підпрограму

cmp al, 27

; Порівнюємо значення в al з кодом 27 (ESC)

; Якщо так - то на мітку Quit_prog

je Quit_prog


cmp al, 0

; Код клавіші розширений? (F1-F12 і т.п.)

je Begin

, Так - повторимо запит ...

call Out_char

; Викликаємо процедуру виведення натиснутою клавіші на екран

jmp Begin

; Чекаємо далі ...

Quit_prog:

; Мітка, на яку прийде програма у випадку натискання ESC

mov al, 32

; Поміщаємо в AL <пробіл>

call Out_char

; Викликаємо процедуру виведення символу в AL

int 20h

; Виходимо ...

Wait_key proc

; Процедура очікування клавіші від користувача

mov ah, 10h

; Закінчення підпрограми

int 16h

; Переривання DOS

ret

; Функція DOS "завершити роботу процедури"

Wait_key endp

; Закінчення процедури Wait_key

Out_char proc

; Початок процедури out_char

push cx

; Збережемо всі регістри, які будуть змінені підпрограмою ...

push ax

; ... зробимо це для того, щоб надалі не було плутанини

push es

; Збережемо сегментний регістр

push ax

; Збережемо AX, так як в ньому код натиснутої клавіші ...

mov ax, 0B800h

; Встановимо ES на сегмент відеобуфера

mov es, ax


mov di, 0

; DI - перший символ першого рядка

mov cx, 2000

; Виводимо 2000 символів (80 символів в рядку 25 рядків)

pop ax

; Відновимо код клавіші

mov ah, 31

; Колір символу

Next_sym:

; Мітка для циклу

mov es: [di], ax

; Заносимо код клавіші і її колір (колір завжди 31)

inc di

; Збільшуємо покажчик на 2 (перший байт - символ, другий байт - колір)

inc di


loop Next_sym

; Обробка наступного символу

pop es

; Відновимо збережені регістри і вирівняний стек

pop ax


pop cx


ret

; Повернемося з процедури

Out_char endp

; Закінчення процедури Out_char

end Begin

; Мітка закінчення коду програми

Програма робить наступне:

Чекає від користувача клавіші;

якщо це розширений ASCII (F1-F12, стрілки), то ігнорує її;

якщо це не розширений ASCII (AZ, 0-9 тощо) - заповнити екран даними символом;

якщо натискаємо ESC (27 або 1Bh), то заповнити екран пробілами (mov al, 32) і вийти.

Завдання для виконання.

3.1 C допомогою редактора емулятора EMU 8086 напишіть програми, вихідний текст яких наводиться в прикладах даної лабораторної роботи.

3.2 Створіть виконувані файли типу *. com.

3.3 Вивчіть роботу отриманих програм.

3.4 Напишіть програму для виведення на екран вмісту регістра DS (на основі прикладу № 2.1). Порівняйте результат роботи своєї програми і того, що показує відладчик.

3.5 Опишіть роботу команд DIV, PUSH, POP, SHL, TEST.

3.6 Встановіть (знайдіть адреси та запишіть), де знаходяться числа, поміщені в стек.

3.7 Напишіть програму для виведення на екран вмісту регістра СS (на основі прикладу № 3.1).

3.8 Запропонуйте інші способи вирішення поставлених завдань.

5. Контрольні питання

Переваги використання команди SHL замість TEST (приклад № 1.1)?

Чим відрізняються команди

SHL dx, 1

і

SHL dx, cl

Як переслати вміст X в стек і отримати назад?

Опишіть методику виведення значення байта в десятеричній системі числення?

Опишіть методику виведення значення байта в шістнадцятковій системі числення?

Опишіть методику виведення двійкового коду числа, записаного в регістр X

Стек. Принцип роботи. Команди роботи зі стеком.

Вкажіть відмінності в роботі тандему команд.

push DS

pop ES

від

push DS

pop ES

Додаток № 1

Основні Скан-Коди клавіш клавіатури.

Клавіша

Код

Клавіша

Код

Клавіша

Код

Клавіша

Код

Esc

01h

Enter

1Ch

K *

37h

Ins

52h

1!

02h

Ctrl

1Dh

Alt

38h

Del

53h

2 @

03h

A

1Eh

SP

39h

SysRq

54h

3 #

04h

S

1Fh

Caps

3Ah

Macro

56h

4 $

05h

D

20h

F1

3Bh

F11

57h

5%

06h

F

21h

F2

3Ch

F12

58h

6 ^

07h

G

22h

F3

3Dh

PA1

5Ah

7 &

08h

H

23h

F4

3Eh

F13/LWin

5Bh

8 *

09h

J

24h

F5

3Fh

F14/RWin

5Ch

9 (

0Ah

K

25h

F6

40h

F15/Menu

5Dh

0)

0Bh

L

26h

F7

41h

F16

63h

- _

0Ch

;:

27h

F8

42h

F17

64h

= +

0Dh

'"

28h

F9

43h

F18

65h

BS

0Eh

`~

29h

F10

44h

F19

66h

Tab

0Fh

LShift

2Ah

Num

45h

F20

67h

Q

10h

\ |

2Bh

Scroll

46h

F21

68h

W

11h

Z

2Ch

Home

47h

F22

69h

E

12h

X

2Dh

-

48h

F23

6Ah

R

13h

C

3Eh

PgUp

49h

F24

6Bh

T

14h

V

2Fh

K-

4Ah

EraseEOF

6Dh

Y

15h

B

30h

4Bh

Copy / Play

6Fh

U

16h

N

31h

K5

4Ch

CrSel

72h

I

17h

M

32h

®

4Dh

Delta

73h

O

18h

, <

33h

K +

4Eh

ExSel

74h

P

19h

. >

34h

End

4Fh

Clear

76h

[{

1Ah

/?

35h

I

50h

]}

1Bh

RShift

36h

PgDn

51h

3. Створення лабораторного практикуму "Операційна система"

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

"Власне ядро"

Драйвери пристроїв

Системні виклики

Залежно від організації внутрішніх взаємодій, ядра поділяються на "мікроядра" (microkernel) і монолітні ядра.

Системи з "мікроядром" будуються за модульним принципом, мають відокремлене ядро, і механізм взаємодії між драйверами пристроїв і процесами. За таким принципом будуються системи реального часу. Приблизно так зроблений QNX або HURD.

Монолітне ядро ​​має більш жорстку внутрішню структуру. Всі встановлені драйвера жорстко зв'язуються між собою, зазвичай прямими викликами. За такими принципами будуються звичайні операційні системи типу Linux, FreeBSD.

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

Один, окремо взятий, процесор, в один момент часу, може виконувати лише одну програму. Але до комп'ютерів пред'являються більш широкі вимоги. Мало хто, в даний час, задовольнився однозадачной операційною системою (до яких відносився DOS, наприклад). У зв'язку з цим розробники процесорів передбачили мультизадачні можливості.

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

Для того щоб програма не могла, якимось чином, порушити працездатність системи або інших програм, розробники процесорів передбачили механізми захисту.

Процесор надає 4 "кільця захисту" (рівня привілеїв), можна було б використовувати всі, але це пов'язано з труднощами взаємодії програм різного рівня захисту. Тому в більшості існуючих систем використовують два уровня.0 - привілейований рівень (ядро) і 3 - непривілейований (користувальницькі програми).

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

На "Власне ядро" покладаються функції менеджера пам'яті і процесів. Переключення процесів - це основний момент нормального функціонування системи. Драйвера не повинні "гальмувати", а тим більше блокувати роботу ядра. Windows - наочний приклад того, що цього не можна допустити!

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

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

Системні виклики - це інтерфейс між процесами і ядром (читайте-залізом). Ніяких інших методів взаємодії процесів з пристроями комп'ютера бути не повинно. Системних викликів досить багато, на Linux їх 190, на FreeBSD їх близько 350, причому здебільшого вони збігаються, відповідаючи стандарту POSIX (стандарт, що описує системні виклики в UNIX). Різниця полягає в передачі параметрів, що легко буде передбачити. Природно, ми не зможемо зробити ядро, що працює одночасно на Linux і на FreeBSD, але окремо сумісність цілком реалізовується.

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

Ядро системи при розподілі пам'яті оперує 4-х кілобайтні сторінками.

Сторінки можуть використовуватися самим ядром, для потреб драйверів (кешування, наприклад), або для процесів.

Програма або процес складається з наступних частин:

Сегмент коду. Може тільки виконуватися, сама програма його не прочитати, не переписати не може! Використати для цього сегменту swap не потрібно, при необхідності код зчитується прямо з файлу;

Сегмент даних складається з трьох частин:

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

Початкові дані. Бере участь у процесі свопінгу;

Чи не початкові дані. Так само бере участь в свопінгу;

Сегмент стека. Так само бере участь в свопінгу.

Але, звичайно, системи ділять сегмент даних на дві частини: початкові дані і не початкові дані.

Всі сегменти розбиваються на сторінки. Сегмент коду має постійний розмір. Сегмент даних може збільшуватися у бік великих адрес. Сегмент стека, оскільки росте вниз, збільшується у бік зменшення адрес. Сторінки пам'яті для додаткових даних або стека виділяються системою в міру необхідності.

Дуже цікавий момент:

При виконанні програми операційна система робить наступні дії:

Готує для програми локальну таблицю дескрипторів;

Готує для програми каталог сторінок, всі сторінки позначаються як не присутні в пам'яті.

Все.

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

Ще один цікавий момент:

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

Лабораторна робота № 1.

Завантаження операційної системи

Мета роботи: Створити завантажувальний диск для операційної системи.

Теоретичні поняття.

Які функції виконує операційна система?

Операційна система повинна виконує наступні функції:

Забезпечувати завантаження призначених для користувача програм в оперативну пам'ять і їх виконання;

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

Забезпечувати роботу з пристроями довгострокової пам'яті, такими як магнітні диски, стрічки, оптичні диски і т.д.

Надавати більш-менш стандартизований доступ до різних периферійних пристроїв.

Надавати деякий користувальницький інтерфейс.

Що таке завантажувальний монітор і яке його призначення?

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

У чому відмінність завантажувального монітора від консольного монітора?

На відміну від завантажувального монітора, консольний монітор дозволяє проглядати вміст пам'яті за заданою адресою, записувати туди дані, запускати якусь область пам'яті як програму. На консольному моніторі можна навіть писати програми, майже з таким же успіхом, як на асемблері.

Наведіть визначення первинного завантажника.

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

Що таке бутстрапа?

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

Як відбувається завантаження операційної системи?

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

Можливий варіант завантаження по мережі: ПЗУ, встановлене на мережевій карті, посилає в мережу пакету стандартного змісту, який містить запит до сервера віддаленого завантаження. Цей сервер передає по мережі вторинний завантажувач і т.д.

У чому перевага модульного програмування ОС?

Переваги модульного програмування ОС полягають у можливості динамічної збірки ядра операційної системи при завантаженні, при якій додаткові модулі підвантажуються вже після старту самого ядра. Це допускає підвантаження модулів по запиту, при цьому підсистеми, потрібні тільки інколи, можуть не завантажитися взагалі. Навіть ті модулі, які потрібні завжди, можуть проініціалізувати, тільки коли стануть потрібні, зменшивши тим самим час від початку завантаження до старту деяких сервісів. Друга перевага полягає в можливості реконфигурирован систему без перезавантаження, що особливо корисно для систем колективного користування. І, нарешті, можливість вивантаження модулів ядра іноді (але не завжди, а лише якщо поломка не заважає драйверу коректно звільнити ресурси) дозволяє коригувати роботу окремих підсистем без перезавантаження всієї ОС і призначених для користувача додатків.

Завантажувач boot. asm

kernel_segequ1000h

org 100h

start:

jmp begin

begin:

mov ax, kernel_seg

mov es, ax

mov bx, 100h

call Write

exit:

call far kernel_seg: 0100h

ret

procwrite

mov al, 1h

mov dl, 0

xor ch, ch

mov cl, 2h

mov dh, 0

mov ah, 02h

int 13h

ret

endp Write

end start

Ядро kernel. asm

code segment para public 'code'

assume cs: code, ds: code, ss: code, es: code

org 100h

main proc

jmp EndData

string db "Operatsionnaea Sisteam studenta Makarova Anatoliea, grupa TI-065"

string_len equ $-string

EndData:

xor ax, ax

mov bh, 07h

xor cx, cx

mov dx, 0184fh

mov ah, 06h

int 10h

mov ah, 13h

xor al, al

xor bh, bh

mov cx, string_len

mov bl, 06h

mov bp, offset string

mov dl, 10

mov dh, 10

int 10h

mov ah, 00h

int 16h

main endp

code ends

end main

Висновок:

Я навчився реалізовувати завантаження операційної системи. Вивчив основні моменти і правила виклику адрес пам'яті.

Лабораторна робота № 2.

Меню операційної системи

Мета роботи: Створити меню для операційної системи і перехоплення натискання клавіш.

Завдання: Створити меню для операційної системи, кожне меню містить свою клавішу, яку треба буде відловлювати програмно, виконати оновлення екрану.

Нові додавання:

У процедурі PresKey відбувається обробка натиснення клавіш, з подальшим виведенням повідомлення на екран через процедуру print_string.

; - -------------------------------------------

PresKeyPROC

Again:

mov ah, 00h

int 16h

cmp al, 0

jne Again

cmp ah, 3Bh; Pres F1?

je F1

cmp ah, 3Ch; Pres F2?

je F2

cmp ah, 3Dh; Pres F3?

je F3

cmp ah, 3Eh; Pres F4?

je F4

cmp ah, 3Fh; Pres F5?

je F5

cmp ah, 40h; Pres F6?

je F6

jmp Again

F1:

leasi, mes1

callprint_string

jmp Again


F2:

leasi, mes2

callprint_string

jmp Again

F3:

leasi, mes3

callprint_string

jmp Again

F4:

call clear_screen

jmp Again

F5:

leasi, mes5

callprint_string

jmp Again

F6:

leasi, mes6

callprint_string

hlt

ret

ENDPPresKey


За виведення повідомлення відповідає процедура print_string. Друк відбувається за символьне, схоже на teletype.

print_string proc near

push ax; store registers ...

push si;

next_char:

mov al, [si]

cmp al, 0

jz printed

inc si

mov ah, 0eh; teletype function.

int 10h

jmp next_char

printed:

pop si; re-store registers ...

pop ax;

ret

print_string endp

В ОС передбачено оновлення екрану, необхідна для коректного відображення меню. Запобігає його зміщення.

clear_screen proc near

push ax; store registers ...

push ds;

push bx;

push cx;

push di;

mov ax, 40h

mov ds, ax; for getting screen parameters.

mov ah, 06h; scroll up function id.

mov al, 0; scroll all lines!

mov bh, 10011111b; attribute for new lines.

mov ch, 0; upper row.

mov cl, 0; upper col.

mov di, 84h; rows on screen - 1, mov dh, [di]; lower row (byte).

mov di, 4ah; columns on screen,

mov dl, [di]

dec dl; lower col.

int 10h

; Set cursor position to top

; Of the screen:

mov bh, 0; current page.

mov dl, 0; col.

mov dh, 0; row.

mov ah, 02


int 10h

pop di; re-store registers ...

pop cx;

pop bx;

pop ds;

pop ax;

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menu_len

mov bl, 11

mov bp, offset menu

mov dl, 10

mov dh, 18h

int 10h

mov ah, 13h

xor al, al

xor bh, bh

mov cx, string_len

mov bl, 19h

mov bp, offset string

mov dl, 10

mov dh, 0

int 10h

ret

clear_screen endp

Код робочої програми:

. model small

CSEG segment

assume cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG

; - --------------------------------------------- -

Start:

jmp EndData

mes1DB13, 10, 'Pres <F1>', 0Dh, 0Ah, 0

mes2DB13, 10, 'Pres <F2>', 0Dh, 0Ah, 0

mes3DB13, 10, 'Pres <F3>', 0Dh, 0Ah, 0

mes5DB13, 10, 'Pres <F5>', 0Dh, 0Ah, 0

mes6DB13, 10, 'Pres <F6>', 0Dh, 0Ah, 0

string db "Operatsionnaea Sisteam studenta Macarova Anatoliea, grupa TI-065"

string_len equ $-string

menu DB "F1 Help F2 Command F3 Calculator F4 ClearScreen F5 About F6 Exit"

menu_len equ $-menu

EndData:

mov ax, cs

mov es, ax

mov ds, ax

xor di, di

xor si, si

xor dx, dx

xor bx, bx

xor cx, cx

mov ss, ax

mov sp, 0FFFEh

call clear_screen

call PresKey

Exit:

mov ah, 00h

int 16h

hlt

; - -----------------------------------------------

PresKeyPROC

Again:

mov ah, 00h

int 16h

cmp al, 0

jne Again

cmp ah, 3Bh; Pres F1?

je F1

cmp ah, 3Ch; Pres F2?

je F2

cmp ah, 3Dh; Pres F3?

je F3

cmp ah, 3Eh; Pres F4?

je F4

cmp ah, 3Fh; Pres F5?

je F5

cmp ah, 40h; Pres F6?

je F6

jmp Again

F1:

leasi, mes1

callprint_string

jmp Again

F2:

leasi, mes2

callprint_string

jmp Again

F3:

leasi, mes3

callprint_string

jmp Again

F4:

call clear_screen

jmp Again

F5:

leasi, mes5

callprint_string

jmp Again

F6:

leasi, mes6

callprint_string

hlt

ret

ENDPPresKey

; Print a null terminated string at current cursor position,

; String address: ds: si

print_string proc near

push ax; store registers ...

push si;

next_char:

mov al, [si]

cmp al, 0

jz printed

inc si

mov ah, 0eh; teletype function.

int 10h

jmp next_char

printed:

pop si; re-store registers ...

pop ax;

ret

print_string endp

; Clear the screen by scrolling entire screen window,

; And set cursor position on top.

; Default attribute is set to white on blue.

clear_screen proc near

push ax; store registers ...

push ds;

push bx;

push cx;

push di;

mov ax, 40h

mov ds, ax; for getting screen parameters.

mov ah, 06h; scroll up function id.

mov al, 0; scroll all lines!

mov bh, 10011111b; attribute for new lines.

mov ch, 0; upper row.

mov cl, 0; upper col.

mov di, 84h; rows on screen - 1, mov dh, [di]; lower row (byte).

mov di, 4ah; columns on screen,

mov dl, [di]

dec dl; lower col.

int 10h

; Set cursor position to top

; Of the screen:

mov bh, 0; current page.

mov dl, 0; col.

mov dh, 0; row.

mov ah, 02

int 10h

pop di; re-store registers ...

pop cx;

pop bx;

pop ds;

pop ax;

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menu_len

mov bl, 11

mov bp, offset menu

mov dl, 10

mov dh, 18h

int 10h

mov ah, 13h

xor al, al

xor bh, bh

mov cx, string_len

mov bl, 19h

mov bp, offset string

mov dl, 10

mov dh, 0

int 10h

ret

clear_screen endp

CSEG ends

end Start

Висновки:

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

Лабораторна робота № 3.

Вікна операційної системи, реалізація меню

Мета роботи: Створити вікна для операційної системи і перехоплення натискання клавіш для меню та їх реалізація.

Завдання: Створити вікна для операційної системи, для прикладу вікно About, так само зробити перезавантаження комп'ютера, задіюючи кнопку F6.

Нові додавання:

У Data segment визначаю значення, які будуть використані для відображення меню: Нижня головне меню і верхнє назву ОС. Так само і для вікна About, яке вже складено у цьому значення з символів. Дане вікно і меню промальовуватиметься посимвольний за допомогою процедури print_string.

string db "Operatsionnaea Sistema studenta Macarova Anatoliea, grupa TI-065"

string_len equ $-string

menuText DB "F1 Save F2 Read F3 New Write F4 Close"

menuText_len equ $-menuText

menu DB "F1 Bloknot F2 Change PAss F3 Convertor F4 ClearScreen F5 About F6 Exit"

menu_len equ $-menu

About DB 13,10

db '+----------------------------------------------- - + ', 0Dh, 0Ah

db '| XXXXXXXXXXXXXXXX About Makar OS XXXXXXXXXXXXXXXX |', 0Dh, 0Ah

db '+----------------------------------------------- - | ', 0Dh, 0Ah

db '| |', 0Dh, 0Ah

db '| +----------------------------------------+ |', 0Dh, 0Ah

db '| | | |', 0Dh, 0Ah

db '| | @ @ @ @ Makar OS A 1.5 | |', 0Dh, 0Ah

db '| | @ @ @ @ | |', 0Dh, 0Ah

db '| | Copiright (C) 2008 | |', 0Dh, 0Ah

db '| | Author Macarov Anatoli TI-065 | |', 0Dh, 0Ah

db '| | All Rights Reserved | |', 0Dh, 0Ah

db '| +----------------------------------------+ |', 0Dh, 0Ah

db '| |', 0Dh, 0Ah

db '| +-----------+ |', 0Dh, 0Ah

db '| |#### OK #####| |', 0Dh, 0Ah

db '| +-----------+ |', 0Dh, 0Ah

db '+----------------------------------------------- - + ', 0Dh, 0Ah, 0

About_len equ $-About

Процедура print_string забезпечує посимвольним висновок. Передача в регістр si дані і після викликати процедуру, ви отримаєте результат.

print_string proc near

push ax; store registers ...

push si;

next_char:

mov al, [si]

cmp al, 0

jz printed

inc si

mov ah, 0eh; teletype function.

int 10h

jmp next_char

printed:

pop si; re-store registers ...

pop ax;

ret

print_string endp

Даний код програми реалізує перезавантаження ОС, для активації необхідно натиснути F6. Після цього піде повідомлення про те, що треба витягти флоппі дискету і натиснути будь-яку кнопку і тоді відбудеться перезавантаження.

; + + + 'Quit', 'exit', 'reboot' + + +

reboot_command:

call clear_screen

leasi, Please

callprint_string

mov ax, 0; wait for any key ... .

int 16h

; Store magic value at 0040h: 0072h:

; 0000h - cold boot.

; 1234h - warm boot.

; Mov ax, 0040h

; Mov ds, ax

; Mov w. [0072h], 0000h; cold boot.

; Jmp 0ffffh: 0000h; reboot!

int 19h

Висновки:

Виконавши дану лабораторну роботу, я вивчив кілька способів перезавантаження ОС. Пізнав ази формування вікон на assembler'е. Дізнався які використовуються переривання для BIOS.

Лабораторна робота № 4.

Конвертор з символу в ASCII код

Мета роботи: Доповнити меню ОС.

Завдання: Створити конвертор, що забезпечує отримати з символу ASCII код, задіюючи кнопку F3.

Нові додавання:

Алгоритм конвертації простий: поки приватне не дорівнює 0, ділимо його, ділимо і ще раз ділимо на 10d, запихаючи залишки в стек. Потім - витягаємо з стека. Ось і вся конвертація з HEX в BIN. Це якщо в двох словах.

А якщо детальніше, то ось що виходить:

1 - готуємо ділене. Як вже говорилося, воно у нас задається неявно - обов'язково через AX. А параметр у нас - через DX процедурі передається. Ось і переміщаємо.

2 - це, власне, дільник.

3 - очищаємо CX. Він у нас буде як лічильник.

4 - очищаємо DX. Якщо не очистимо, то ми не 1234h яке-небудь на 10 ділити будемо, а 12341234h. Перше 1234 нам треба - очищати.

5 - ділимо. Приватне - в AX, залишок - в DX.

6 - заносимо залишок DX в стек.

7 - CX = CX +1. Це ми вважаємо скільки разів заносили залишок у стек, по колу (стрибок на мітку non_zero), поки AX не дорівнює 0 (8). Тобто ділимо, ділимо AX, поки він не виявиться таким, що ділити, власне, нічого.

Ділення закінчено, число, яке ми поділили AX до його повного скасування, зберігається в CX.

Далі все просто. Нам потрібна така ж кількість разів CX витягти значення DX з стека. І це буде "HEX", переведений у DEC. (Воно ж: число в двійковому коді, розібране на послідовність десяткових цифр).

Цикл, в тілі якого витягти цифру (9) і надрукувати цифру (10). Стільки ж разів, скільки ми і ділили наше вихідне шістнадцяткове число.

write_decimal proc

push ax

push cx

push dx

push bx

mov ax, dx; (1)

mov bx, 10d, (2)

xor cx, cx; (3)

non_zero:

xor dx, dx; (4)

div bx; (5)

push dx; (6)

inc cx; (7)

cmp ax, 0; (8)

jne non_zero

write_digit_loop:

pop dx; (9)

call write_hex_digit; (10)

loop write_digit_loop

pop bx

pop dx

pop cx

pop ax

ret

write_decimal endp

WRITE_HEX_DIGIT proc

push DX

xor dh, dh

cmp DL, 0Ah

jae HEX_LETTER

add DL, 30h

JMP WRITE_DIGIT

HEX_LETTER:

add DL, 37h

WRITE_DIGIT:

call WRITE_CHAR

pop DX

ret

WRITE_HEX_DIGIT endp

WRITE_CHAR proc

push AX

push BX

push CX

mov AH, 9

xor BH, BH

mov BL, 00000111b

mov CX, 1

mov AL, DL

int 10h

call CURSOR_RIGHT

pop CX

pop BX

pop AX

ret

WRITE_CHAR endp

CURSOR_RIGHT proc

push DX

call CURSOR_READ

inc DL

call CURSOR_SET

pop DX

ret

CURSOR_RIGHT endp

CURSOR_READ proc

push AX

push BX

push CX

mov AH, 3

xor BH, BH

int 10h

pop CX

pop BX

pop AX

ret

CURSOR_READ endp

CURSOR_SET proc

push AX

push BX

push CX

mov AH, 2

xor BH, BH

int 10h

pop CX

pop BX

pop AX

ret

CURSOR_SET endp

Висновки:

Виконавши дану лабораторну роботу, я вивчив алгоритм перетворення шістнадцяткового числа на десяткове. Так як символ в регістрі зберігається в HEX форматі.

Лабораторна робота № 5.

Динамічний пароль для входу в ОС

Мета роботи: Доповнити меню ОС.

Завдання: Створити Паролювання ОС, задіюючи кнопку F2.

Нові додавання:

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

writ db 13,10, 'Write sector', 0Dh, 0Ah, 0

sect db 1; sector number (1.. 18).

cyld db 10; cylinder number (0.. 79).

head db 0; head number (0.. 1).

drive db 0; drive number (0.. 3); A: = 0, B: = 1 ...

BUFFERDB 512 dup (0); prosto izmenili razmer do 512

Passworddb512 dup (0)

changepass proc

push ax

push bx

push cx

push si

call clear_screen

lea si, PassMsg

call print_string

xor bx, bx

lpss:

mov ah, 00h

int16h

cmpal, 13

jelConv1

mov [Password + bx], al

movah, 0eh

int10h

incbx

jmplpss

lConv1:

call writesec

call readsec; scitivau dlea proverki

lea si, BUFFER

call print_string

pop si

pop cx

pop bx

pop ax

ret

changepass ENDP

Процедура writesec забезпечує запис даних в 10 циліндр, в 1 сектор, з 0 голівки. Заздалегідь заповнений буфер Password, буде поміщений у регістр bx для запису.

writesec proc; zapisivau dannie

push ax

push bx

push cx

push dx

lea si, writ

call print_string

wr: mov ah, 03h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, cyld; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset Password

mov [Password + 6], 0

int 13h

jc er

jmp e2e

er: lea dx, e2

mov ah, 9

int 21h

jmp e2e

e2 db "i / o error ...", 0Dh, 0Ah, '$'

e2e:

pop dx

pop cx

pop bx

pop ax

ret

ENDP writesec

Процедура readsec забезпечує зчитування даних з колишніх секторів в буфер BUFFER. Далі цей буфер можна використовувати в порівняння з наведеним паролем або просто вивести на екран.

readsec proc; scitivau dannie

push ax

push bx

push cx

push dx

mov ah, 02h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, cyld; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset BUFFER

int 13h

mov [BUFFER +6], 0

pop dx

pop cx

pop bx

pop ax

ret

ENDP readsec

Процедура EnterPass проводить порівняння виїденого пароля з поточному зареєстрованим паролем, що записаний в сектор. Порівняння відбувається за допомогою команди repe cmpsb. При введенні пароля передбачено переховування символів під зірочкою.

EnterPassPROC

push ax

push bx

push cx

push si

xorbx, bx

lPass:

mov ah, 00h; vvoju paroli

int16h

cmpal, 13

jelCompare

mov [Password + bx], al

movah, 0eh

moval, '*'

int10h

incbx

jmplPass

lCompare:

call readsec

leasi, Password

leadi, BUFFER

cld

movcx, 6

repecmpsb; sravnenie

jnelErr

jmplNext

lErr:; owibka

lea si, ENTERR

call print_string

leasi, ErrPassMsg

callprint_string

call Exit

lNext:; Paroli OK

lea si, ENTERR

call print_string

leasi, OkMsg

callprint_string

pop si

pop cx

pop bx

pop ax

; Call PresKey

ret

ENDPEnterPass

; - -----------------------------------------------

Висновки:

Виконавши дану лабораторну роботу, я вивчив команди переривання вводу / виводу біоса. Навчився записувати на флоппі диск у певний циліндр і сектор. Отримав досвід в порівняння двох рядків.

Лабораторна робота № 6.

Блокнот для ОС

Мета роботи: Блокнот для ОС.

Завдання: Створити блокнот для запису даних на флоппі диск для подальшого прочитання, задіюючи кнопку F1.

Нові додавання:

У даної ОС передбачений блокнот, він забезпечує запис даних на флоппі диск. Для активації блокнота вам треба натиснути F1. Після цього піде меню самого блокнота в якому ви можете прочитати поточні дані, вести дані для запису, вийти. Запис і читання даних відбувається так само як і в 5 лабораторній роботі за допомогою команд біоса, тільки тут задіяний 11 циліндр і 1 сектор. Даних розраховане на 512 байт.д.анная процедура редагувати дані не може.

; - ----------------------------------------------

EditText proc

push ax

push bx

push cx

push dx

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menuText_len

mov bl, 11

mov bp, offset menuText

mov dl, 8

mov dh, 18h

int 10h

mov ah, 02h

mov bh, 0

mov dh, 2

mov dl, 1

int 10h

AgainTe:

mov ah, 00h

int 16h

cmp al, 0

jne AgainTe

cmp ah, 3Ch; Pres F2?

je F2t

cmp ah, 3Dh; Pres F3?

je F3t

cmp ah, 3Eh; Pres F4?

je F4t

jmp AgainTe

F2t:

jmp readtext

F3t:

call clear_screen

jmp writetext

F4t:

call clear_screen

jmp the_end

writetext:

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menuText_len

mov bl, 11

mov bp, offset menuText

mov dl, 8

mov dh, 18h

int 10h

mov ah, 02h

mov bh, 0

mov dh, 2

mov dl, 1

int 10h

xor bx, bx

lp:

mov ah, 00h

int16h

cmp ah, 3Bh

jelC

cmpah, 3Eh

jeF4t

mov [Editor + bx], al

movah, 0eh

int10h

incbx

jmplp

lC:

mov ah, 03h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, 11; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset Editor

int 13h

jmp the_end

readtext:

mov ah, 02h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, 11; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset BUFFER

int 13h

mov [BUFFER +512], 0

call clear_screen

lea si, BUFFER

call print_string

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menuText_len

mov bl, 11

mov bp, offset menuText

mov dl, 8

mov dh, 18h

int 10h

mov ah, 02h

mov bh, 0

mov dh, 2

mov dl, 1

int 10h

jmp AgainTe

the_end:

pop dx

pop cx

pop bx

pop ax

ret

endp EditText

Код програми ОС:

. model small

CSEG segment

assume cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG

; - --------------------------------------------- -

Start:

jmp EndData

mes1DB13, 10, 'Pres <F1>', 0Dh, 0Ah, 0

mes2DB13, 10, 'PASSS is ... ', 0Dh, 0Ah, 0

writ db 13,10, 'Write sector', 0Dh, 0Ah, 0

sect db 1; sector number (1.. 18).

cyld db 10; cylinder number (0.. 79).

head db 0; head number (0.. 1).

drive db 0; drive number (0.. 3); A: = 0, B: = 1 ...

BUFFERDB 512 dup (0); prosto izmenili razmer do 512

Passworddb512 dup (0)

EditorDB512 dup (0)

PassMsgdb13, 10, 'Enter password:', 0Dh, 0Ah, 0

OkMsgdb13, 10, '-> OK', 0Dh, 0Ah, 0

ErrPassMsg db13, 10, 'Password incorrect', 0Dh, 0Ah, 0

ConvEnterSy db13, 10, 'Convertor symbol in ASCII v1.0', 0Dh, 0Ah

db13, 10, 'Enter symbol:', 0

ConResultAdb 'Result ASCII:', 0

string db "Operatsionnaea Sistema studenta Macarova Anatoliea, grupa TI-065"

string_len equ $-string

menuText DB "F1 Save F2 Read F3 New Write F4 Close"

menuText_len equ $-menuText

menu DB "F1 Bloknot F2 Change PAss F3 Convertor F4 ClearScreen F5 About F6 Exit"

menu_len equ $-menu

About DB 13,10

db '+----------------------------------------------- - + ', 0Dh, 0Ah

db '| XXXXXXXXXXXXXXXX About Makar OS XXXXXXXXXXXXXXXX |', 0Dh, 0Ah

db '+----------------------------------------------- - | ', 0Dh, 0Ah

db '| |', 0Dh, 0Ah

db '| +----------------------------------------+ |', 0Dh, 0Ah

db '| | | |', 0Dh, 0Ah

db '| | @ @ @ @ Makar OS A 1.5 | |', 0Dh, 0Ah

db '| | @ @ @ @ | |', 0Dh, 0Ah

db '| | Copiright (C) 2008 | |', 0Dh, 0Ah

db '| | Author Macarov Anatoli TI-065 | |', 0Dh, 0Ah

db '| | All Rights Reserved | |', 0Dh, 0Ah

db '| +----------------------------------------+ |', 0Dh, 0Ah

db '| |', 0Dh, 0Ah

db '| +-----------+ |', 0Dh, 0Ah

db '| |#### OK #####| |', 0Dh, 0Ah

db '| +-----------+ |', 0Dh, 0Ah

db '+----------------------------------------------- - + ', 0Dh, 0Ah, 0

About_len equ $-About

Please db 13,10, "please eject any floppy disks"

db 13,10, "and press any key to reboot ...", 0

ENTERR db 13,10, "", 0

EndData:

mov ax, cs

mov es, ax

mov ds, ax

xor di, di

xor si, si

xor dx, dx

xor bx, bx

xor cx, cx

mov ss, ax

mov sp, 0FFFEh

; Blinking disabled for compatibility with dos / bios,

; Emulator and windows prompt never blink.

mov ax, 1003h

mov bx, 0; disable blinking.

int 10h

leasi, PassMsg

callprint_string

callEnterPass

call clear_screen

call PresKey

Exit:

mov ah, 00h

int 16h

hlt

; - -----------------------------------------------

PresKeyPROC

Again:

mov ah, 00h

int 16h

cmp al, 0

jne Again

cmp ah, 3Bh; Pres F1?

je F1

cmp ah, 3Ch; Pres F2?

je F2

cmp ah, 3Dh; Pres F3?

je F3

cmp ah, 3Eh; Pres F4?

je F4

cmp ah, 3Fh; Pres F5?

je F5

cmp ah, 40h; Pres F6?

je F6

jmp Again

F1:

call EditText

jmp Again

F2:

call changepass

jmp Again

F3:

callconvert

jmp Again

F4:

call clear_screen

jmp Again

F5:

call clear_screen

lea si, About

call print_string

jmp Again

F6:

callreboot_command

hlt

ret

ENDPPresKey

; - --------------------------------------------- -

; + + + 'Quit', 'exit', 'reboot' + + +

reboot_command:

call clear_screen

leasi, Please

callprint_string

mov ax, 0; wait for any key ... .

int 16h

; Store magic value at 0040h: 0072h:

; 0000h - cold boot.

; 1234h - warm boot.

; Mov ax, 0040h

; Mov ds, ax

; Mov w. [0072h], 0000h; cold boot.

; Jmp 0ffffh: 0000h; reboot!

int 19h

; ++++++++++++++++++++++++++

; - -----------------------------------------------

; Print a null terminated string at current cursor position,

; String address: ds: si

print_string proc near

push ax; store registers ...

push si;

next_char:

mov al, [si]

cmp al, 0

jz printed

inc si

mov ah, 0eh; teletype function.

int 10h

jmp next_char

printed:

pop si; re-store registers ...

pop ax;

ret

print_string endp

; - ----------------------------------------------

EditText proc

push ax

push bx

push cx

push dx

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menuText_len

mov bl, 11

mov bp, offset menuText

mov dl, 8

mov dh, 18h

int 10h

mov ah, 02h

mov bh, 0

mov dh, 2

mov dl, 1

int 10h

AgainTe:

mov ah, 00h

int 16h

cmp al, 0

jne AgainTe

cmp ah, 3Ch; Pres F2?

je F2t

cmp ah, 3Dh; Pres F3?

je F3t

cmp ah, 3Eh; Pres F4?

je F4t

jmp AgainTe

F2t:

jmp readtext

F3t:

call clear_screen

jmp writetext

F4t:

call clear_screen

jmp the_end

writetext:

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menuText_len

mov bl, 11

mov bp, offset menuText

mov dl, 8

mov dh, 18h

int 10h

mov ah, 02h

mov bh, 0

mov dh, 2

mov dl, 1

int 10h

xor bx, bx

lp:

mov ah, 00h

int16h

cmp ah, 3Bh

jelC

cmpah, 3Eh

jeF4t

mov [Editor + bx], al

movah, 0eh

int10h

incbx

jmplp

lC:

mov ah, 03h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, 11; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset Editor

int 13h

jmp the_end

readtext:

mov ah, 02h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, 11; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset BUFFER

int 13h

mov [BUFFER +512], 0

call clear_screen

lea si, BUFFER

call print_string

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menuText_len

mov bl, 11

mov bp, offset menuText

mov dl, 8

mov dh, 18h

int 10h

mov ah, 02h

mov bh, 0

mov dh, 2

mov dl, 1

int 10h

jmp AgainTe

the_end:

pop dx

pop cx

pop bx

pop ax

ret

endp EditText

; - -----------------------------------------------

changepass proc

push ax

push bx

push cx

push si

call clear_screen

lea si, PassMsg

call print_string

xor bx, bx

lpss:

mov ah, 00h

int16h

cmpal, 13

jelConv1

mov [Password + bx], al

movah, 0eh

int10h

incbx

jmplpss

lConv1:

call writesec

call readsec; scitivau dlea proverki

lea si, BUFFER

call print_string

pop si

pop cx

pop bx

pop ax

ret

changepass ENDP

; - -----------------------------------------------

writesec proc; zapisivau dannie

push ax

push bx

push cx

push dx

lea si, writ

call print_string

wr: mov ah, 03h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, cyld; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset Password

mov [Password + 6], 0; prosto dobavili v konec 0 - dlea correctnogo vivoda na ekran i sravnenia parolei

int 13h

jc er

jmp e2e

er: lea dx, e2

mov ah, 9

int 21h

jmp e2e

e2 db "i / o error ...", 0Dh, 0Ah, '$'

e2e:

pop dx

pop cx

pop bx

pop ax

ret

ENDP writesec

; - -----------------------------------------------

readsec proc; scitivau dannie

push ax

push bx

push cx

push dx

mov ah, 02h

mov al, 1; write 1 sector (512 bytes).

mov cl, sect; sector (1.. 18)

mov ch, cyld; cylinder (0.. 79)

mov dh, head; head (0.. 1)

mov dl, drive; always 0 (A:)

mov bx, offset BUFFER

int 13h

mov [BUFFER +6], 0; prosto dobavili v konec 0 - dlea correctnogo vivoda na ekran i sravnenia parolei

pop dx

pop cx

pop bx

pop ax

ret

ENDP readsec

; - -----------------------------------------------

EnterPassPROC

push ax

push bx

push cx

push si

xorbx, bx

lPass:

mov ah, 00h; vvoju paroli

int16h

cmpal, 13

jelCompare

mov [Password + bx], al

movah, 0eh

moval, '*'

int10h

incbx

jmplPass

lCompare:

call readsec

leasi, Password

leadi, BUFFER

cld

movcx, 6

repecmpsb; sravnenie

jnelErr

jmplNext

lErr:; owibka

lea si, ENTERR

call print_string

leasi, ErrPassMsg

callprint_string

call Exit

lNext:; Paroli OK

lea si, ENTERR

call print_string

leasi, OkMsg

callprint_string

pop si

pop cx

pop bx

pop ax

; Call PresKey

ret

ENDPEnterPass

; - -----------------------------------------------

; - -----------------------------------------------

convert PROC

push ax

push bx

push cx

push si

CAgain:

call clear_screen

lea si, ConvEnterSy

call print_string

xor bx, bx

mov ah, 00h

int 16h

mov dl, al

mov ah, 0eh

int 10h

lConv:

lea si, ConResultA

call print_string

call write_decimal

CheEnter:

mov ah, 00h

int 16h

cmp al, 13

je CAgain

cmp al, 1Bh

je ESCB

jmp CheEnter

ESCB:

call clear_screen

call PresKey

pop si

pop cx

pop bx

pop ax

ret

ENDP convert

; - -----------------------------------------------

; - -----------------------------------------------

; Clear the screen by scrolling entire screen window,

; And set cursor position on top.

; Default attribute is set to white on blue.

clear_screen proc near

push ax; store registers ...

push ds;

push bx;

push cx;

push di;

mov ax, 40h

mov ds, ax; for getting screen parameters.

mov ah, 06h; scroll up function id.

mov al, 0; scroll all lines!

mov bh, 10011111b; attribute for new lines.

mov ch, 0; upper row.

mov cl, 0; upper col.

mov di, 84h; rows on screen - 1, mov dh, [di]; lower row (byte).

mov di, 4ah; columns on screen,

mov dl, [di]

dec dl; lower col.

int 10h

; Set cursor position to top

; Of the screen:

mov bh, 0; current page.

mov dl, 0; col.

mov dh, 0; row.

mov ah, 02

int 10h

pop di; re-store registers ...

pop cx;

pop bx;

pop ds;

pop ax;

mov ah, 13h

xor al, al

xor bx, bx

xor dx, dx

mov cx, menu_len

mov bl, 11

mov bp, offset menu

mov dl, 8

mov dh, 18h

int 10h

mov ah, 13h

xor al, al

xor bh, bh

mov cx, string_len

mov bl, 19h

mov bp, offset string

mov dl, 10

mov dh, 0

int 10h

lea si, ENTERR

call print_string

ret

clear_screen endp

; - ------------------------------------------------ ------

; - -----------------------------------------------

write_decimal proc

push ax

push cx

push dx

push bx

mov ax, dx; (1)

mov bx, 10d, (2)

xor cx, cx; (3)

non_zero:

xor dx, dx; (4)

div bx; (5)

push dx; (6)

inc cx; (7)

cmp ax, 0; (8)

jne non_zero

write_digit_loop:

pop dx; (9)

call write_hex_digit; (10)

loop write_digit_loop

pop bx

pop dx

pop cx

pop ax

ret

write_decimal endp

WRITE_HEX_DIGIT proc

push DX

xor dh, dh

cmp DL, 0Ah

jae HEX_LETTER

add DL, 30h

JMP WRITE_DIGIT

HEX_LETTER:

add DL, 37h

WRITE_DIGIT:

call WRITE_CHAR

pop DX

ret

WRITE_HEX_DIGIT endp

WRITE_CHAR proc

push AX

push BX

push CX

mov AH, 9

xor BH, BH

mov BL, 00000111b

mov CX, 1

mov AL, DL

int 10h

call CURSOR_RIGHT

pop CX

pop BX

pop AX

ret

WRITE_CHAR endp

CURSOR_RIGHT proc

push DX

call CURSOR_READ

inc DL

call CURSOR_SET

pop DX

ret

CURSOR_RIGHT endp

CURSOR_READ proc

push AX

push BX

push CX

mov AH, 3

xor BH, BH

int 10h

pop CX

pop BX

pop AX

ret

CURSOR_READ endp

CURSOR_SET proc

push AX

push BX

push CX

mov AH, 2

xor BH, BH

int 10h

pop CX

pop BX

pop AX

ret

CURSOR_SET endp

; - ------------------------------------------------ ----- -

CSEG ends

end Start

Висновки:

Виконавши дану лабораторну роботу, я вивчив команди переривання вводу / виводу біоса. Навчився записувати на флоппі диск велику кількість даних. Даний курс дав мені основні поняття по операційним системам.

Висновок

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

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

Одне з таких напрямків розглянуто в даній роботі - використання в лабораторному практикумі комп'ютерного моделювання на базі програмного пакету Emu8086.

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

До теперішнього часу, студенти виконували лабораторні роботи на Лабораторній установці, яка складається з навчального мікропроцесорного комплекту (УМК), що випускається ризьким заводом "ВЕФ", набору модулів, що підключаються до її системної шині і різних периферійних пристроїв УМК є навчальну мікро-ЕОМ, призначену для вивчення програмування, пооектірованія і налаштування мікропроцесорних пристроїв і систем, виконаних на МП KP580.

Як вже зрозуміло, ризький завод "ВЕФ", вже знаходитися в іншій державі, морально і фізично застарів (вже не випускається). Мікропроцесор МП KP580В вже давно знятий з виробництва, не випускається, весь світ давно перейшов на мікропроцесори фірми Intel, AMD, Motorolla і т.д.

Останні п'ять років - лабораторний практикум виконувався на емуляторі МП086, але він був виконаний під операційну систему ДОС, ще сучасні операційні системи підтримують емуляцію ДОС, але наступні ОС перестають підтримувати ДОС.

Тому виникла потреба вибору програмного продукту, що працює під Windows.

До того ж, необхідної літератури не було, знайшов посилання, але вони тільки в загальному розповідають про роботу емулятора Emu8086. Це свого роду - перша робота про даний продукт. Може застосовуватися для проведення лабораторних робіт з дисципліни "Основи мікропроцесорної техніки", "Організація ЕОМ" і т.д.

Представлена ​​робота - це реальний лабораторний практикум для основи роботи з мікропроцесором, з використанням методів віртуальної електронної лабораторії.

Основні результати роботи такі:

Методично така практична робота чудово вписується в програму курсів, які приймаються у навчанні.

Програма має інтуїтивний інтерфейс, досить проста і практично не вимагає спеціального часу на освоєння.

Розроблено лабораторний практикум, що дозволяє швидко освоїти роботу з програмою.

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

Крім того, тематика лабораторних робіт (а можливо і курсових) виконуються в цій віртуальній лабораторії може бути дуже широка.

Дана розробка демонструє лише дуже невелику частину можливостей Emu8086.

Порівняння віртуального лабораторного практикуму з традиційним обладнанням - лабораторними стендами. Підсумок цього обгрунтування наступний:

один комп'ютер здатний замінити кілька стендів з різною тематикою робіт;

використання комп'ютерного моделювання дозволяє вивільнити частину персоналу зайнятого раніше ремонтом стендів;

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

Список використаних джерел

1. Алексенко О. Г., Шагурін І.І. "Мікросхемотехніка". Москва, вид. "Радіо і зв'язок", 1982р.

2. Ан П. Сполучення ПК із зовнішніми пристроями, ДМК.

3. Балашов Е.П., Григор'єв В.Л., Петров Г.А. Мікро - і мініЕВМ. Л.: Вища школа, 1984.376 с.

4. Басманов А.С., Широков Ю.Ф. Мікропроцесори і однокристальних мікроЕОМ: Номенклатура і функціональні можливості / Під ред.В.Г. Домрачева. М.: Вища школа, 1988.127 с.

5. Байцер Б. Архітектура обчислювальних комплексів. М.: Світ, 1974. Т.1, 2.

6. Васильєв Н. П, Горовий В.Р. Мікропроцесори: Апаратурно - програмні засоби налагодження. / Под ред. Проф.Л.Н. Преснухін. - М.: Вища школа, 1984.

7. Влах, Кишор, Сингхал. "Машинні методи аналізу та проектування електронних схем" Москва, вид. "Радіо і зв'язок", 1988р.

8. Водовозов В.М., Осипов В.О., Пожидаєв А.К. Практичне введення в інформаційні системи / ГЕТУ. СПб, 1995.

9. Вуд А. Мікропроцесори в питаннях і відповідях / Пер. з англ. М.: Вища школа, 1985.185с.

10. Гібсон Г., Лю Ю. - Ч. Апаратні та програмні засоби мікроЕОМ / Пер. з англ.В.Л. Григор'єва, Під ред.В. В. Сташіна. М.: Фінанси і статистика, 1983.255с.

11. Гівон Д, Россер Р. Мікропроцесори та мікрокомп'ютери: Вступний курс / Пер. з англ. М.: Світ, 1983.463 с.

12. Гук М. Апаратні засоби IBM PC. Енциклопедія, Пітер.

13. Дао Л. Програмування мікропроцесора 8088. - 1988.

14. Дебновецкій С.В. "Основи автоматизованого проектування електронних приладів" Київ, Вища школа, 1987р.

15. "Вимірювання параметрів цифрових інтегральних мікросхем" (за ред. Ейдукаса Д.Ю., Орлова Б. В). Москва, "Радіо і зв'язок", 1982р.

16. Казагачев В.М. Методичні вказівки до лабораторної роботи № 1 "Правила переведення чисел з однієї системи числення в іншу" з дисципліни "Основи мікропроцесорної техніки". АФ КазАТК, Актобе-2006, 40с.

17. Казагачев В.М. Методичні вказівки до лабораторної роботи № 2 "Перевірка таблиць істинності базових вентилів" з дисципліни "Основи мікропроцесорної техніки". АФ КазАТК, Актобе-2006, 22с.

18. Казагачев В.М. Основи мікропроцесорної техніки. Навчальний посібник. Актобе: - 2007р, 350С.

19. Карлів Н.В. "Всесвіт освіти: давно усвідомлена необхідність і схильність до навчання". Електронний журнал "Досліджено в Росії": 2-62, 2001.

20. Карлащук В.І. Електронна лабораторія на IBM PC. Програма Electronics Workbench і її застосування. Видання 2-е, доповнене і перероблене. Видавництво "Солон-Р", Москва, 2001 - 736с.

21. Корнєєв В. В, Кисельов А.В. "Сучасні мікропроцесори" Москва, вид. "Нолидж", 1998р.

22. Лазер І. ​​М, Темір В.А. "Стійкість цифрових мікроелектронних пристроїв" Москва, "Радіо і зв'язок", 1983р.

23. Лю Ю-Чжен, Гібсон Г. Мікропроцесори сімейства 8086/8088. Архітектура, програмування та проектування мікрокомп'ютерних систем. - 1987.

24. Лисіков Б.Г. "Арифметичні та логічні основи цифрових автоматів" Мінськ, "Вишейшая школа", 1980р.

25. Мікропроцесори: У 3-х кн. / Под ред. Преснухін. М.: Вища школа, 1986. Кн.1.495 с. Кн.2.383 с. Кн.3.351с.

26. МікроЕОМ / Пер. з англ., Під ред.А. Дірксена. М.: Енергоіздат, 1982.328 с.

27. Мячев А.А., Іванов В.В. Інтерфейси обчислювальних систем на базі міні - і мікроЕОМ / Под ред. Наумова Б.М. М.: Радіо і зв'язок, 1986.248 с.

28. Майоров С.А., Кирилов В.В., Приблуда А.А. Введення в мікроЕОМ. М.: Машинобудування, Ленінгр. від., 1988.303с.

29. Морісіта І. Апаратні засоби мікроЕОМ / Пер. з япон. М.: Світ, 1988.279с.

30. Мюллер Скотт. Модернізація і ремонт компьютера.14-видання.: Пер. з англ. - М.: Видавничий будинок "Вільямс", 2003. - 1184с. Іл. - Хрон. тит. англ.

31. Новіков Ю.В., Скоробогатов П.К. Основи мікропроцесорної техніки. Інтернет-університет інформаційних технологій - ІНТУЇТ. ру. 2004р.

32. Новіков Ю.В. Кондратенко С. В. Локальні мережі: архітектура, алгоритми, проектування, ЕКОМ.

33. Нестеров П.В. Мікропроцесори. Архітектура та її оцінка. М.: Вища школа, 1984.104с.

34. Нефедов А. В, Савченко О.М., Феоктистов Ю.Ф. "Зарубіжні інтегральні мікросхеми для електронної апаратури." Москва, Вища школа, 1989р.

35. Ногов Ю.Р. "Математичні моделі елементів інтегральної електроніки" Москва, "Сучасне радіо", 1976р.

36. Інтерфейси систем обробки даних: Довідник / Під ред.А. А. Мячев. М.: Радіо і зв'язок, 1989.

37. Пухальський Г. І, Новосельцева Т.Я. "Цифрові пристрої" Санкт-Петербург, вид. "Політехніка" 1996р.

38. Предко М. Довідник з PIC-мікроконтролерів, ДМК, Додека.

39. Пономарьов С.М., Ховрічева М.Л. "Особливості лабораторного експерименту у викладанні природничонаукових дисциплін". М.: МІФІ, Матеріали / / Конференція-виставка "Інформаційні технології в освіті", ІТО-2000.

40. Ремизевич Т. В. Мікроконтролери для вбудованих додатків: від загальних підходів - до сімейств НС05 і НС08 фірми Motorola, Додека

41. Соучек Б. Мікропроцесори і мікроЕОМ / Пер. з англ. Під ред.А.І. Петренко. М.: Сов. радіо, 1979.517 с.

42. Сисоєв В.В. "Структурні та алгоритмічні моделі автоматизованого проектування виробництва виробів електронної техніки" Воронеж, Воронезький технологічний інститут, 1993р.

43. Збірник завдань по обчислювальних машин і програмування. Навчальний посібник. М., "Статистика", 1975р. - 280 с, з іл.

44. Стецюк А.Є., Кейн М.Ю. Мікропроцесорні системи управління: Методичні вказівки на виконання лабораторних работ.д.альневосточний державний університет шляхів сполучення, Хабаровськ - 1998

45. СТ РК 34.017-2005. Інформаційні технології. Електронне видання. Електронний навчальний видання

46. Токхайм Р. "Основи цифрової електроніки" Москва, вид. "Світ", 1988р.

47. Токхайм Р. Мікропроцесори: Курс і вправи / Пер. з англ. Під ред. Грасевіча. М.: Вища школа, 1987.338с.

48. Таверньє К. PIC-мікроконтролери. Практика застосування, ДМК

49. Чахмахсазян Е.А., Мозговий Г.П., "Математичне моделювання та макромоделювання біполярних елементів електронних схем" Москва, "Радіо і зв'язок", 1985р.

50. Уокерлі Дж. Архітектура та програмування мікроЕОМ: У 2-х кн. / Пер. з англ. М.: Світ, 1984. Кн.1.486 с. Кн.2.359 с.

51. Хосе М. Ангуло. Мікропроцесори: Архітектура, програмування та проектування систем. Тбілісі: Ганатлеба, 1989.

52. Хоровіц П., Хілл У. Мистецтво схемотехніки. М.: Світ, 1983. Т.2.590 с.

53. Хамакер К, З. Вранешіч, С. Закі. Організація ЕОМ, 5-видання. - СПб.: Пітер; Київ: Видавнича група BHV, 2003. - 848с.: Іл.

54. Шило В.Л. "Популярні цифрові мікросхеми" Москва, Металургія, 1988р.

55. Емулятор Emu8086. Довідкова система.

56. Якимів О.П. "Моделювання режимів і оцінка якості електронних приладів" Москва, "Радіо і зв'язок", 1989р.

57. Янсен Й. "Курс цифрової електроніки" т.1 Москва, Мир, 1987.

58. Яценків В. С. Мікроконтролери Microchip. Практичне керівництво, Гаряча лінія - Телеком

Посилання (links):
  • http://www.intuit.ru/shop/catalog/product.html?id=2458542
  • http://www.intuit.ru/shop/catalog/product.html?id=1465281
  • http://www.intuit.ru/shop/catalog/product.html?id=2377745
  • http://www.intuit.ru/shop/catalog/product.html?id=2458388
    Додати в блог або на сайт

    Цей текст може містити помилки.

    Програмування, комп'ютери, інформатика і кібернетика | Диплом
    597.5кб. | скачати


    Схожі роботи:
    Збірник лабораторних робіт з механіки
    Основи електробезпеки при виконанні лабораторних робіт
    Методичні вказівки до лабораторних робіт з курсу фізичної хімії
    Розробка електронного органайзера засобами C Builder 6
    Проектування та розробка класів засобами мови програмування СBuilder60
    Розробка рекомендацій з удосконалення системи забезпечення працівників засобами індивідуального
    Розробка автоматизованого обліку та руху товарів на складах засобами СУБД Microsoft Access
    Розробка лабораторно практичних робіт з технології
    Розробка лабораторно-практичних робіт з технології
  • © Усі права захищені
    написати до нас