|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ПРАКТИЧНА РОБОТА №9Тема: Основи програмування мовою асемблер. Мета: Вивчення структури програмування мовою асемблер: директиви, мітки, СОМ та ЕХЕ файли. Задачі: Робота з адресацією, мітками та директивами. Обладнання для виконання роботи: 1. Методичні вказівки що до виконання лабораторної роботи; 2. Персональний комп’ютер; 3. Відповідне програмне забезпечення (Windows 98, Microsoft Office 2000, XP, 2003, MS Excel, емулятор типу Emu8086 v2.57). Теоретичні основи: Програма являє собою послідовність команд, виконання яких приводить до розв'язку задачі. Команда визначає операцію, яку має виконати МП над даними. Команда містить у явній або неявній формах інформацію про те, де буде розміщений результат операції, а також про адресу наступної команди. Код команди складається з декількох частин, які називаються полями. Склад, призначення і розташування полів називається форматом команди. У загальному випадку формат команди містить операційну та адресну частини. Операційна частина містить код операції (наприклад, додавання, множення, передача даних). Адресна частина складається з декількох полів і містить інформацію про адреси операндів, результату операції та наступної команди. Формат команди, у якому адресна частина складається з двох полів (ознаки адресації та адреси операндів) показано на рис. 9.1. Рис. 9.1. Формат команди Поле «Ознака адресації» визначає спосіб адресації операнда. Біти полів «Ознака адресації» та «Адреси операндів» разом визначають комірки пам'яті, в яких зберігаються операнди. Розрізняють такі групи команд: 1) команди передачі даних; 2) команди операцій введення-виведення; 3) команди обробки інформації (арифметичні, логічні, зсуву, порівняння операндів, десяткової корекції); 4) команди керування порядком виконання програми (переходів, викликів підпрограм, повернень з підпрограм, переривань); 5) команди задання режимів роботи МП. Загальна кількість бітів у коді команди називається довжиною формату. Кількість двійкових розрядів т у полі «Код операції» забезпечує можливість подання всіх операцій, які виконує МП. Якщо МП виконує М різних операцій, то кількість розрядів визначається так: Якщо пам'ять містить S комірок, то потрібна для запису адреси одного операнда кількість розрядів у полі «Адреси операндів» становить: Довжина формату команди визначає швидкість виконання команди і залежить від способу адресації операндів. Існують такі способи адресації: пряма, непряма, безпосередня, автоінкрементна (автодекрементна), сторінкова, індексна, відносна. Пряма адресація. При такій адресації адреса операнда вказана безпосередньо в команді. Непряма адресація. При такій адресації у форматі команди вказується номер регістра, у якому зберігається адреса комірки пам'яті, яка містить операнд. Для збереження 16-розрядної адреси у 8-розрядному процесорі 8-розрядні регістри об'єднуються у регістрові пари. У першому регістрі регістрової пари зберігається старший байт адреси, а в другому -молодший. Номер регістрової пари, в якій зберігається адреса, є 2-розрядним двійковим числом, тому він розміщується в однобайтовій команді разом з кодом операції. Безпосередня адресація. У першому байті команди з безпосередньою адресацією розміщується код операції. Значення операндів заносяться в команду під час програмування і знаходяться у другому або другому і третьому байтах. Цими значеннями зазвичай є деякі константи, заздалегідь відомі програмісту. У процесі виконання програми значення операндів залишаються незмінними, оскільки вони разом із командою розміщуються в ПЗП. Використання такого способу не потребує адреси Автоінкрементна (автодекрементна) адресація. При автоінкрементній адресації адреса операнда обчислюється так само, як і при непрямій адресації, а потім здійснюється збільшення вмісту регістра: на один - для звернення до наступного байта, на два - для звернення до наступного слова. Розмір операнда визначається кодом операції. Сторінкова адресація. Під час використання сторінкової адресації пам'ять поділяється на ряд сторінок однакової довжини. Адресація сторінок здійснюється або з програмного лічильника, або з окремого регістра сторінок. Адресація пам'яті всередині сторінок здійснюється адресою, що міститься в команді. Індексна адресація. Для утворення адреси операнда до значення адресного поля команди додається значення вмісту індексного регістра, яке називається індексом. Відносна адресація. При відносній адресації адреса операнда визначається додаванням вмісту програмного лічильника або іншого регістра із зазначеним у команді числом. Вміст програмного лічильника або іншого регістра називається базовою адресою. Для збереження базових адрес у МП можуть бути передбачені базові регістри або спеціально виділені комірки пам'яті. Тоді в адресному полі команди вказується номер базового регістра. У МПС використовується програмування мовою асемблер. Асемблером називається і мова програмування у мнемокодах команд, і спеціальна програма-транслятор, що переводить (транслює) мнемокоди у машинні коди, які зчитуються мікропроцесором із пам'яті програм, дешифруються і виконуються. Процес переведення у машинні коди називається асемблюванням. Програма на мові асемблер містить два типи виразів: - команди, що транслюються в машинні коди; - директиви, що керують ходом трансляції. Вираз має вигляд: {<мітка>}: <мнемокод> {<операнд>}{,}{< операнд >}{; коментар}. У фігурних дужках наведено елементи виразу, яких може не бути у деяких командах. Мітка, мнемокод і операнди відокремлюються хоча б одним пробілом або табуляцією. Максимальна довжина рядка становить 132 символи, проте найчастіше використовуються рядки з 80 символів, що відповідає довжині екрана. Прикладами команд асемблера є:
Прикладом директиви є:
Мітка у мові асемблера є символічною адресою команди. Мітками позначаються не всі команди, а лише ті, до яких треба виконувати перехід за допомогою команд переходів або викликів підпрограм. У командах переходів або викликів підпрограм позначення мітки використовується як операнд - символічна адреса переходу, наприклад:
Після мітки ставиться двокрапка. Першим символом у мітці має бути літера або один із спеціальних символів: знак питання «?»; крапка «.»; знак амперсанд «@»; підкреслювання «_»; знак долара «$». Знак питання і крапка можуть займати тільки перше місце. Максимальна довжина мітки - 31 символ. Приклади міток: COUNT, PAGE25, $£10. Рекомендується використовувати описові та смислові мітки. Усі мітки у програмі мають бути унікальними, тобто не може бути декількох команд з однаковими мітками. Як мітки не можна використовувати зарезервовані асемблером слова, до яких належать коди команд, директиви, імена регістрів. Наприклад, імена АХ, DI та AL є зарезервованими і використовуються тільки для зазначення відповідних регістрів. Мнемокод ідентифікує команду асемблера. Для мнемокодів використовують скорочені або повні англійські слова, які передають значення основної функції команди: ADD - додати, SUB (SUBtract) - відняти, XCHG (eXCHanGe) - поміняти. Операнди відокремлюються комами. Якщо задано два операнди, то перший з них завжди є приймачем, а другий - джерелом інформації. Команда може містити різну кількість операндів різних типів, наприклад:
Коментарі ігноруються у процесі трансляції і використовуються для документування і кращого розуміння змісту програми. Коментар завжди починається із символу «;» і може містити будь-які символи. Коментар може займати увесь рядок або бути розташованим за командою в одному рядку, наприклад:
Оскільки коментарі не транслюються у машинні коди, то їх кількість не впливає на ефективність виконання програми. Програма мовою асемблер називається початковою програмою або початковим програмним модулем. Асемблювання або переведення початкової програми у машинні коди виконує програма-транслятор, наприклад TASM.COM. Залежно від установок, які задає користувач, програма переводить початковий модуль в один із двох програмних модулів: командний модуль (файл з розширенням .СОМ) або об'єктний модуль (файл з розширенням .OBJ). Командний модуль містить машинні коди команд з абсолютними адресами і виконується МП. Командний модуль доцільно використовувати у тих випадках, коли ємність програми не перевищує розміру одного сегмента (64 кбайт). Першим оператором командного модуля є директива ORG 100// (ORIGIN - початок), яка розміщує першу команду програми у сегменті кодів зі зміщенням 100//. Закінчуватися програма має або командою RET, або стандартною процедурою коректного виходу до MS DOS:
Останнім записом програми має бути директива END. (Об'єктний модуль містить машинні коди команд з відносними адресами. Об'єктний модуль виконується МП після заміни відносних адрес на абсолютні за допомогою програми-укладача, наприклад LINK.EXE, яка генерує модуль з розширенням .ЕХЕ (EXE-fyaw.ii або ЕХЕ- програму); ЕХЕ- файл, на відміну від командного модуля, може перевищувати обсяг одного сегмента. Однак у цьому разі обов'язковим є визначення сегментів за допомогою директив асемблера. Закінчується ЕХЕ-файл стандартною процедурою коректного виходу до MS DOS. Програма-укладач має ще одне призначення - вона об'єднує об'єктний модуль з бібліотечними модулями або кілька окремих об'єктних модулів в один ЕХЕ-файл. Бібліотечними модулями називають об'єктні файли, які містять найбільш поширені підпрограми. Бібліотечні модулі розміщуються у спеціальному системному файлі - бібліотеці (LIBRARY). При асемблюванні програма-транслятор генерує лістинт і файл лістингу програми. Лістинг - це відображення на дисплеї або папері текстів початкового програмного модуля, програмного модуля (.СОМ або .OBJ) та повідомлень, які вказують на помилки програмування, зумовлені порушенням правил запису виразів (наприклад, немає операнда або неправильний мнемокод команди). Директиви призначені для керування процесом асемблювання і формування лістингу. Вони діють тільки у процесі асемблювання програми і не переводяться в машинні коди. Мова асемблер містить такі основні директиви: - початку і кінця сегмента SEGMENT та ENDS; - початку і кінця процедури PROC та ENDP; - призначення сегментів ASSUME; - початку ORG; - розподілу та ініціювання пам'яті DB, DW, DD; - завершення програми END; - відзначення LABEL. Директиви початку і кінця сегмента SEGMENT та ENDS призначені для опису сегментів, які використовує програма. Директиви початку і кінця сегмента використовуються разом. Обидві директиви SEGMENT і ENDS повинні мати однакові назви. Директива SEGMENT може містити три типи параметрів: вирівнювання, об'єднання і класу. Параметр вирівнювання визначає початкову адресу або межу сегмента, наприклад: PAGE = хххОО, PARA = xxxxO (межа за замовчуванням), WORD = xxxxe (парна межа), BYTE = xxxxx, де х - будь-яка шістнадцяткова цифра; е - парна шістнаддяткова цифра. Якщо немає параметра вирівнювання за замовчуванням, береться параметр PARA, який вказує на те, що сегмент розміщується на початку параграфа, а початкова адреса сегмента є кратною 16. Параграфом називається область пам'яті розміром 16 байт, початкова адреса якої кратна 16, тобто має праворуч чотири нульові розряди. Параметр об'єднання вказує на спосіб обробки сегмента при компонуванні декількох програмних модулів: NONE: значення за замовчуванням. Сегмент має бути логічно відокремленим від інших сегментів, хоча фізично він може розміщуватися поряд. Передбачається, що сегмент має власну базову адресу. PUBLIC: усі PUBLIC - сегменти з однаковими назвою та класом завантажуються у суміжні області та мають одну базову адресу. STACK: призначення аналогічне параметру PUBLIC. У будь-якій програмі має бути визначений принаймні один сегмент STACK. Якщо визначено більше одного стека, то вказівник стека SP (Stack Pointer) встановлюється на початок першого стека. COMMON: для сегментів COMMON з однаковими назвами та класами встановлюється одна спільна базова адреса. Під час виконання програми здійснюється накладання другого сегмента на перший. Розмір загальної області визначається найдовшим сегментом. АТ-параграф: параграф слід визначати заздалегідь. Цей параметр забезпечує визначення міток та змінних за фіксованими адресами у фіксованих областях пам'яті. 'Клас': цей параметр може мати будь-яку правильну назву, яка розміщується в одинарних лапках. Параметр використовується для обробки сегментів, які мають однакові назви та класи. Типовими є класи 'STACK' та 'CODE'. У випадку, якщо програма не має об'єднуватися з іншими програмами, параметр об'єднання не вказується. Директиви початку і кінця процедури PROC та ENDP використовуються для визначення підпрограм у сегменті кодів і мають такий формат: <Назва> PROC {<тип процедури;»}. Можливі два типи процедур: - NEAR - процедура знаходиться в тому самому сегменті, що і команди, які її викликають; - FAR - процедура знаходиться за межами сегмента. За замовчуванням береться тип процедури NEAR. Сегмент кодів може містити декілька процедур. Описання сегмента кодів, що містить тільки одну процедуру, має такий вигляд:
Ім’я процедури має бути обов’язково і збігатися з іменем у директиві ENDP, яка визначає кінець процедури. Директива призначення сегментів ASSUME використовується для встановлення відповідності між сегментами та сегментними регістрами і має такий формат: ASSUME <сегментний регістр>: <ім'я> {,}{...}. Наприклад, запис SS:ім_стек вказує, що ім'я стека визначається вмістом регістра SS. Одна директива ASSUME може призначати до чотирьох сегментних регістрів у будь-якій послідовності, наприклад: Мнемокод Операнд(и) ASSUME SS:iм_стек, DS:ім_дані, CS:ім_код, ES:ім_додаткові_дані Для скасування будь-якого призначеного раніше у директиві ASSUME сегментного регістра треба використовувати слово NOTHING: Мнемокод Операнд(и) ASSUME ES: NOTHING Якщо програма не використовує якийсь сегмент, то відповідний йому операнд можна пропустити або вказати слово NOTHING. Директива ORG використовується для зміни вмісту програмного лічильника без команд умовного чи безумовного переходу. Найчастіше цю директиву використовують для встановлення початкової адреси програми, наприклад, директива ORG 100Н встановлює програмний лічильник на зміщення 100Н відносно початку сегмента кодів. Операнд зі знаком долара «$» має поточне значення програмного лічильника. Наприклад, директива ORG $ + 10Н збільшує адресу, завантажену у програмний лічильник, на 10Н. Директиви розподілу та ініціювання пам'яті використовуються для визначення вмісту та резервування комірок пам'яті. Директива має формат: { <ім'я> } Dn {кількість повторень DUP] <вираз>,, де мнемокод Dn =(DB, DW, DD, DQ, DT) вказує на довжину даних: DB - байт; DW - слово (2 байт); DD - подвійне слово; - DQ чотири слова; DT - 10 байт. Якщо у форматі наявне ім'я, то далі у програмі воно може використовуватися для позначення комірки пам'яті. <Вираз> у форматі директиви містить одну або кілька констант для задання початкових значень вмісту комірок пам'яті або знак «?» для невизначеного значення вмісту. Наприклад, директива ALPHA DB 34 означає, що комірка пам'яті з іменем ALPHA містить число 34. У ході виконання програми вміст комірки може бути змінений. Директива BETA DW? визначає, що комірка з іменем БЕТА має розрядність 16, але вміст комірки є невизначеним. Директива може містити декілька констант, розділених комами й обмежених лише довжиною рядка. Наприклад, вираз ARRAY DB 01,02, 11,12,21,22 визначає 6 констант у вигляді послідовності суміжних байтів. Посилання на комірку з іменем ARRAY вказує на першу константу (01), з іменем ARRAY + 1 - на другу (02), з іменем АЛ/МУ + 2 - на третю (11) і т. д. Запис MOV AL, ARRAY + 4 завантажує у регістр AL значення 21. Одна директива може визначити декілька комірок пам'яті. У цьому разі директива має вигляд: { <ім'я> } Dn {кількість повторень} DUP <вираз>. Наприклад, директива, що визначає 5 байт, які містять число 21, записується так: DB 5 DUP (21). Директива завершення програми END є останньою у програмі та має такий формат: END {<стартова адреса>}. Параметр директиви <стартова адреса> використовується лише при створенні ЕХЕ-файлів. Директива мітки LABEL призначена для встановлення відповідності між іменем і типом змінних. Вона має такий формат: <ім'я> LABEL {<тип>}. Як тип можна використовувати слова BYTE, WORD, DWORD, що визначають довжину даних: байт, слово або подвійне слово. Директива LABEL перевизначає параметри процедур NEAR або FAR. Наприклад, директива TOS LABEL WORD присвоює комірці пам'яті ім'я TOS і зазначає, що її вміст є словом Література: 1. Белов А. В. Самоучитель по микропроцессорной технике. СПб., Наука и техника. 2003 – 224с. 2. Мікропроцесорна техніка. Підручник /Якименко Ю. І, Терещенко Т. О. таінші/ - 2-ге вид., переробл. та доповн. – К.: ІВЦ «Видавництво «Політехніка»», 2004. – 440 с. 3. Микропроцессорные системы. Под ред. Д. В. Пузанкова. СПб., Политехника. 2002 – 935с. 4. Юров В. Assembler: Практикум. — СПб.: Питер, 2001. Техніка безпеки: Студенти та курсанти, які виконують практичні роботи у лабораторіях, згідно з розкладом занять, повинні виконувати привила техніки безпеки, а саме: 1. заходити у лабораторію тільки з дозволу викладача або завідуючого лабораторією; 2. не приносити до лабораторії легко палких та отруйних речовин; 3. без дозволу викладача або завідуючого лабораторією не вмикати ЄОМ та інші електричні прилади; 4. чітко та своєчасно виконувати накази викладача або завідуючого лабораторією; 5. у разі будь-якого інциденту, негайно доповісти викладачу або завідуючому лабораторією. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.015 сек.) |