SlideShare a Scribd company logo
1 of 73
Лабораторна               р о б о т а №1
     Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт

      Мета роботи: Знайомство з структурою персонального комп’ютера та основами програмування на мові асемблера. Студенту
треба навчитися працювати з програмою-транслятором Turbo-Assembler (TASM) та з засобами для відлагодження асемблерних програм
AFD та TD.

       Необхідні знання та практичні навички: Знання структури мікропроцесорів сімейства Intel 80х86 [2,4,5,12] та основ
програмування на мові асемблер [1,4]. Вміння працювати з інтерфейсом типу Turbo-Vision [7-9]. Студентам обов’язково треба відновити
свої знання з таких розділів:
      •     “Поняття про системи числення.”
      •     “Арифметичні дії над числами при їх представлені у двійковій, вісімковій та шістнадцятирічній системах.”
      •     “Переведення чисел з однієї системи числення до іншої.”

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

      1.1     Особливості архітектури мікропроцесора типу Intel 80х86
      Найважливішою особливістю комп'ютерних систем на основі мікропроцесорів (МП) типу Intel 8086 є сегментна організація пам'яті.
Сегментом називається область пам'яті, що починається з адреси, кратної 16, і містить дані однієї структури. Загалом це можуть
бути:
      •інструкція для МП, або коди команд;
      •дані користувача;
      •адреси повернення з підпрограм.
      Таким чином, відрізняють три головних сегмента програми, яким відповідають сегментні регістри процесора типу INTEL 8086:
      •CS (code segment, тобто сегмент інструкцій програми);
      •DS (data segment, тобто сегмент даних, які визначені користувачем);
      •SS (stack segment, тобто сегмент стеку).
Як вам відомо [1], стеком називається область пам'яті ЕОМ, яка відрізняється організацією доступу до даних, які
поступають до стека за принципом «останній ввійшов – перший вийшов». Більш досконало про стекову організацію пам'яті та про
програмування стека на апаратному рівні ви дізнаєтесь з теоретичних відомостей до лабораторної роботи №2.
       У мікропроцесорі Intel 8086 існує також розширений сегмент ES (extend segment), який ефективно використовується при роботі з
рядковими даними. Більш досконало про можливості використання цього сегменту при програмуванні ви дізнаєтесь з відповідного
розділу теоретичних відомостей до лабораторної роботи №4.
       В програмі, яку обробляє ЕОМ, всі адреси прив'язанні до початку сегмента. Таким чином, адреса осередку пам'яті, до якого
звертається процесор, немов би складається з двох частин: старші розряди – адреса сегменту, молодші – адреса зміщення.
                                             Головні регістри МП Intel 8086 та їх призначення
      Сегментні регістри CS, DS, SS, ES.
      Регістри-вказівники (РВ)

       IP (interrupt point) – адреса, за якою на даний час припинено виконання програми, або лічильник команд. Таким чином, повна
адреса, за якою розташований код команди, що виконується, може бути записана таким чином: CS:IP.
      DI (data interrupt) – відносна адреса, за якою розташована змінна користувача, що використовується програмою на даний час. Таким
чином, повна адреса, за якою розташовані дані користувача, може бути записана таким чином: DS:DI. Слід відзначити, що регістр DI
використовується також в парі з сегментним регістром ES.
      SP (stack pointer)– вказівник стека. Вказує на відносну адресу останньої змінної, що була завантажена до стека. При виконанні
команди «вивантажити змінну зі стека» буде вивантажена саме ця змінна.
      SI та DI – індексні регістри. Обидва цих регістра можуть бути використані для розширеної адресації та для реалізації
арифметичних операцій складання та віднімання. Але головне їх призначення – робота з рядковими даними. При цьому індексний регістр
DI пов'язаний з сегментним регістром DS, а індексний регістр SI - з сегментним регістром ES. Більш досконало про операції обробки
рядкових даних у мові асемблера можна прочитати в описі лабораторної роботи №4.

      Регістри загального призначення (РЗП) та їхні функції

      Акумулятор (АХ)
Акумулятор є головним з регістрів загального призначення. Навіть ті команди процесора, які можуть бути виконані за допомогою
інших регістрів, при використанні акумулятора виконуються значно швидше. Цей регістр безпосередньо зв'язаний з арифметико-логічним
пристроєм (АЛП) мікропроцесора, який реалізує виконання команд програми на апаратному рівні. Як і всі регістри процесора Intel 8086,
акумулятор має 16 розрядів і звертатись до нього на програмному рівні можна через абревіатуру АХ. Можна також заносити числа
лише до восьми молодших розрядів акумулятора, звертаючись до них через абревіатуру AL, або до восьми старших, звертаючись до
них через абревіатуру АН. Таке ж саме правило діє при звертанні до інших регістрів загального призначення, які будуть
розглядатися далі.
      Головні функції, які виконуються за допомогою акумулятора у мікропроцесорній системі:
            •всі арифметичні операції;
            •всі логічні операції;
            •всі операції введення/виведення даних;
            •операції над рядками.

      Базовий регістр (BX)
       Регістр загального призначення BX є базовим регістром. Це єдиний регістр загального призначення, вміст якого може
розглядатися як посилання на відповідну комірку пам'яті при розширеній адресації. Також може бути використаний разом з акумулятором
для арифметичних та логічних операцій та проведення обчислень.
      Регістр-лічильник (СХ)
      Регістр загального призначення СХ – це регістр-лічильник, який є необхідним для керування числом повторень у циклах та при
операціях зсування двійкових чисел. Також може бути використаний для арифметичних та логічних операцій та для проведення
обчислень.
      Регістр даних (DX)
      Регістр загального призначення DX – це регістр даних, який застосовується для їх введення та виведення, для обчислень з
подвійною точністю, або для операцій над великими числами при недостатній розрядності регістру АХ. Цей регістр також
використовується як додатковий при множенні та діленні цілих чисел.
      Регістр прапорів, або регістр стану (РС) Дев'ять з 16 біт регістра стану процесора Intel 8086 є активними та визначають стан
процесора після виконання останньої команди. Більшість арифметичних та логічних команд, а також команди зрівняння даних змінюють
значення прапорів регістра стану. Прапори регістра стану та їх призначення наведені у таблиці 1, а їх побітове розташування у комірках
регістра – у таблиці 2:

      Таблиця 1.                               Призначення прапорів регістра стану
             Назва прапора            Умовне
№
п/п   Українською     Англійською     Позна-                  Що визначає
        мовою           мовою         чення
                                                 Наявність одиниці у цьому біті регістра
      Прапор пере-   Overflow Flag      ОF       стану вказує на переповнення старшого
 1    повнення                                   біта числа при виконанні арифметичних
                                                 команд.
                                                 Визначає направлення пересилання або
      Вказівник                                  порівняння рядкових даних. При цьому
      напрямку при                               направлення ліворуч відповідає
      виконанні      Direction Flag     DF       збільшенню, а праворуч – зменшенню
 2    операцій над                               адрес комірок пам'яті. Значення 1 для
      рядками                                    прапора DF відповідає направленню
                                                 праворуч.
                                                 Наявність одиниці у цьому біті регістра
 3    Прапор         Interrupt Flag     IF       стану вказує на можливість виконання
      переривань                                 переривань від зовнішніх пристроїв, які
                                                 маскуються.
                                                 Визначається знаком останньої
                                                 арифметичної операції, яка була зроблена
 4    Прапор знаку      Sign Flag       SF       процесором (1 – від'ємне число, 0 –
                                                 додатне число).
                                                 Визначається результатом останньої
                                                 арифметичної операції, яка була зроблена
Назва прапора           Умовне
№
п/п   Українською Англійською          Позна-                Що визначає
         мовою       мовою             чення
5     Прапор нуля Zero Flag             ZF      процесором. Нульовий результат
                                                обумовлює появу одиниці у цьому біті.
                                                Наявність одиниці у цьому біті регістра
                                                стану забезпечує покрокове виконання
      Режим                                     завантаженої програми, що дозволяє
      трасування                                програмісту аналізувати стан всіх
6     (покрокового      Trace Flag       TF     регістрів процесора та комірок пам'яті
      виконання                                 після виконанні кожної асемблерної
      програми)                                 команди. Цей режим є дуже важливим
                                                при відлагодженні програм, але
                                                безпосередньо у програмах загального
                                                призначення він практично не
                                                використається. Єдиним виключенням є
                                                програми-компілятори.
                                                Визначається результатом останньої
                                                арифметичної операції, яка була зроблена
                                                процесором. Одиниця у цьому біті
7     Зовнішнє        Auxiliary Flag     AF     свідчить про перенесення з 3-го до 4-го
      перенесення                               біту числа при виконання операцій над 8-
                                                бітовими числами. Використовується при
                                                виконанні особливих арифметичних
                                                перевірок.
                                                Визначається результатом останньої
                                                арифметичної операції, яка була зроблена
                                                процесором. Одиниця у цьому біті
8     Прапор          Carry Flag                свідчить про перенесення зі старшого
Назва прапора               Умовне
№
п/п   Українською         Англійською     Позна-                 Що визначає
         мовою              мовою         чення
      перенесення                          CF       восьмого біта при виконанні
                                                    арифметичних операцій. При виконанні
                                                    операцій циклічного зсуву до прапора
                                                    перенесення переходить останній біт
                                                    числа.
                                                    Вказує на парність перших 8 бітів
                                                    отриманого результату (1-результат є
                                                    парним, 0 – не парним). Парність у
      Контроль                                      програмуванні та теорії інформації - це
 9    парності            Parity Flag        PF     кількість одиниць у двійковому числі.
      числа                                         Не     плутайте    цей    параметр    з
                                                    визначенням парності у арифметиці!
                                                    Не плутайте також прапор парності
                                                    процесора з бітом парності, який
                                                    використовується      для     контролю
                                                    передавання     чисельних     даних   у
                                                    комп’ютерних системах та мережах.

      Завдання для перевірки №1: Порівняйте поняття парності у звичайній та двійковій арифметиці. Наприклад, чи є парним число 3 з
точки зору теорії інформації? Наведіть інші приклади парних та непарних чисел.

        Таблиця 2.             Розташування бітів регістра стану мікропроцесора Intel 8086
Номер     1   14     13      12    11   10    9    8    7    6   5   4    3   2   1   0
біта      5
Прапор     *    *    *     *    OF    DF      IF   TF   SF   ZF   *   AF   * PF   *   CF


* - біт у процесорі Intel 8086 не задіяний.

       1.2 Організація обчислень та узагальнена архітектура комп’ютера IBM PC
      Загальна структура комп’ютера
      Як вам відомо, головні компоненти апаратних засобів комп’ютера – це системний блок, клавіатура, пристрій відображення
інформації (електронно-променевий або рідинно-кришталевий монітор), дисководи, друкуючий пристрій (принтер), а також різномінітні
засоби для асинхронного зв’язку з зовнішніми пристроями та керування програмами для іграшок. Сучасні комп’ютерні системи можуть
містити також інші різноманітні периферійні пристрої.
      В свою чергу, системний блок складається з системної плати, блока живлення комп’ютера та комірок (слотів) для розміщення
додаткових інтерфейс них плат. На системній платі розташовані:
       •   мікропроцесор;
       •   мікросхеми постійної пам’ять (ПЗП), яка містить ядро для початкового завантаження операційної системи та інтерпретатор
           мови програмування BASIC;
       • мікросхеми оперативної пам’ять (ОЗП).
       Комірки для розміщення додаткових інтерфейс них плат забезпечують підключення пристроїв відображення інформації
(моніторів), дисководів всіх типів, каналов телекомунікацій (мережних плат або модемів), додаткової пам’яті та інших різноманітних
пристроїв. Така конструкція комп’ютера була запропонована фірмою IBM та отримала назву “принципу відкритої архітектури”. Головною
перевагою цього принципу є простота модернізації комп’ютера через підключення до нього нових пристроїв або через заміну застарілих
пристроїв на сучасні.
      Головною частиною комп’ютера є мікропроцесор, який безпосередньо виконує обробку команд та даних. Як видно з рис. 1, процесор
типу Intel 8086 розділений на дві головні частини: операційний пристрій (ОП) та шинний інтерфейс (ШІ). Операційний пристрій
безпосередньо виконує команди програми, у той час як шинний інтерфейс підготовлює дані та команди для виконання. Операційний
пристрій складається з арифметико-логічного пристрою (АЛП), системи керування (СК) та десяти розглянутих вище регістрів (чотири
регістра загального призначення, п’ять регістрів-вказівників та регістр стану). АЛП разом із СК називають виконуючим блоком (ВБ)
процесора. Схеми АЛП безпосередньо забезпечують виконання арифметичних та логічних команд на апаратному рівні, в той час як СК,
яка зв’язана з регістром стану та з лічильником команд, забезпечує слідкування за логікою виконання
програми при наявності у ній підпрограм або команд вітвлення та циклу. Більш досконало логіка та організація програми будуть
розглянуті у лабораторній роботі №3.
     Блок керування шиною (БКШ), черга команд та розглянуті нами раніше сегментні регістри складають шинний інтерфейс
процесора та виконують три головних функції. По-перше, це передавання даних до ОП процесора, до зовнішніх пристроїв, або до
комірок пам’яті ЕОМ. По-друге, як вже відмічалось раніше, через сегментні
ОП
                                                     ШІ
AH         AL
                                           Керування програмами
BH         BL
                   РЗП
CH         CL                                             CS

DH         DL                                             DS
      SP                                                  SS
     BP
                   РВ                                  ES
     SI
     DI


                                                               Керування
                                                               шиною


     АЛП                                        1

     СК                      ВБ                 2


     РС                                         3

                                                4


     IP                                    Черга команд



            Рис.1 Узагальнена схема мікропроцесора Intel 80х86.
Завдання для перевірки №2: Назвіть всі сегментні регістри процесора Intel 8086. За адресацію яких сегментів вони відповідають?
      Третя функція ШІ – це вибирання команд з оперативної пам’яті комп’ютера. Як відомо, всі команди, які повинні бути виконані
програмою, розташовані в оперативній пам’яті комп’ютера. Тому для прискорення роботи процесора вона організована таким чином: ОП
та ШІ працюють одночасно, але ШІ попереджує роботу ОП на один крок. ОП “дає знати” ШІ, яка команда буде наступною та з якої
комірки оперативної пам’яті треба її вибирати. Таким чином, доки ОП виконує арифметичні та логічні дії над числами, ШІ вибирає з
оперативної пам’яті наступну команду або блок команд та завантажує його до верхньої частини черги команд, що значно прискорює
роботу комп’ютера. Тому збільшення розміру черги команд – дуже ефективний шлях для підвищення швидкодії процесорної системи.
Якщо процесор Intel 8086 мав чергу команд лише на чотири байти, то сучасні процесори мають окремі внутрішні області пам’яті як для
збереження кодів команд, так і для збереження даних користувача. Такі осередки пам’яті називаються “кешами” і розмір їх може складати
від 64 кБ до 512 кБ. Важливу роль також відіграє швидкість обміну даними між ОП та чергою команд або кешом процесора.
     Організація пам’яті комп’ютера
     Загалом пам’ять персонального комп’ютера складається з двох частин: постійної пам’яті (ROM – Read Only Memory) та
оперативної пам’яті (RAM – Random Accesses Memory). Пам’ять ROM – це спеціальна мікросхема, до якої занесена програма
початкового завантаження операційної системи. Але на теперішній час для цього використовуються не мікросхеми постійних
запам’ятовуючих пристроїв (ПЗП), а мікросхеми з електричним записуванням та зтиранням інформації (запам’ятовуючи пристрої, що
перепрограмуються). Найбільш цікавою частиною постійної пам’яті з точки зору програмування є базова система введення та
виведення даних, або BIOS (Base Input Output System). Ця система налагоджується при збиранні комп’ютера та при підключенні до
нього зовнішніх пристроїв, але при необхідності користувач може переналагодити її.
     Загалом оперативну пам’ять персонально комп’ютера можна умовно поділити на верхні адреси пам’яті, які використовуються
системою BIOS та операційною системою MS-DOS, адреси відеопам’яті та нижні адреси пам’яті, де розташовуються драйвера зовнішніх
пристроїв та програми користувача. На рис. 2 наведений розподіл адрес пам’яті для мегабайтного адресного простору комп’ютера
IBM PC XT [3,4]. Всі адреси на рисунку вказані у десятковій та у шістнадцятирічній формі (шістнадцятирічні числа помічені літерою Н).
Для комп’ютера типа IBM PC AT на базі процесора Intel 80286 з 32-разрядною шиною є можливою адресація 16 Мб оперативної пам’яті, а
у комп’ютерах на базі процесора Intel 80386 для режиму реальних адрес пам’яті можлива адресація простору до 4 Гб, а при використанні
захищеного режиму роботи процесора - до 64 Гб [2,6]. Якщо розмір оперативної пам’яті комп’ютера є меншим, то процесор може
використовувати для тимчасового збереження даних простір вінчестера як віртуальну пам’ять [2].
     1.3 Основи програмування на мові асемблер та її синтаксис. Позначки, коди команд, операнди та директиви
      Формат запису команди асемблеру має такий вигляд [4,7-9]:
{позначка:} [асемблерний код команди] {операнди}; {коментарії}
     Усі позначки у програмі повинні бути унікальними, і при цьому треба пам’ятати, що асемблер не відрізняє прописні та маленькі
літери. При максимальній довжині рядка програми 132 символи (більшість програмістів використовують з них лише 80 відповідно до
довжини екрану) максимальна довжина позначки - 31 символ. Позначка (якщо існує), асемблерний код команди та операнд
відокремлюються один від одного принаймні одним проміжком або символом табуляції. Коментарі можуть стояти в любому місці
асемблерної програми та повинні починатися з символу ; (крапка з комою). Всі символи в рядку асемблерної програми, що стоять
праворуч від крапки з комою, вважаються за коментарі. Коментарі можуть містити будь-які друковані символи української або латинської
абетки, цифрові та спеціальні символи, включаючи проміжок. Коментар може займати весь рядок або стояти праворуч від асемблерної
команди, наприклад:
              ; Програма виводу даних на друк
              ADD AX, BX; Додати два числа, що містяться в регістрах АX та BX
0000
                                       Таблиця векторів переривань
                   1 кб
                   00400H             Область даних BIOS
                                      Драйвера пристроїв MS-DOS

                                       Резидентні програми
                Пам’ять, яка
                адреується
                операційною           Префікс програмного
                системою              сегменту (PSP)
                MS-DOS                                          Програма
                                                                користувача



                                       Файли даних, які
                                       задіяні програмою
                                       користувача
                640 кб                 Незавантажена область пам’яті
Мегабайтний
простір адрес   А0000Н
                      704 кб
                                       Відеопам’ять монохром-
                      B0000H
                                       ного монітора у
                                       текстовому режимі        Графічна
                                                                відеопам’ять
                      736 кб                                    монітора
                      В8000Н           Відеопам’ять
                                       кольорового монітора у   EGA
                                       текстовому режимі
                      768 кб
                      С0000Н
                                        BIOS відеоадаптера
                      800 кб
                      C8000H            ПЗП фіксованого диска
                      984 кб
                      F6000H            Бейсик-интерпретатор ПЗП


                                          BIOS ПЗП

                Рис. 2 Розподіл пам’яті комп’ютера IBM PC XT
Зрозуміло, що кількість коментарів ніяк не впливає на складність програми, оскільки вони не відносяться до машинних кодів.
      Позначки в асемблері можуть містити такі символи:
1. Англійські літери         A...Z, a...z
2. Цифри                     0...9 (не можуть бути першим символом позначки).
3.Спеціальні символи         Знак питання (?);
                             амперсанд(@);
                             підкреслення ( _ );
                             долар ($);
                             крапка (.) (тільки як перший символ позначки).
Також заборонено використовувати як позначки зарезервовані асемблером слова, до яких відносяться коди команд, директиви, імена
регістрів тощо. У таблиці 3 наведені приклади вірних та невірних позначок.
          Таблиця 3.                               Приклади позначок
              Приклади вірних позначок          Приклади невірних позначок
        CoU                                    AX
                                               1A
        $10
        Thislabelisverylongbutcorrect          Thislabelisverylongandnotcorrect
        It_is_a_label                          Це є позначка
        _y_z                                   It is a label
        @2                                     ADD
        .2                                     Proc
        M2                                     2
                                               2M
                                               !2
                                               2.

       Асемблерний код команди вказує транслятору, яку дію треба виконати у даній операції. Це може бути пересилання даних між
регістарми процесору, з регістру до пам’яті або навпаки (команда MOV), команди обробки даних, наприклад збільшення чи зменшення на 1
(INC, DEC), додавання (АDD), віднімання (SUB), множення (MUL) або ділення (DIV), команди організації логіки програми, команди
переходу на підпрограму та багато інших.
      Якщо передбачена робота з даними і кодом команди вони не визначаються, то асемблерна команда завжди містить операнд, який
може містити:
1. Чисельне значення даних;
2. Регістри та комірки пам’яті, над якими буде виконуватись дія, що обумовлюється кодом команди
Приклади асемблерних команд:
CNT   DB      10;         Визначити байт пам’яті з назвою CNT та занести до нього число 10.
      MOV     AL,CNT;     Занести до регістру АL число з комірки CNT
      ADD     AL,12;      Збільшити число, що міститься у регістрі AL на 12.
      INC     AL;         Збільшити число у регістрі, що міститься у регістрі AL на 1.
      MOV     BL,AL;      Переслати дані з регістру AL до регістру BL.
.     RET;                Команда повернення з підпрограми. Операндів не має.

Крім того, асемблер має велику кількість операторів, які дозволяють керувати процесом асемблювання та виведенням початкового тексту
програми на друк. Ці оператори називаються псевдокомандами або директивами [4,7-9]. Вони використовуються тільки при
асемблюванні програми та не генерують асемблерного коду. Головні з них наведені нижче.
       Директива PAGE. Ця директива розміщується на початку програми та вказує на кількість рядків, що друкуються на сторінці, та
кількість символів в одному рядку. Формат директиви:
              PAGE [кількість рядків], [кількість символів]
Наприклад, директива
PAGE 50,100
встановлює режим виведення даних на друк 50 рядків на лист при сотні символів в одному рядку. Кількість рядків може бути встановлена у
межах 10-255, кількість символів від 60 до 132.
      Директиви SEGMENT та ENDS. Як вам вже відомо, будь-яка асемблерна програма має принаймні один сегмент - сегмент коду
програми. В більшості програм окремими сегментами виділяються чисельні дані користувача та стек. Сегмент описується за допомогою
директиви SEGMENT таким чином:
NSEG          SEGMENT {параметри}
              ...
              ...;             інструкції асемблера
              ...
NSEG          ENDS
Ім’я сегменту є обов’язковим, мусить бути унікальним та відповідати узгодженням про імена позначок, які наводилися вище. Директива
ENDS з тією ж позначкою відповідає кінцю сегмента.
       Директива ORG. Ця директива використовується для зміни вмісту лічильника адреси без допомоги асемблерних команд умовного
чи безумовного переходу. Найчастіше вживається для встановлення адреси завантаження програми на її початку. Наприклад, директива
              ORG           100H
встановлює лічильник адреси на зміщення 100H (шістнадцятирічне число 100) відносно початку сегменту кода, а директива
              ORG           $+10H
збільшує адресу, яка завантажена у лічильник команд, на 10H (шістнадцятирічне число 10).
      Директиви PROC та ENDP, команди CALL та RET. Сегмент коду може крім кодів основної програми містити одну чи декілька
процедур, які визначаються директивою PROC. В кінці процедури повинні стояти команда RET та директива ENDP. Директива ENDP
ставиться для того, щоб транслятор асемблера розпізнав початок та кінець процедури та її обсяг. Виклик процедури здійснюється за
допомогою команди CALL. Формат команди:

       CALL [ім’я процедури]
       При виклику процедури числа, що знаходяться у всіх регістрах процесора, завантажуються до стека, а до лічильника команд
завантажується адреса початку процедури. На кінці процедури перед директивою ENDP ставиться команда RET. Результатом її виконання є
завантаження вмісту верхніх комірок стеку до регістрів процесора та перехід на точку переривання головної програми. Команда RET може
ставитися і в середині процедури, якщо це передбачено логікою програми. Крім того, цією командою здійснюється вихід з асемблерної
програми до командного режиму MS-DOS. Таким чином, асемблерна програма, яка містить процедуру, буде мати такий вигляд:
       NSEG         SEGMENT;        опис сегменту
       NPROC        PROC;           опис процедури
...
                     ...
                     ...
                    RET;                      повернення до основної програми
                    ENDP;               кінець процедури
                    ...
                     ...
                     ...
                    CALL         NPROC;
                    ...
                     ...
                    RET;                      повернення до MS-DOS
                    ENDS;
      Директива END. Ставиться останнею у програмі та завершує її. Якщо програма писалася як процедура, директива END містить ім’я
процедури як параметр (END {[ім’я процедури]}). Якщо це com-програма і виконується в одному сегменті, параметр не використовується.
                            1.4. Перетворення програми з тексту на мові асемблера у виконуваний модуль
       Для того, щоб програма, написана на мові асемблера, могла бути виконана процесором, вона, як і програма на будь-якій іншій мові,
окрім машинної, має бути трансльована (за допомогою асемблера) та скомпонована (за допомогою редактора зв’язків).
       Для виконання лабораторних робіт у визначеному нижче вигляді можна застосовувати будь-який асемблер, що використовує
синтаксис Intel. Можна використовувати асемблер з іншим синтаксисом, наприклад синтаксисом AT&T, але для цього буде потрібно внести
відповідні зміни у наведені нижче приклади та зразки.
       Тут ми розберемо послідовність дій, необхідну для трансляції і компонування програм за допомогою транслятора MASM.
       Трансляція виконується командою
MASM ім’я_файлу
      Інші параметри команди можна подивитися за загальним правилом за допомогою команди
      MASM /?
      Компонування EXE-програми здійснюється за допомогою команди
      LINK об’єктний_модуль
      Для компонування COM-програми необхідно додати ключ /TINY:
      LINK /TINY об’єктний_модуль
      Інші параметри команди можна подивитися за загальним правилом за допомогою команди
      LINK /?
      Довідку з ассемблера MASM та його мови можна отримати за допомогою команди
      QH

                                                   1.5. Основи роботи з програмою AFD
      Програма AFD дозволяє відлагоджувати програми, які написані на мові асемблеру процесорів Intel 8086 та Intel 80286.
      Основні можливості програми AFD:
         1. Занесення до пам’яті ЕОМ виконуємих модулей та їх дізасемблювання (переведення тексту програми із двійкових машинних
            кодів на мову асемблера).
         2. Виконання всієї занесеної програми або її частини.
         3. Виконання окремих інструкцій програми у покроковому режимі.
         4. Аналіз стану всіх регістрів процесора та комірок пам’яті прямого доступу.
         5. Внесення програмістом змін до всіх реєстрів процесора та комірок пам’яті ЕОМ прямого доступу.

      Головне меню відладчика AFD (рис. 3) являє собою систему з шести вікон та командної строки. За допомогою клавіш керування
курсором ↑ та ↓ маркер строки переміщується по вікну програми-дізасемблера, а інші функції виконуються за допомогою функціональних
клавіш F1...F10 (таблиця 6) та системи команд (таблиця 7).
Регістри загального
           призначення,
                                                   Регістр стану процесору
           вказівники та
                                       Стек
           сегментні регістри
                     Командна строка
           Асемблерний код завантаженої                 Перше вікно пам’яті
           програми

                                  Друге вікно пам’яті



           Рис. 3. Загальний вигляд інтерфейсу програми AFD.
      Головна перевага відладчика AFD - його відносна простота та зручність багатовіконного інтерфейсу. Ці переваги особливо відчутні
при відлагодженні невеликих com-модулей. Недоліки цієї програми - неможливість проглядання робочого екрана програми, що
виконується, та неможливість одночасного проглядання двох або більшої кількості програм.

                                                                      Таблиця 6.         Призначення функціональних клавіш системи AFD


 Клавіша    Функція                                          Що виконує
            програми
   F1       Step                 Виконання однієї інструкції програми, відміченої маркером
                                 у вікні дізасемблера.
   F2       Step Proc            Повне виконання одного рядка програми. Наприклад, якщо
                                 це є викликання підпрограми, то вона буде виконана одразу
                                 повністю як одна інструкція.
   F3       Retrieve             Повторення введених команд командної строки. Можна
                                 повторити до шести команд.
   F4       Help                 Виклик файлу допомоги.
   F5       Set BRK              Встановлення точок зупинення.
Клавіша      Функція                                  Що виконує
              програми
   F6         -                 Клавіша незадіяна.
   F7         Up                Перенесення маркера догори.
   F8         Dn                Перенесення маркера донизу.
   F9         Le                Перенесення маркера ліворуч.
   F10        Ri                Перенесення маркера праворуч.

                                                           Таблиця 7.         Набір головних команд, які підтримуються відладчиком AFD
            Команда                                      Призначення
1. L ім’я файла {адреса}             Ввести файл до пам’яті ЕОМ. Адреса розміщення може
                                     бути вказана явно, але це не обов’язково. По
                                     замовченню адреса розташування програми буде
                                     CS:0100H.
                                     Число прочитаних байтів після завершення програми
                                     вказуєтьсся парою реєстрів BX:CX.
2. W ім’я      файла,      адреса,   Записати дані до файлу. Початкова адреса повинна
довжина                              знаходитися у сегменті даних DS. Довжина файлу
                                     повинна бути у межах чотирьох шістнадцятирічних
                                     цифр. Всі параметри команди є обов’язковими.
3. D адреса                          Показати коди команд, починаючи з вказаної адреси.
                                     Сегмент пам’яті визначається реєстром CS. З цієї ж
                                     адреси можна і виконувати програму.
4. R реєстр = значення               Занести число до регістра процесора. Наприклад,
                                     R А=100H - команда заносить до реєстру А число 100H.
                                     Якщо набрати R FL=значення - можна завантажити весь
                                     реєстр стану як один шістнадцятирічний реєстр. Але є
                                     можливим і окремий доступ до бітів реєстру стану
Команда                                  Призначення
                                 через імена OF, DF, IF, SF, ZF, AF, PF, CF.
5. Mn – адреса                   Показати перше або друге вікно стану пам’яті (значення
                                 параметру n 1 або 2), починаючи з вказаної адреси.
6. G {стартова          адреса}, Виконати програму від стартової адреси до адреси
{адреса зупинки}                 зупинки. Якщо не вказана стартова адреса, то
                                 виконання програми почнеться з адреси, на який вона
                                 була припинена. Якщо не вказана адреса зупинки, то
                                 програма буде виконуватись до першої точки
                                 припинення або до кінця. Крім того, можна припинити
                                 виконання програми через натиснення клавіш Ctrl+Esc.
7. QUIT {R}                      Повернення до DOS. Опція R робить програму afd
                                 резидентною.     В цьому випадку її ініциалізація
                                 проводиться через натиснення клавіш Ctrl+Esc.

                                                     1.6. Основи роботи з програмою TD

      Програма TD (turbo-debugger) дозволяє відлагоджувати програми, які написані на мові асемблера мікропроцесорів Intel 8086 - Intel
80486 [8,9]. Ця програма є розробкою фірми «Borland International» та входить до складу пакетів програмування Borland Pascal та
Borland C++. Тому інтерфейс програми реалізовано у стандарті Turbo-Vision та відповідає загальному вигляду інтерфейсу цих середовищ,
що значно спрощує його вивчення.
       Основні можливості програми TD:

       1. Занесення до пам’яті ЕОМ виконуємого модуля та його дізасемблювання.
       2. Виконання всієї занесеної програми або її частини. Кількість точок перевивань необмежена.
       3. Виконання окремих інструкцій програми у покроковому режимі.
       4. Аналіз стану всіх реєстрів процесора та комірок пам’яті, до яких є прямий доступ.
       5. Внесення програмістом змін до всіх регістрів процесора та комірок пам’яті ЕОМ, до яких є прямий доступ.
6. Проведення одночасного огляду даних, що знаходяться у комірках пам’яті ЕОМ з різними адресами (за допомогою опції меню Add
Watch або комбінації клавіш Ctrl+F7).
      7. Поглядання робочого екрану програми, що виконується, якщо в ній передбачене
виведення даних на монітор (за допомогою опції меню User Screen або комбінації клавіш Alt+F5).
       Головні вікна відладчика TD розташовані на його робочій панелі. Їх розмір може бути зміняний за допомогою миши, якщо це
необхідно. Кількість вікон необмежена. Кожне вікно, в якому завантажена програма, розбито на 5 робочих областей. На рис.4 наведена
структура вікна. Порядок розташування вікон може бути зміняний за допомогою опцій меню Window або функціональних клавіш,
зазначених у таблиці 8.
Верхній рядок меню


                                                                  Панель 2
 Робоча                                                           Регістри       Панель3
 панель                                                           загального     Регістр
                       Панель 1                                   призначення    стану
                       Асемблерний код                                           процесор
                       завантаженої програми                      Вказівники     а
Активне                                                           та сегментні
вікно                                                             регістри


                                                                   Панель 5
                Панель 4                                           Комірки пам’яті, що від-
                Комірки пам’яті, що відповідають сегменту даних    повідають сегменту стека

                Нижній рядок меню (призначення клавіш F1-F10)

 Рис 4. Загальний вигляд інтерфейсу програми TD.



      Таблиця 8.                               Опції пункту меню Window системи TD

    Опція              Клавіша                              Що виконує
Zoom (Z)                 F5          Збільшує розмір активного вікна до розміру всієї робочої
                                     панелі.
Next (N)                  F6         Перехід до наступного вікна.
Next pane (X)             Tab        Перехід до іншої панелі у тому ж робочому вікні.
Size/move (S)           Ctrl+F5      Зміна розмірів вікна та його переміщення.
Опція          Клавіша                          Що виконує
Close (C)             Alt+F3    Закрити активне вікно
Undo close            Alt+F6    Знову відкрити вікно, яке щойно було закрите

       Для аналізу точок припинень зручно користатись пунктом меню Breakpoints, головні опції якого зазначені у таблиці 9.
      Для видалення окремих точок припинень програми треба послідовно виконати такі дії:
      1. Звернутися до опції Breakpoints пункту меню View.
      2. Коли всі точки припинень будуть висвітлені у окремому вікні, вибрати точку, яку треба видалити, за допомогою клавіш
переміщення курсора ↑ та ↓.
      3. Натиснути клавішу Delete.
      4. Повернутися до активного вікна через опцію меню Window або за допомогою миши.
      Взагалі функції меню View дозволяють проглянути у повноекранному режимі будь-яку з панелей активного вікна (регістри
процесора, сегментні регістри), а також шістнадцятирічні коди інших виконуємих модулей (опція File), таблицю змінних завантаженої
програми (опція Variables), зміст програмного буферу (опція Clipboard) тощо. Програмний буфер може бути завантажений через стандартні
функції меню Edit Copy та Paste.
       Таблиця 9.                Опції пункту меню Breakpoints для системи TD

     Опція          Клавіш                          Що виконує
                      а
Toggle (T)            F2     Зробити точку припинення там, де у даний момент
                             припинено виконання програми.
At                  Alt+F2   Задати    чисельну     адресу    точки    припинення    у
                             шістнадцятирічній формі у форматі CS:IP.
Delete All            -      Видалити всі точки переривань.
Iconize/restore       -      Використання цієї опції меню приводить до звертання вікна.
                             Повторне її використання знову відкриває вікно.

      Пункт головного меню Data призначений для безпосередньої роботи з даними користувача та з комірками пам’яті та іменами
змінних. Він містить функції, зазначені у таблиці 10. Призначення усіх функціональних клавіш у програмі TD наведене у таблиці 11.
Таблиця 10.                    Опції пункту меню Data для системи TD

          Опція            Клавіша                         Що виконує
Inspect                       -         Поглядання значення заданої змінної або комірки
                                        пам’яті
Evalute/modify              Ctrl+F4     Обчислення значення виразу
Add Watch                   Ctrl+F7     Поглядання значень змінних у окремому вікні
Function return                 -       Адреси повернення функцій та процедур

                                                                       Таблиця 11.        Призначення функціональних клавіш у програмі TD

  Клавіша                                        Призначення
    F1            Допомога.
    F2            Зробити точку зупинки там, де у даний момент припинено виконання
                  програми.
     F3           Поглядання початкового коду завантаженої програми.
     F4           Перехід до рядка, на якому програма була припинена.
     F5           Збільшення розміру активного вікна до розміру всієї робочої панелі.
     F6           Перехід до наступного вікна.
     F7           Покрокове виконання програми. При переході на процедуру буде
                  покроково виконана кожна команда процедури.
     F8           Покрокове виконання програми. Команда виклику процедури виконується
                  як одна команда.
    F9            Запуск програми на розрахування.
    F10           Перехід до верхнього рядка меню.

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

          1. Знайти транслятор і файли afd.exe та td.exe.
2. Проаналізувати текст програми lab1.asm, зрозуміти зміст кожної з асемблерних команд. З’ясувати, як будуть змінюватися дані
   всіх регістрів процесору при виконанні кожної з них. Текст програми повинен мати такий вигляд:
text   SEGMENT
       ORG 100h
begin: MOV ax,20
       MOV bx,30
       ADD ax,bx
       MOV cx,ax
       ADD ch,16
       RET
text   ENDS
       END begin

          2. Сформувати лістинг, об’єктний та виконуваний код для програми lab1.asm; останній записати у файл lab1.com.
          3. Запустити програму lab1.com на обробку. Переконайтеся в тому, що вона коректно виконується (комп’ютер не «підвісає»).
          4. Завантажити програму lab1.com до відладчика AFD та крок за кроком виконати всі її команди. Після виконання кожної команди
           аналізувати стан кожного з регістрів процесора.
       5. Завантажити програму lab1.com до відладчика TD та крок за кроком виконати всі її команди. Після виконання кожної команди
           аналізувати стан кожного з регістрів процесора.
                                                               3. Зміст звіту
       1. Послідовність дій, які потрібно виконати для компіляції асемблерної програми. Розглянути два випадка: компіляцію com-програми
та компіляцію exe-програми.
       2. Таблиця з трьох колонок. До першої занести початковий код асемблерної програми файлу lab1.asm, до другої - її машинні коди, а
до третьої - стан усіх регістрів процесору після її виконання.
       3. Висновки за роботою.

8      4. Контрольні питання:
1.     Узагальнена структура мікропроцесора Intel 8086 та персонального комп’ютера IBM PC.
2.     Що таке початкова та об’єктна програма?
3.     Структурна схема гіпотетичного мікропроцесора, призначення всіх його регістрів.
4.     Основні регістри процесору типа Intel 8086, їх призначення.
5. Сегментація програми. Сегменти коду, даних та стеку. Їх розташування в пам’яті ЕОМ. Директиви мови асемблера SEGMENT та
                                                                   ENDS.
6. Організація стекової пам’яті та її призначення.
7. Регістр стану процесора. Його призначення. Біти регістра стану у процесорі Intel 8086.
8. Режим трасування програми. Як він встановлюється і для чого використовується?
9. Поясніть приклади позначок та приклади асемблерних команд, які наведені у теоретичній частині цієї роботи. Наведіть свої приклади.
10. Чи потрібно аналізувати регістр стану при виконанні команд програми lab1.asm? Чому?
Лабораторна                              р о б о т а №2
                                                                        Арифметичні та логічні операції мови асемблер

       Мета роботи: Навчитися писати на мові асемблер прості програми, які реалізують алгоритми, що містять арифметичні та
логічні операції над чисельними даними.
       Необхідні знання та практичні навички: Знання основ програмування на мові асемблера та основ роботи з транслятором TASM і
динамічними відладчиками AFD та TD [1,4,7-9].
                                                    1. Теоретичні відомості
       1.1. Директиви визначення даних
      Для безпосереднього визначення чисельних та рядкових величин, які не змінюються при виконанні програми, у мові асемблер
введені директиви визначення даних. Формат директиви визначення даних такий:

                      [ім’я]                D{n}                   {вираз}

де D{n} - одна з команд визначення даних, які будуть наведені нижче. Ім’я елемента вказувати не обов’язково. Але, оскільки у програмі
завжди існують посилання на ті чи інші дані, використання імен для роботи з ними є найбільш зручним. Наприклад:

A1          DW 2;                  Визначити слово (дві комірки пам’яті) та занести до них число 2
A2          DB         5;          Визначити                   байт               (одну                комірки                пам’яті)   та   занести   до   неї   число5
...................................................................................................................................
...................................................................................................................................
            MOV AX,A2;                        Занести число A2 до акумулятору.
            MOV CH,A1;                        Занести число A1 до старших 8 бітів регістра СX

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

           DB         - визначити байт (одну комірку пам’яті);
           DW         - визначити слово (дві комірки пам’яті);
           DQ         - визначити чотири слова (вісім комірок пам’яті);
           DT         - визначити десять слів (двадцять комірок пам’яті).
Вирази при описуванні даних можуть бути чотирьох типів:

       1. Вирази-константи. У директивах з виразами-константами чисельні дані задаються безпосередньо, при цьому визначається також
їх тип. Подальше у програмі вони можуть бути використані тільки як дані визначеного типу. Крім того, після числа вказується система
числення, у якій записано число:
              B - двійкова;
              Q - вісімкова;
              H - шістнадцятирічна;
              D - десяткова.
       Якщо, як в попередньому прикладі, явних вказівок на систему числення немає, то по замовченню число розглядається як десяткове.
Наприклад:
       A1     DW 2           ; Визначити слово (дві комірки пам’яті) та занести до них число 2.
       A2     DB      15H ; Визначити байт (одну комірки пам’яті) та занести до неї
                            ; шістнадцятирічне число 15
         B1    DQ     17Q   ; Визначити чотири слова та занести до них вісімкове число 17.
Завдання для перевірки №1: Переведіть числа, які позначені змінними A2 та B1 у двійкову та у десяткову системи числення.
         Слід зазначити, що у мові асемблера процесору Intel 8086 передбачені переміщення та обробку лише даних одного типу. Наприклад,
запис:
         A2   DB          15H
              MOV         AX, A2
є невірним, тому що до акумулятору, якій має 16 розрядів, ми намагаємося завантажити восьмирозрядне число (1 байт). Нижче наведено 2
вірних варіанти:

         A2    DB           15H                         A2    DW               15H
               MOV          AL, A2                            MOV              AX, A2

        2. Невизначені вирази. Якщо комірка пам’яті мусить бути завантажена не з початку роботи програми, а тільки у процесі її роботи,
то її перед початком роботи програми треба зарезервувати. Це досягається таким чином:
         A1    DW     ?;
Тоді у будь-якому місті програми можна поставити оператор типу:
      MOV           A1, АX
       Результатом виконання такого оператора буде перенесення даних з акумулятору до комірки пам’яті з ім’ям A1. Як вам відомо, у
мовах високого рівню, таких як ПАСКАЛЬ, С або ж Фортран, таке визначення змінних також ефективно використовується, а самі такі
змінні називають невизначеними або динамічними.
Завдання для перевірки №2: Пригадайте, як визначаються динамічні змінні у мові програмування ПАСКАЛЬ? В яких випадках вони
використовуються?
       3. Вирази з визначенням кількох констант. Вираз може містити водночас декілька констант, що розділяються комами. Кількість
таких констант обмежується тільки довжиною рядку. Наприклад:

      A3     DB              10,12,23H,1001B

асемблер визначає такі константи у вигляді послідовних суміжних байт. Посилання на ім’я А3 вказує на першу константу, А3+1 - на другу,
А3+2 - на третю тощо. Наприклад, команда:
              MOV          AH,A3+2
заносить до старших восьми розрядів акумулятора шістнадцятирічне число 23.
       При роботі з константами такого типу треба мати на увазі, що якщо команда асемблера DB резервує по одному байту для кожного
числа, то команда DW – по одному слову (два байти), незалежно від кількості розрядів у числах, що завантажуються. Тому при
використанні команди типа
      A3     DW              10,12,23H,1001B
посилання на другу константу (число 12) буде здійснюватись через вираз А3+2, а не А3+1, як це було у попередньому прикладі (поясніть
чому саме).
      У мовах високого рівня таким чином описуються змінні з індексами або масиви.
Завдання для перевірки №3: Скільки констант визначено в наведеному вище операторі DB під назвою А3? Переведіть всі ці числа у
двійкову, десяткову та шістнадцятирічну системи числення. Як би ви визначили відповідний масив з ім’ям А3 у мові програмування
ПАСКАЛЬ?
Завдання для перевірки №4: Напишіть на мові асемблера фрагмент програми, у якому:
1. Завантажте п’ять чисел: 12,13H,18,70Q,280 під одним ім’ям.
2. Завантажте друге з визначених чисел до регістру АХ, а п’яте до регістра СХ.
Яку з наведених вище команд ви використали для визначення даних і чому?

      4. Вирази з повторенням змінних. Директиви визначення даних допускають заповнення сусідніх комірок пам’яті однаковими
значеннями через дублювання даних. Формат такої директиви має вигляд:

      [ім’я]        D{n}         {число повторень} DUP {вираз}

      Наприклад:

      DW       10   DUP(?) ;             десять невизначених слів
      DB       5    DUP(14);             п’ять байт, в яких містяться числа 0EH
      DB       3    DUP(4DUP(8));        дванадцять байт, в яких містяться числа 8H
Завдання для перевірки №5: Наведіть свої приклади виразів з повторенням змінних та поясніть їх викладачеві. Які ви бачите можливості
практичного використання виразів з повторенням змінних при написані програм?
      Вираз може містити чисельну або символьну константу. Символьні константи беруться у          подвійні або одинарні ‘лапки’ та
переводяться при обробці програми в коди ASCII (додаток 3). Наприклад:
      A1       DB          ‘IBM PC AT’
      Більш досконало робота з рядковими константами у мові програмування асемблер буде описана у теоретичних відомостях до
лабораторної роботи №4.

                                                   1.2. Команда перенесення даних
       У чотирирозрядних та вісьмирозрядних процесорах існувало багато асемблерних кодів для команд перенесення даних [1].
Наприклад, існували окремі команди для перенесення даних з одного регістру процесору до іншого, з комірки пам’яті до регістру та з
регістру до комірки пам’яті. Але перехід до шістнадцятирозрядної шини даних дозволив реалізувати один асемблерний код команди MOV
для будь-якої операції перенесення даних [4,7-9].
Формат команди:
      {позначка} [код команди]                           [операнд-приймач], [операнд-джерело]
       Увага! Розташування в цій команді приймача і джерела даних є стандартним для процесорів фірми Intel.
       Використання команди MOV тісно пов’язано з видами адресації, що використовуються в асемблері. Відрізняють п’ять головних
видів адресації.
       1. Безпосередня адресація. Дані, що завантажуються, містяться безпосередньо у коді команди. Наприклад:
      A4          DB         ?;          Зарезервувати комірку для змінної А1
      ...........................................................................................................
                  MOV AX,15H; Завантажити до акумулятору число 15H
                  MOV A4,15H; Завантажити до комірки пам’яті A1 число 15H
      2. Неявна адресація. Джерело та приймач інформації записуються у самому коді команди. Це може бути назва регістру або
посилання на комірку пам’яті. Наприклад:
      A1          DB         100H; Завантажити до комірки пам’яті A1 число 100H
      ...............................................................................................................
                  MOV BX,A1; Завантажити до регістру BX вміст комірки A1
                  MOV AX,BX; Завантажити до регістру AX вміст регістру BX
      3. Пряма адресація. Безпосереднє звертання до комірки пам’яті з визначеним номером. Цей вид адресації використовується при
системному програмуванні для занесення даних до комірок пам’яті, вміст яких впливає на виконання системних процедур та загалом на
представлення інформації в комп’ютері. Наприклад:
                 MOV [B8000], ‘A’; Завантажити символ А до відеопам’яті

При вирішенні несистемних математичних та логічних задач цим видом адресації програмісти майже не користуються. Замість нього в
більшості випадків використовується безпосередня та неявна адресація.
       4. Посередня адресація. При цьому виді адресації вміст одного регістру або регістрової пари процесору є вказівником на комірку
пам’яті, що містить потрібну інформацію або в яку вона мусить бути поміщена. Посилання на поточну комірку пам’яті позначається
символом $ (долар). Наприклад:
MOV BX, 100H
  МOV CX, [BX]; Завантажити до регістру СХ число з сегменту даних зі зміщенням 100Н
                    ;(повна адреса комірки пам’яті DS:100H )
Як можна побачити з наведеного прикладу, посилання на комірку пам’яті позначається в асемблері через квадратні дужки.
      5. Адресація зі зміщенням. Як і посередня адресація, місить посилання на комірку пам’яті. Зміщення вказується як безпосередній
операнд. Ефективно використовується разом з директивою визначення кількох констант. Наприклад:
      A           DB         1,2,3,4,5; Визначення масиву з кількох констант
      .................................................................................................
                  MOV BX, A+2; Завантажити до регістру BX число 3
                                             1.3. Арифметичні операції над двійковими числами
        Додавання та віднімання байт або слів, що містять двійкові дані, здійснюється за допомогою команд ADD та SUB відповідно
[1,4,7-9].
        Формат команд додавання та віднімання у мові програмування асемблер цілком співпадає з форматом команди MOV:
       {позначка} [код команди]       [операнд-приймач], [операнд-джерело]
       Зрозуміло, що результат операції буде завантажений до операнда-приймача. Таким чином, наприклад, при складанні двох чисел
(виконанні команди ADD), перше з чисел, які складаються, буде втрачене, а замість нього у відповідний регістр або комірку пам’яті
завантажується отриманий результат.
        Віднімання у двійковій арифметиці реалізується через додавання від’ємних чисел. Від’ємне число містить одиничний біт у
старшому розряді та формуються за допомогою двійкового доповнення. Таким чином, для представлення від’ємного числа необхідно
інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Наприклад:

Число 65                      01000001
Інверсія бітів                10111110
Додати 1                      10111111                         Число -65

      Зміна знака від’ємного числа проводиться таким самим чином: треба інвертувати всі біти додатного числа та до отриманого
результату додати одиницю. Для нашого приклада:
Число –65                    10111111
Інверсія бітів               01000000
Додати 1                     01000001                     Число 65
       Сума двох рівних за модулем, але різних за знаком чисел, при такому формуванні кодів від’ємних чисел завжди буде дорівнювати 0
(перевірте це для чисел 65 та -65 та спробуйте математично довести цю тотожність).
       Таким чином, процесор записує від’ємні числа як великі додатні, і правила мови асемблера не дають можливостей їх
відрізнити. Програміст повинен сам чітко слідкувати за зміною чисел у регістрах і фіксувати їх знак, якщо у цьому є необхідність.
       Існують п’ять можливих ситуацій використання команд ADD та SUB, що пов’язані з представленням та розташуванням даних, які
представлені у таблиці 12.
                                                                     Таблиця 12. Команди додавання та віднімання мови АСЕМБЛЕР
                      Операція                                Приклади
Додавання/віднімання регістр-регістр.                    ADD  AX,BX
                                                         SUB  CL,DL
Додавання/віднімання регістр-пам’ять.                      A1   DW          50H
                                                          A2    DB          10H
                                                         ……………..........................
                                                               ADD          AX,A1
                                                               SUB         CL,A2
Додавання/віднімання пам’ять-регістр.                     A1   DW          50H
                                                          A2   DB          10H
                                                         ……………..........................
                                                               ADD          A1,AX
                                                               SUB         A2,CL
Додавання/віднімання регістр-безпосереднє значення.            ADD         A1,10H
                                                               SUB        A2,8
Додавання/віднімання пам’ять-безпосереднє значення.        A1  DW          50H
                                                          A2   DB          10H
                                                         ……………..........................
                                                               ADD          A1,5
Операція                              Приклади
                                                              SUB         A2,12H
Додавання/віднімання регістр-безпосереднє значення.          ADD        A1,10H
                                                             SUB       A2,8
Додавання/віднімання пам’ять-безпосереднє значення.       A1 DW        50H
                                                          A2 DB        10H
                                                         ……………….......................
                                                             ADD        A1,5
                                                             SUB         A2,12H

        Прямої операції «Пам’ять-Пам’ять» мікропроцесори типу Intel 80x86 не підтримують. Тому такі дії потрібно здійснювати через три
елементарних операції процесора:
        1. Занесення даних з комірки пам’яті №1 до регістру.
        2. Виконання операції додавання або віднімання між регістром та коміркою пам’яті №2.
        3. Занесення даних з регістру до комірки пам’яті №2.
        Наприклад:
        A1         DW                     50H
        A2         DW                     10H
      ................................................
                   MOV                    AX,A1
                   ADD                    AX,A2
                   MOV                     A2,AX
        Множення та ділення чисельних даних в мові асемблер здійснюється за допомогою команд MUL та DIV для беззнакових чисел та
за допомогою команд IMUL та IDIV для знакових чисел. Контроль над форматом чисел, що обробляються, не може здійснюватись
процесором автоматично, тому вибирати для використання ту чи іншу команду повинен сам програміст.
        В асемблері мікропроцесора Intel 8086 існують два формати команди множення - множення байта на байт та множення слова на
слово. При множенні байта на байт один з множників знаходиться у регістрі AL, а другий - в байті пам’яті або в однобайтовому регістрі.
Результат виконання операції множення буде розміщений в регістрі AX.
        Наприклад, фрагмент програми, що знаходить куб числа 5, можна записати таким чином:
        A1                     DB         5H
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works
Lab works

More Related Content

What's hot

Учительська презентація " Вода-джерело життя на Землі"
Учительська презентація " Вода-джерело життя на Землі"Учительська презентація " Вода-джерело життя на Землі"
Учительська презентація " Вода-джерело життя на Землі"
Irina1104
 
Презентація № 2 образ калитки
Презентація № 2 образ калиткиПрезентація № 2 образ калитки
Презентація № 2 образ калитки
schoolkharkov
 
25 книг, які навчать малювати в будь-якому віці!
25 книг, які навчать малювати в будь-якому віці!25 книг, які навчать малювати в будь-якому віці!
25 книг, які навчать малювати в будь-якому віці!
estet13
 
фызичне виховання
фызичне вихованняфызичне виховання
фызичне виховання
Lena241093
 
презентация тиждень "Охорони праці"
презентация тиждень "Охорони праці"презентация тиждень "Охорони праці"
презентация тиждень "Охорони праці"
vinohodov
 
багатогранна творчість і.я. франка
багатогранна творчість і.я. франкабагатогранна творчість і.я. франка
багатогранна творчість і.я. франка
Виктор Чёмов
 
Урок літератури рідного краю. Донеччина у творчості В. Сосюри
Урок літератури рідного краю. Донеччина у творчості В. СосюриУрок літератури рідного краю. Донеччина у творчості В. Сосюри
Урок літератури рідного краю. Донеччина у творчості В. Сосюри
natalo4ka1975
 
Тиждень охорони праці
Тиждень охорони праціТиждень охорони праці
Тиждень охорони праці
0664965362
 

What's hot (20)

Учительська презентація " Вода-джерело життя на Землі"
Учительська презентація " Вода-джерело життя на Землі"Учительська презентація " Вода-джерело життя на Землі"
Учительська презентація " Вода-джерело життя на Землі"
 
презентація формування предметних і ключових компетентностей учнів
презентація формування предметних і ключових компетентностей учнів презентація формування предметних і ключових компетентностей учнів
презентація формування предметних і ключових компетентностей учнів
 
Презентація "Павло Тичина". Концепція: Офіційний сайт
Презентація "Павло Тичина". Концепція: Офіційний сайтПрезентація "Павло Тичина". Концепція: Офіційний сайт
Презентація "Павло Тичина". Концепція: Офіційний сайт
 
Хвойні рослини 3 клас презентація
Хвойні рослини 3 клас презентаціяХвойні рослини 3 клас презентація
Хвойні рослини 3 клас презентація
 
Презентація № 2 образ калитки
Презентація № 2 образ калиткиПрезентація № 2 образ калитки
Презентація № 2 образ калитки
 
Ukr_Mova_5kl_avramenko.pdf
Ukr_Mova_5kl_avramenko.pdfUkr_Mova_5kl_avramenko.pdf
Ukr_Mova_5kl_avramenko.pdf
 
Ду Фу
Ду ФуДу Фу
Ду Фу
 
25 книг, які навчать малювати в будь-якому віці!
25 книг, які навчать малювати в будь-якому віці!25 книг, які навчать малювати в будь-якому віці!
25 книг, які навчать малювати в будь-якому віці!
 
Презентація-огляд новинок літератури «Пиши правильно!» (до Міжнародного дня г...
Презентація-огляд новинок літератури «Пиши правильно!» (до Міжнародного дня г...Презентація-огляд новинок літератури «Пиши правильно!» (до Міжнародного дня г...
Презентація-огляд новинок літератури «Пиши правильно!» (до Міжнародного дня г...
 
Цунамі (укр.)
Цунамі (укр.) Цунамі (укр.)
Цунамі (укр.)
 
твір опис 7 клас
твір опис 7 кластвір опис 7 клас
твір опис 7 клас
 
фызичне виховання
фызичне вихованняфызичне виховання
фызичне виховання
 
презентация тиждень "Охорони праці"
презентация тиждень "Охорони праці"презентация тиждень "Охорони праці"
презентация тиждень "Охорони праці"
 
Zvit sokil
Zvit sokilZvit sokil
Zvit sokil
 
Перші кроки маленького піаніста
Перші кроки маленького піаністаПерші кроки маленького піаніста
Перші кроки маленького піаніста
 
Презентація до відкритого уроку викладача історії Геличак О.Р.
Презентація до відкритого уроку викладача історії Геличак О.Р.Презентація до відкритого уроку викладача історії Геличак О.Р.
Презентація до відкритого уроку викладача історії Геличак О.Р.
 
Cetiri carobne reci
Cetiri carobne reciCetiri carobne reci
Cetiri carobne reci
 
багатогранна творчість і.я. франка
багатогранна творчість і.я. франкабагатогранна творчість і.я. франка
багатогранна творчість і.я. франка
 
Урок літератури рідного краю. Донеччина у творчості В. Сосюри
Урок літератури рідного краю. Донеччина у творчості В. СосюриУрок літератури рідного краю. Донеччина у творчості В. Сосюри
Урок літератури рідного краю. Донеччина у творчості В. Сосюри
 
Тиждень охорони праці
Тиждень охорони праціТиждень охорони праці
Тиждень охорони праці
 

Viewers also liked

胡里奥 鸽子
胡里奥 鸽子胡里奥 鸽子
胡里奥 鸽子
pakon
 
Upload del firmware su MP32 con vride
Upload del firmware su MP32 con vrideUpload del firmware su MP32 con vride
Upload del firmware su MP32 con vride
Roberto Navoni
 
Myngiin angiig taniulah
Myngiin angiig taniulahMyngiin angiig taniulah
Myngiin angiig taniulah
CHANTSAL
 
2011年最新的說詞
2011年最新的說詞 2011年最新的說詞
2011年最新的說詞
joinnchang
 

Viewers also liked (20)

avaliação 9 ano química
avaliação 9 ano químicaavaliação 9 ano química
avaliação 9 ano química
 
"Vilniaus energijos" akcininkai
"Vilniaus energijos" akcininkai"Vilniaus energijos" akcininkai
"Vilniaus energijos" akcininkai
 
胡里奥 鸽子
胡里奥 鸽子胡里奥 鸽子
胡里奥 鸽子
 
навыки эффективной мотивации2
навыки эффективной мотивации2навыки эффективной мотивации2
навыки эффективной мотивации2
 
Uitleg TPACK
Uitleg TPACKUitleg TPACK
Uitleg TPACK
 
Anboto 422
Anboto 422Anboto 422
Anboto 422
 
Niifs andrea hurtado
Niifs andrea hurtadoNiifs andrea hurtado
Niifs andrea hurtado
 
Greenhouse maxmin1 copywriting
Greenhouse maxmin1 copywritingGreenhouse maxmin1 copywriting
Greenhouse maxmin1 copywriting
 
Spiral F1 Driver
Spiral F1 DriverSpiral F1 Driver
Spiral F1 Driver
 
Upload del firmware su MP32 con vride
Upload del firmware su MP32 con vrideUpload del firmware su MP32 con vride
Upload del firmware su MP32 con vride
 
Trabajo infantil 2011
Trabajo infantil 2011Trabajo infantil 2011
Trabajo infantil 2011
 
Rinnovo automatico
Rinnovo automaticoRinnovo automatico
Rinnovo automatico
 
Myngiin angiig taniulah
Myngiin angiig taniulahMyngiin angiig taniulah
Myngiin angiig taniulah
 
2011年最新的說詞
2011年最新的說詞 2011年最新的說詞
2011年最新的說詞
 
Ukr el11 2
Ukr el11 2Ukr el11 2
Ukr el11 2
 
Rodo Jampa
Rodo JampaRodo Jampa
Rodo Jampa
 
조선산업 현황 및 중소조선사 발전방향
조선산업 현황 및 중소조선사 발전방향조선산업 현황 및 중소조선사 발전방향
조선산업 현황 및 중소조선사 발전방향
 
8v,
8v,8v,
8v,
 
Nhalat izhak
Nhalat izhakNhalat izhak
Nhalat izhak
 
Pitch360
Pitch360Pitch360
Pitch360
 

Similar to Lab works

інформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листкуінформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
Школа №7 Миргород
 
Budova komp yutera
Budova komp yuteraBudova komp yutera
Budova komp yutera
prezynt
 
будова пк
будова пкбудова пк
будова пк
Yura_Shilo
 
будова пк
будова пкбудова пк
будова пк
Yura_Shilo
 

Similar to Lab works (20)

інформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листкуінформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
 
5971 789623
5971 7896235971 789623
5971 789623
 
Computers and Computing Works lecture №4
Computers and Computing Works lecture №4Computers and Computing Works lecture №4
Computers and Computing Works lecture №4
 
Гаврилюк К.docx
Гаврилюк К.docxГаврилюк К.docx
Гаврилюк К.docx
 
1
11
1
 
Лекція №11
Лекція №11Лекція №11
Лекція №11
 
характеристика основних вузщлів компютера
характеристика основних вузщлів компютерахарактеристика основних вузщлів компютера
характеристика основних вузщлів компютера
 
Computers and Computing Works lecture №3
Computers and Computing Works lecture №3Computers and Computing Works lecture №3
Computers and Computing Works lecture №3
 
Будова комп'ютера
Будова комп'ютераБудова комп'ютера
Будова комп'ютера
 
тема 7
тема 7тема 7
тема 7
 
опорні схеми
опорні схемиопорні схеми
опорні схеми
 
Budova komp yutera
Budova komp yuteraBudova komp yutera
Budova komp yutera
 
8 11
8 118 11
8 11
 
будова пк
будова пкбудова пк
будова пк
 
будова пк
будова пкбудова пк
будова пк
 
Конкурсна робота
Конкурсна роботаКонкурсна робота
Конкурсна робота
 
Лекція №8
Лекція №8Лекція №8
Лекція №8
 
Computers and Computing Works lecture №5
Computers and Computing Works lecture №5Computers and Computing Works lecture №5
Computers and Computing Works lecture №5
 
2
22
2
 
2
22
2
 

Lab works

  • 1. Лабораторна р о б о т а №1 Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт Мета роботи: Знайомство з структурою персонального комп’ютера та основами програмування на мові асемблера. Студенту треба навчитися працювати з програмою-транслятором Turbo-Assembler (TASM) та з засобами для відлагодження асемблерних програм AFD та TD. Необхідні знання та практичні навички: Знання структури мікропроцесорів сімейства Intel 80х86 [2,4,5,12] та основ програмування на мові асемблер [1,4]. Вміння працювати з інтерфейсом типу Turbo-Vision [7-9]. Студентам обов’язково треба відновити свої знання з таких розділів: • “Поняття про системи числення.” • “Арифметичні дії над числами при їх представлені у двійковій, вісімковій та шістнадцятирічній системах.” • “Переведення чисел з однієї системи числення до іншої.” 1. Теоретичні відомості 1.1 Особливості архітектури мікропроцесора типу Intel 80х86 Найважливішою особливістю комп'ютерних систем на основі мікропроцесорів (МП) типу Intel 8086 є сегментна організація пам'яті. Сегментом називається область пам'яті, що починається з адреси, кратної 16, і містить дані однієї структури. Загалом це можуть бути: •інструкція для МП, або коди команд; •дані користувача; •адреси повернення з підпрограм. Таким чином, відрізняють три головних сегмента програми, яким відповідають сегментні регістри процесора типу INTEL 8086: •CS (code segment, тобто сегмент інструкцій програми); •DS (data segment, тобто сегмент даних, які визначені користувачем); •SS (stack segment, тобто сегмент стеку).
  • 2. Як вам відомо [1], стеком називається область пам'яті ЕОМ, яка відрізняється організацією доступу до даних, які поступають до стека за принципом «останній ввійшов – перший вийшов». Більш досконало про стекову організацію пам'яті та про програмування стека на апаратному рівні ви дізнаєтесь з теоретичних відомостей до лабораторної роботи №2. У мікропроцесорі Intel 8086 існує також розширений сегмент ES (extend segment), який ефективно використовується при роботі з рядковими даними. Більш досконало про можливості використання цього сегменту при програмуванні ви дізнаєтесь з відповідного розділу теоретичних відомостей до лабораторної роботи №4. В програмі, яку обробляє ЕОМ, всі адреси прив'язанні до початку сегмента. Таким чином, адреса осередку пам'яті, до якого звертається процесор, немов би складається з двох частин: старші розряди – адреса сегменту, молодші – адреса зміщення. Головні регістри МП Intel 8086 та їх призначення Сегментні регістри CS, DS, SS, ES. Регістри-вказівники (РВ) IP (interrupt point) – адреса, за якою на даний час припинено виконання програми, або лічильник команд. Таким чином, повна адреса, за якою розташований код команди, що виконується, може бути записана таким чином: CS:IP. DI (data interrupt) – відносна адреса, за якою розташована змінна користувача, що використовується програмою на даний час. Таким чином, повна адреса, за якою розташовані дані користувача, може бути записана таким чином: DS:DI. Слід відзначити, що регістр DI використовується також в парі з сегментним регістром ES. SP (stack pointer)– вказівник стека. Вказує на відносну адресу останньої змінної, що була завантажена до стека. При виконанні команди «вивантажити змінну зі стека» буде вивантажена саме ця змінна. SI та DI – індексні регістри. Обидва цих регістра можуть бути використані для розширеної адресації та для реалізації арифметичних операцій складання та віднімання. Але головне їх призначення – робота з рядковими даними. При цьому індексний регістр DI пов'язаний з сегментним регістром DS, а індексний регістр SI - з сегментним регістром ES. Більш досконало про операції обробки рядкових даних у мові асемблера можна прочитати в описі лабораторної роботи №4. Регістри загального призначення (РЗП) та їхні функції Акумулятор (АХ)
  • 3. Акумулятор є головним з регістрів загального призначення. Навіть ті команди процесора, які можуть бути виконані за допомогою інших регістрів, при використанні акумулятора виконуються значно швидше. Цей регістр безпосередньо зв'язаний з арифметико-логічним пристроєм (АЛП) мікропроцесора, який реалізує виконання команд програми на апаратному рівні. Як і всі регістри процесора Intel 8086, акумулятор має 16 розрядів і звертатись до нього на програмному рівні можна через абревіатуру АХ. Можна також заносити числа лише до восьми молодших розрядів акумулятора, звертаючись до них через абревіатуру AL, або до восьми старших, звертаючись до них через абревіатуру АН. Таке ж саме правило діє при звертанні до інших регістрів загального призначення, які будуть розглядатися далі. Головні функції, які виконуються за допомогою акумулятора у мікропроцесорній системі: •всі арифметичні операції; •всі логічні операції; •всі операції введення/виведення даних; •операції над рядками. Базовий регістр (BX) Регістр загального призначення BX є базовим регістром. Це єдиний регістр загального призначення, вміст якого може розглядатися як посилання на відповідну комірку пам'яті при розширеній адресації. Також може бути використаний разом з акумулятором для арифметичних та логічних операцій та проведення обчислень. Регістр-лічильник (СХ) Регістр загального призначення СХ – це регістр-лічильник, який є необхідним для керування числом повторень у циклах та при операціях зсування двійкових чисел. Також може бути використаний для арифметичних та логічних операцій та для проведення обчислень. Регістр даних (DX) Регістр загального призначення DX – це регістр даних, який застосовується для їх введення та виведення, для обчислень з подвійною точністю, або для операцій над великими числами при недостатній розрядності регістру АХ. Цей регістр також використовується як додатковий при множенні та діленні цілих чисел. Регістр прапорів, або регістр стану (РС) Дев'ять з 16 біт регістра стану процесора Intel 8086 є активними та визначають стан процесора після виконання останньої команди. Більшість арифметичних та логічних команд, а також команди зрівняння даних змінюють
  • 4. значення прапорів регістра стану. Прапори регістра стану та їх призначення наведені у таблиці 1, а їх побітове розташування у комірках регістра – у таблиці 2: Таблиця 1. Призначення прапорів регістра стану Назва прапора Умовне № п/п Українською Англійською Позна- Що визначає мовою мовою чення Наявність одиниці у цьому біті регістра Прапор пере- Overflow Flag ОF стану вказує на переповнення старшого 1 повнення біта числа при виконанні арифметичних команд. Визначає направлення пересилання або Вказівник порівняння рядкових даних. При цьому напрямку при направлення ліворуч відповідає виконанні Direction Flag DF збільшенню, а праворуч – зменшенню 2 операцій над адрес комірок пам'яті. Значення 1 для рядками прапора DF відповідає направленню праворуч. Наявність одиниці у цьому біті регістра 3 Прапор Interrupt Flag IF стану вказує на можливість виконання переривань переривань від зовнішніх пристроїв, які маскуються. Визначається знаком останньої арифметичної операції, яка була зроблена 4 Прапор знаку Sign Flag SF процесором (1 – від'ємне число, 0 – додатне число). Визначається результатом останньої арифметичної операції, яка була зроблена
  • 5. Назва прапора Умовне № п/п Українською Англійською Позна- Що визначає мовою мовою чення 5 Прапор нуля Zero Flag ZF процесором. Нульовий результат обумовлює появу одиниці у цьому біті. Наявність одиниці у цьому біті регістра стану забезпечує покрокове виконання Режим завантаженої програми, що дозволяє трасування програмісту аналізувати стан всіх 6 (покрокового Trace Flag TF регістрів процесора та комірок пам'яті виконання після виконанні кожної асемблерної програми) команди. Цей режим є дуже важливим при відлагодженні програм, але безпосередньо у програмах загального призначення він практично не використається. Єдиним виключенням є програми-компілятори. Визначається результатом останньої арифметичної операції, яка була зроблена процесором. Одиниця у цьому біті 7 Зовнішнє Auxiliary Flag AF свідчить про перенесення з 3-го до 4-го перенесення біту числа при виконання операцій над 8- бітовими числами. Використовується при виконанні особливих арифметичних перевірок. Визначається результатом останньої арифметичної операції, яка була зроблена процесором. Одиниця у цьому біті 8 Прапор Carry Flag свідчить про перенесення зі старшого
  • 6. Назва прапора Умовне № п/п Українською Англійською Позна- Що визначає мовою мовою чення перенесення CF восьмого біта при виконанні арифметичних операцій. При виконанні операцій циклічного зсуву до прапора перенесення переходить останній біт числа. Вказує на парність перших 8 бітів отриманого результату (1-результат є парним, 0 – не парним). Парність у Контроль програмуванні та теорії інформації - це 9 парності Parity Flag PF кількість одиниць у двійковому числі. числа Не плутайте цей параметр з визначенням парності у арифметиці! Не плутайте також прапор парності процесора з бітом парності, який використовується для контролю передавання чисельних даних у комп’ютерних системах та мережах. Завдання для перевірки №1: Порівняйте поняття парності у звичайній та двійковій арифметиці. Наприклад, чи є парним число 3 з точки зору теорії інформації? Наведіть інші приклади парних та непарних чисел. Таблиця 2. Розташування бітів регістра стану мікропроцесора Intel 8086 Номер 1 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 біта 5
  • 7. Прапор * * * * OF DF IF TF SF ZF * AF * PF * CF * - біт у процесорі Intel 8086 не задіяний. 1.2 Організація обчислень та узагальнена архітектура комп’ютера IBM PC Загальна структура комп’ютера Як вам відомо, головні компоненти апаратних засобів комп’ютера – це системний блок, клавіатура, пристрій відображення інформації (електронно-променевий або рідинно-кришталевий монітор), дисководи, друкуючий пристрій (принтер), а також різномінітні засоби для асинхронного зв’язку з зовнішніми пристроями та керування програмами для іграшок. Сучасні комп’ютерні системи можуть містити також інші різноманітні периферійні пристрої. В свою чергу, системний блок складається з системної плати, блока живлення комп’ютера та комірок (слотів) для розміщення додаткових інтерфейс них плат. На системній платі розташовані: • мікропроцесор; • мікросхеми постійної пам’ять (ПЗП), яка містить ядро для початкового завантаження операційної системи та інтерпретатор мови програмування BASIC; • мікросхеми оперативної пам’ять (ОЗП). Комірки для розміщення додаткових інтерфейс них плат забезпечують підключення пристроїв відображення інформації (моніторів), дисководів всіх типів, каналов телекомунікацій (мережних плат або модемів), додаткової пам’яті та інших різноманітних пристроїв. Така конструкція комп’ютера була запропонована фірмою IBM та отримала назву “принципу відкритої архітектури”. Головною перевагою цього принципу є простота модернізації комп’ютера через підключення до нього нових пристроїв або через заміну застарілих пристроїв на сучасні. Головною частиною комп’ютера є мікропроцесор, який безпосередньо виконує обробку команд та даних. Як видно з рис. 1, процесор типу Intel 8086 розділений на дві головні частини: операційний пристрій (ОП) та шинний інтерфейс (ШІ). Операційний пристрій безпосередньо виконує команди програми, у той час як шинний інтерфейс підготовлює дані та команди для виконання. Операційний пристрій складається з арифметико-логічного пристрою (АЛП), системи керування (СК) та десяти розглянутих вище регістрів (чотири регістра загального призначення, п’ять регістрів-вказівників та регістр стану). АЛП разом із СК називають виконуючим блоком (ВБ) процесора. Схеми АЛП безпосередньо забезпечують виконання арифметичних та логічних команд на апаратному рівні, в той час як СК, яка зв’язана з регістром стану та з лічильником команд, забезпечує слідкування за логікою виконання
  • 8. програми при наявності у ній підпрограм або команд вітвлення та циклу. Більш досконало логіка та організація програми будуть розглянуті у лабораторній роботі №3. Блок керування шиною (БКШ), черга команд та розглянуті нами раніше сегментні регістри складають шинний інтерфейс процесора та виконують три головних функції. По-перше, це передавання даних до ОП процесора, до зовнішніх пристроїв, або до комірок пам’яті ЕОМ. По-друге, як вже відмічалось раніше, через сегментні
  • 9.
  • 10. ОП ШІ AH AL Керування програмами BH BL РЗП CH CL CS DH DL DS SP SS BP РВ ES SI DI Керування шиною АЛП 1 СК ВБ 2 РС 3 4 IP Черга команд Рис.1 Узагальнена схема мікропроцесора Intel 80х86.
  • 11. Завдання для перевірки №2: Назвіть всі сегментні регістри процесора Intel 8086. За адресацію яких сегментів вони відповідають? Третя функція ШІ – це вибирання команд з оперативної пам’яті комп’ютера. Як відомо, всі команди, які повинні бути виконані програмою, розташовані в оперативній пам’яті комп’ютера. Тому для прискорення роботи процесора вона організована таким чином: ОП та ШІ працюють одночасно, але ШІ попереджує роботу ОП на один крок. ОП “дає знати” ШІ, яка команда буде наступною та з якої комірки оперативної пам’яті треба її вибирати. Таким чином, доки ОП виконує арифметичні та логічні дії над числами, ШІ вибирає з оперативної пам’яті наступну команду або блок команд та завантажує його до верхньої частини черги команд, що значно прискорює роботу комп’ютера. Тому збільшення розміру черги команд – дуже ефективний шлях для підвищення швидкодії процесорної системи. Якщо процесор Intel 8086 мав чергу команд лише на чотири байти, то сучасні процесори мають окремі внутрішні області пам’яті як для збереження кодів команд, так і для збереження даних користувача. Такі осередки пам’яті називаються “кешами” і розмір їх може складати від 64 кБ до 512 кБ. Важливу роль також відіграє швидкість обміну даними між ОП та чергою команд або кешом процесора. Організація пам’яті комп’ютера Загалом пам’ять персонального комп’ютера складається з двох частин: постійної пам’яті (ROM – Read Only Memory) та оперативної пам’яті (RAM – Random Accesses Memory). Пам’ять ROM – це спеціальна мікросхема, до якої занесена програма початкового завантаження операційної системи. Але на теперішній час для цього використовуються не мікросхеми постійних запам’ятовуючих пристроїв (ПЗП), а мікросхеми з електричним записуванням та зтиранням інформації (запам’ятовуючи пристрої, що перепрограмуються). Найбільш цікавою частиною постійної пам’яті з точки зору програмування є базова система введення та виведення даних, або BIOS (Base Input Output System). Ця система налагоджується при збиранні комп’ютера та при підключенні до нього зовнішніх пристроїв, але при необхідності користувач може переналагодити її. Загалом оперативну пам’ять персонально комп’ютера можна умовно поділити на верхні адреси пам’яті, які використовуються системою BIOS та операційною системою MS-DOS, адреси відеопам’яті та нижні адреси пам’яті, де розташовуються драйвера зовнішніх пристроїв та програми користувача. На рис. 2 наведений розподіл адрес пам’яті для мегабайтного адресного простору комп’ютера IBM PC XT [3,4]. Всі адреси на рисунку вказані у десятковій та у шістнадцятирічній формі (шістнадцятирічні числа помічені літерою Н). Для комп’ютера типа IBM PC AT на базі процесора Intel 80286 з 32-разрядною шиною є можливою адресація 16 Мб оперативної пам’яті, а у комп’ютерах на базі процесора Intel 80386 для режиму реальних адрес пам’яті можлива адресація простору до 4 Гб, а при використанні захищеного режиму роботи процесора - до 64 Гб [2,6]. Якщо розмір оперативної пам’яті комп’ютера є меншим, то процесор може використовувати для тимчасового збереження даних простір вінчестера як віртуальну пам’ять [2]. 1.3 Основи програмування на мові асемблер та її синтаксис. Позначки, коди команд, операнди та директиви Формат запису команди асемблеру має такий вигляд [4,7-9]:
  • 12. {позначка:} [асемблерний код команди] {операнди}; {коментарії} Усі позначки у програмі повинні бути унікальними, і при цьому треба пам’ятати, що асемблер не відрізняє прописні та маленькі літери. При максимальній довжині рядка програми 132 символи (більшість програмістів використовують з них лише 80 відповідно до довжини екрану) максимальна довжина позначки - 31 символ. Позначка (якщо існує), асемблерний код команди та операнд відокремлюються один від одного принаймні одним проміжком або символом табуляції. Коментарі можуть стояти в любому місці асемблерної програми та повинні починатися з символу ; (крапка з комою). Всі символи в рядку асемблерної програми, що стоять праворуч від крапки з комою, вважаються за коментарі. Коментарі можуть містити будь-які друковані символи української або латинської абетки, цифрові та спеціальні символи, включаючи проміжок. Коментар може займати весь рядок або стояти праворуч від асемблерної команди, наприклад: ; Програма виводу даних на друк ADD AX, BX; Додати два числа, що містяться в регістрах АX та BX
  • 13. 0000 Таблиця векторів переривань 1 кб 00400H Область даних BIOS Драйвера пристроїв MS-DOS Резидентні програми Пам’ять, яка адреується операційною Префікс програмного системою сегменту (PSP) MS-DOS Програма користувача Файли даних, які задіяні програмою користувача 640 кб Незавантажена область пам’яті Мегабайтний простір адрес А0000Н 704 кб Відеопам’ять монохром- B0000H ного монітора у текстовому режимі Графічна відеопам’ять 736 кб монітора В8000Н Відеопам’ять кольорового монітора у EGA текстовому режимі 768 кб С0000Н BIOS відеоадаптера 800 кб C8000H ПЗП фіксованого диска 984 кб F6000H Бейсик-интерпретатор ПЗП BIOS ПЗП Рис. 2 Розподіл пам’яті комп’ютера IBM PC XT
  • 14. Зрозуміло, що кількість коментарів ніяк не впливає на складність програми, оскільки вони не відносяться до машинних кодів. Позначки в асемблері можуть містити такі символи: 1. Англійські літери A...Z, a...z 2. Цифри 0...9 (не можуть бути першим символом позначки). 3.Спеціальні символи Знак питання (?); амперсанд(@); підкреслення ( _ ); долар ($); крапка (.) (тільки як перший символ позначки). Також заборонено використовувати як позначки зарезервовані асемблером слова, до яких відносяться коди команд, директиви, імена регістрів тощо. У таблиці 3 наведені приклади вірних та невірних позначок. Таблиця 3. Приклади позначок Приклади вірних позначок Приклади невірних позначок CoU AX 1A $10 Thislabelisverylongbutcorrect Thislabelisverylongandnotcorrect It_is_a_label Це є позначка _y_z It is a label @2 ADD .2 Proc M2 2 2M !2 2. Асемблерний код команди вказує транслятору, яку дію треба виконати у даній операції. Це може бути пересилання даних між регістарми процесору, з регістру до пам’яті або навпаки (команда MOV), команди обробки даних, наприклад збільшення чи зменшення на 1
  • 15. (INC, DEC), додавання (АDD), віднімання (SUB), множення (MUL) або ділення (DIV), команди організації логіки програми, команди переходу на підпрограму та багато інших. Якщо передбачена робота з даними і кодом команди вони не визначаються, то асемблерна команда завжди містить операнд, який може містити: 1. Чисельне значення даних; 2. Регістри та комірки пам’яті, над якими буде виконуватись дія, що обумовлюється кодом команди Приклади асемблерних команд: CNT DB 10; Визначити байт пам’яті з назвою CNT та занести до нього число 10. MOV AL,CNT; Занести до регістру АL число з комірки CNT ADD AL,12; Збільшити число, що міститься у регістрі AL на 12. INC AL; Збільшити число у регістрі, що міститься у регістрі AL на 1. MOV BL,AL; Переслати дані з регістру AL до регістру BL. . RET; Команда повернення з підпрограми. Операндів не має. Крім того, асемблер має велику кількість операторів, які дозволяють керувати процесом асемблювання та виведенням початкового тексту програми на друк. Ці оператори називаються псевдокомандами або директивами [4,7-9]. Вони використовуються тільки при асемблюванні програми та не генерують асемблерного коду. Головні з них наведені нижче. Директива PAGE. Ця директива розміщується на початку програми та вказує на кількість рядків, що друкуються на сторінці, та кількість символів в одному рядку. Формат директиви: PAGE [кількість рядків], [кількість символів] Наприклад, директива PAGE 50,100 встановлює режим виведення даних на друк 50 рядків на лист при сотні символів в одному рядку. Кількість рядків може бути встановлена у межах 10-255, кількість символів від 60 до 132. Директиви SEGMENT та ENDS. Як вам вже відомо, будь-яка асемблерна програма має принаймні один сегмент - сегмент коду програми. В більшості програм окремими сегментами виділяються чисельні дані користувача та стек. Сегмент описується за допомогою директиви SEGMENT таким чином:
  • 16. NSEG SEGMENT {параметри} ... ...; інструкції асемблера ... NSEG ENDS Ім’я сегменту є обов’язковим, мусить бути унікальним та відповідати узгодженням про імена позначок, які наводилися вище. Директива ENDS з тією ж позначкою відповідає кінцю сегмента. Директива ORG. Ця директива використовується для зміни вмісту лічильника адреси без допомоги асемблерних команд умовного чи безумовного переходу. Найчастіше вживається для встановлення адреси завантаження програми на її початку. Наприклад, директива ORG 100H встановлює лічильник адреси на зміщення 100H (шістнадцятирічне число 100) відносно початку сегменту кода, а директива ORG $+10H збільшує адресу, яка завантажена у лічильник команд, на 10H (шістнадцятирічне число 10). Директиви PROC та ENDP, команди CALL та RET. Сегмент коду може крім кодів основної програми містити одну чи декілька процедур, які визначаються директивою PROC. В кінці процедури повинні стояти команда RET та директива ENDP. Директива ENDP ставиться для того, щоб транслятор асемблера розпізнав початок та кінець процедури та її обсяг. Виклик процедури здійснюється за допомогою команди CALL. Формат команди: CALL [ім’я процедури] При виклику процедури числа, що знаходяться у всіх регістрах процесора, завантажуються до стека, а до лічильника команд завантажується адреса початку процедури. На кінці процедури перед директивою ENDP ставиться команда RET. Результатом її виконання є завантаження вмісту верхніх комірок стеку до регістрів процесора та перехід на точку переривання головної програми. Команда RET може ставитися і в середині процедури, якщо це передбачено логікою програми. Крім того, цією командою здійснюється вихід з асемблерної програми до командного режиму MS-DOS. Таким чином, асемблерна програма, яка містить процедуру, буде мати такий вигляд: NSEG SEGMENT; опис сегменту NPROC PROC; опис процедури
  • 17. ... ... ... RET; повернення до основної програми ENDP; кінець процедури ... ... ... CALL NPROC; ... ... RET; повернення до MS-DOS ENDS; Директива END. Ставиться останнею у програмі та завершує її. Якщо програма писалася як процедура, директива END містить ім’я процедури як параметр (END {[ім’я процедури]}). Якщо це com-програма і виконується в одному сегменті, параметр не використовується. 1.4. Перетворення програми з тексту на мові асемблера у виконуваний модуль Для того, щоб програма, написана на мові асемблера, могла бути виконана процесором, вона, як і програма на будь-якій іншій мові, окрім машинної, має бути трансльована (за допомогою асемблера) та скомпонована (за допомогою редактора зв’язків). Для виконання лабораторних робіт у визначеному нижче вигляді можна застосовувати будь-який асемблер, що використовує синтаксис Intel. Можна використовувати асемблер з іншим синтаксисом, наприклад синтаксисом AT&T, але для цього буде потрібно внести відповідні зміни у наведені нижче приклади та зразки. Тут ми розберемо послідовність дій, необхідну для трансляції і компонування програм за допомогою транслятора MASM. Трансляція виконується командою
  • 18. MASM ім’я_файлу Інші параметри команди можна подивитися за загальним правилом за допомогою команди MASM /? Компонування EXE-програми здійснюється за допомогою команди LINK об’єктний_модуль Для компонування COM-програми необхідно додати ключ /TINY: LINK /TINY об’єктний_модуль Інші параметри команди можна подивитися за загальним правилом за допомогою команди LINK /? Довідку з ассемблера MASM та його мови можна отримати за допомогою команди QH 1.5. Основи роботи з програмою AFD Програма AFD дозволяє відлагоджувати програми, які написані на мові асемблеру процесорів Intel 8086 та Intel 80286. Основні можливості програми AFD: 1. Занесення до пам’яті ЕОМ виконуємих модулей та їх дізасемблювання (переведення тексту програми із двійкових машинних кодів на мову асемблера). 2. Виконання всієї занесеної програми або її частини. 3. Виконання окремих інструкцій програми у покроковому режимі. 4. Аналіз стану всіх регістрів процесора та комірок пам’яті прямого доступу. 5. Внесення програмістом змін до всіх реєстрів процесора та комірок пам’яті ЕОМ прямого доступу. Головне меню відладчика AFD (рис. 3) являє собою систему з шести вікон та командної строки. За допомогою клавіш керування курсором ↑ та ↓ маркер строки переміщується по вікну програми-дізасемблера, а інші функції виконуються за допомогою функціональних клавіш F1...F10 (таблиця 6) та системи команд (таблиця 7).
  • 19. Регістри загального призначення, Регістр стану процесору вказівники та Стек сегментні регістри Командна строка Асемблерний код завантаженої Перше вікно пам’яті програми Друге вікно пам’яті Рис. 3. Загальний вигляд інтерфейсу програми AFD. Головна перевага відладчика AFD - його відносна простота та зручність багатовіконного інтерфейсу. Ці переваги особливо відчутні при відлагодженні невеликих com-модулей. Недоліки цієї програми - неможливість проглядання робочого екрана програми, що виконується, та неможливість одночасного проглядання двох або більшої кількості програм. Таблиця 6. Призначення функціональних клавіш системи AFD Клавіша Функція Що виконує програми F1 Step Виконання однієї інструкції програми, відміченої маркером у вікні дізасемблера. F2 Step Proc Повне виконання одного рядка програми. Наприклад, якщо це є викликання підпрограми, то вона буде виконана одразу повністю як одна інструкція. F3 Retrieve Повторення введених команд командної строки. Можна повторити до шести команд. F4 Help Виклик файлу допомоги. F5 Set BRK Встановлення точок зупинення.
  • 20. Клавіша Функція Що виконує програми F6 - Клавіша незадіяна. F7 Up Перенесення маркера догори. F8 Dn Перенесення маркера донизу. F9 Le Перенесення маркера ліворуч. F10 Ri Перенесення маркера праворуч. Таблиця 7. Набір головних команд, які підтримуються відладчиком AFD Команда Призначення 1. L ім’я файла {адреса} Ввести файл до пам’яті ЕОМ. Адреса розміщення може бути вказана явно, але це не обов’язково. По замовченню адреса розташування програми буде CS:0100H. Число прочитаних байтів після завершення програми вказуєтьсся парою реєстрів BX:CX. 2. W ім’я файла, адреса, Записати дані до файлу. Початкова адреса повинна довжина знаходитися у сегменті даних DS. Довжина файлу повинна бути у межах чотирьох шістнадцятирічних цифр. Всі параметри команди є обов’язковими. 3. D адреса Показати коди команд, починаючи з вказаної адреси. Сегмент пам’яті визначається реєстром CS. З цієї ж адреси можна і виконувати програму. 4. R реєстр = значення Занести число до регістра процесора. Наприклад, R А=100H - команда заносить до реєстру А число 100H. Якщо набрати R FL=значення - можна завантажити весь реєстр стану як один шістнадцятирічний реєстр. Але є можливим і окремий доступ до бітів реєстру стану
  • 21. Команда Призначення через імена OF, DF, IF, SF, ZF, AF, PF, CF. 5. Mn – адреса Показати перше або друге вікно стану пам’яті (значення параметру n 1 або 2), починаючи з вказаної адреси. 6. G {стартова адреса}, Виконати програму від стартової адреси до адреси {адреса зупинки} зупинки. Якщо не вказана стартова адреса, то виконання програми почнеться з адреси, на який вона була припинена. Якщо не вказана адреса зупинки, то програма буде виконуватись до першої точки припинення або до кінця. Крім того, можна припинити виконання програми через натиснення клавіш Ctrl+Esc. 7. QUIT {R} Повернення до DOS. Опція R робить програму afd резидентною. В цьому випадку її ініциалізація проводиться через натиснення клавіш Ctrl+Esc. 1.6. Основи роботи з програмою TD Програма TD (turbo-debugger) дозволяє відлагоджувати програми, які написані на мові асемблера мікропроцесорів Intel 8086 - Intel 80486 [8,9]. Ця програма є розробкою фірми «Borland International» та входить до складу пакетів програмування Borland Pascal та Borland C++. Тому інтерфейс програми реалізовано у стандарті Turbo-Vision та відповідає загальному вигляду інтерфейсу цих середовищ, що значно спрощує його вивчення. Основні можливості програми TD: 1. Занесення до пам’яті ЕОМ виконуємого модуля та його дізасемблювання. 2. Виконання всієї занесеної програми або її частини. Кількість точок перевивань необмежена. 3. Виконання окремих інструкцій програми у покроковому режимі. 4. Аналіз стану всіх реєстрів процесора та комірок пам’яті, до яких є прямий доступ. 5. Внесення програмістом змін до всіх регістрів процесора та комірок пам’яті ЕОМ, до яких є прямий доступ.
  • 22. 6. Проведення одночасного огляду даних, що знаходяться у комірках пам’яті ЕОМ з різними адресами (за допомогою опції меню Add Watch або комбінації клавіш Ctrl+F7). 7. Поглядання робочого екрану програми, що виконується, якщо в ній передбачене виведення даних на монітор (за допомогою опції меню User Screen або комбінації клавіш Alt+F5). Головні вікна відладчика TD розташовані на його робочій панелі. Їх розмір може бути зміняний за допомогою миши, якщо це необхідно. Кількість вікон необмежена. Кожне вікно, в якому завантажена програма, розбито на 5 робочих областей. На рис.4 наведена структура вікна. Порядок розташування вікон може бути зміняний за допомогою опцій меню Window або функціональних клавіш, зазначених у таблиці 8.
  • 23. Верхній рядок меню Панель 2 Робоча Регістри Панель3 панель загального Регістр Панель 1 призначення стану Асемблерний код процесор завантаженої програми Вказівники а Активне та сегментні вікно регістри Панель 5 Панель 4 Комірки пам’яті, що від- Комірки пам’яті, що відповідають сегменту даних повідають сегменту стека Нижній рядок меню (призначення клавіш F1-F10) Рис 4. Загальний вигляд інтерфейсу програми TD. Таблиця 8. Опції пункту меню Window системи TD Опція Клавіша Що виконує Zoom (Z) F5 Збільшує розмір активного вікна до розміру всієї робочої панелі. Next (N) F6 Перехід до наступного вікна. Next pane (X) Tab Перехід до іншої панелі у тому ж робочому вікні. Size/move (S) Ctrl+F5 Зміна розмірів вікна та його переміщення.
  • 24. Опція Клавіша Що виконує Close (C) Alt+F3 Закрити активне вікно Undo close Alt+F6 Знову відкрити вікно, яке щойно було закрите Для аналізу точок припинень зручно користатись пунктом меню Breakpoints, головні опції якого зазначені у таблиці 9. Для видалення окремих точок припинень програми треба послідовно виконати такі дії: 1. Звернутися до опції Breakpoints пункту меню View. 2. Коли всі точки припинень будуть висвітлені у окремому вікні, вибрати точку, яку треба видалити, за допомогою клавіш переміщення курсора ↑ та ↓. 3. Натиснути клавішу Delete. 4. Повернутися до активного вікна через опцію меню Window або за допомогою миши. Взагалі функції меню View дозволяють проглянути у повноекранному режимі будь-яку з панелей активного вікна (регістри процесора, сегментні регістри), а також шістнадцятирічні коди інших виконуємих модулей (опція File), таблицю змінних завантаженої програми (опція Variables), зміст програмного буферу (опція Clipboard) тощо. Програмний буфер може бути завантажений через стандартні функції меню Edit Copy та Paste. Таблиця 9. Опції пункту меню Breakpoints для системи TD Опція Клавіш Що виконує а Toggle (T) F2 Зробити точку припинення там, де у даний момент припинено виконання програми. At Alt+F2 Задати чисельну адресу точки припинення у шістнадцятирічній формі у форматі CS:IP. Delete All - Видалити всі точки переривань. Iconize/restore - Використання цієї опції меню приводить до звертання вікна. Повторне її використання знову відкриває вікно. Пункт головного меню Data призначений для безпосередньої роботи з даними користувача та з комірками пам’яті та іменами змінних. Він містить функції, зазначені у таблиці 10. Призначення усіх функціональних клавіш у програмі TD наведене у таблиці 11.
  • 25. Таблиця 10. Опції пункту меню Data для системи TD Опція Клавіша Що виконує Inspect - Поглядання значення заданої змінної або комірки пам’яті Evalute/modify Ctrl+F4 Обчислення значення виразу Add Watch Ctrl+F7 Поглядання значень змінних у окремому вікні Function return - Адреси повернення функцій та процедур Таблиця 11. Призначення функціональних клавіш у програмі TD Клавіша Призначення F1 Допомога. F2 Зробити точку зупинки там, де у даний момент припинено виконання програми. F3 Поглядання початкового коду завантаженої програми. F4 Перехід до рядка, на якому програма була припинена. F5 Збільшення розміру активного вікна до розміру всієї робочої панелі. F6 Перехід до наступного вікна. F7 Покрокове виконання програми. При переході на процедуру буде покроково виконана кожна команда процедури. F8 Покрокове виконання програми. Команда виклику процедури виконується як одна команда. F9 Запуск програми на розрахування. F10 Перехід до верхнього рядка меню. 2. Порядок виконання роботи 1. Знайти транслятор і файли afd.exe та td.exe.
  • 26. 2. Проаналізувати текст програми lab1.asm, зрозуміти зміст кожної з асемблерних команд. З’ясувати, як будуть змінюватися дані всіх регістрів процесору при виконанні кожної з них. Текст програми повинен мати такий вигляд:
  • 27. text SEGMENT ORG 100h begin: MOV ax,20 MOV bx,30 ADD ax,bx MOV cx,ax ADD ch,16 RET text ENDS END begin 2. Сформувати лістинг, об’єктний та виконуваний код для програми lab1.asm; останній записати у файл lab1.com. 3. Запустити програму lab1.com на обробку. Переконайтеся в тому, що вона коректно виконується (комп’ютер не «підвісає»). 4. Завантажити програму lab1.com до відладчика AFD та крок за кроком виконати всі її команди. Після виконання кожної команди аналізувати стан кожного з регістрів процесора. 5. Завантажити програму lab1.com до відладчика TD та крок за кроком виконати всі її команди. Після виконання кожної команди аналізувати стан кожного з регістрів процесора. 3. Зміст звіту 1. Послідовність дій, які потрібно виконати для компіляції асемблерної програми. Розглянути два випадка: компіляцію com-програми та компіляцію exe-програми. 2. Таблиця з трьох колонок. До першої занести початковий код асемблерної програми файлу lab1.asm, до другої - її машинні коди, а до третьої - стан усіх регістрів процесору після її виконання. 3. Висновки за роботою. 8 4. Контрольні питання: 1. Узагальнена структура мікропроцесора Intel 8086 та персонального комп’ютера IBM PC. 2. Що таке початкова та об’єктна програма? 3. Структурна схема гіпотетичного мікропроцесора, призначення всіх його регістрів. 4. Основні регістри процесору типа Intel 8086, їх призначення.
  • 28. 5. Сегментація програми. Сегменти коду, даних та стеку. Їх розташування в пам’яті ЕОМ. Директиви мови асемблера SEGMENT та ENDS. 6. Організація стекової пам’яті та її призначення. 7. Регістр стану процесора. Його призначення. Біти регістра стану у процесорі Intel 8086. 8. Режим трасування програми. Як він встановлюється і для чого використовується? 9. Поясніть приклади позначок та приклади асемблерних команд, які наведені у теоретичній частині цієї роботи. Наведіть свої приклади. 10. Чи потрібно аналізувати регістр стану при виконанні команд програми lab1.asm? Чому?
  • 29. Лабораторна р о б о т а №2 Арифметичні та логічні операції мови асемблер Мета роботи: Навчитися писати на мові асемблер прості програми, які реалізують алгоритми, що містять арифметичні та логічні операції над чисельними даними. Необхідні знання та практичні навички: Знання основ програмування на мові асемблера та основ роботи з транслятором TASM і динамічними відладчиками AFD та TD [1,4,7-9]. 1. Теоретичні відомості 1.1. Директиви визначення даних Для безпосереднього визначення чисельних та рядкових величин, які не змінюються при виконанні програми, у мові асемблер введені директиви визначення даних. Формат директиви визначення даних такий: [ім’я] D{n} {вираз} де D{n} - одна з команд визначення даних, які будуть наведені нижче. Ім’я елемента вказувати не обов’язково. Але, оскільки у програмі завжди існують посилання на ті чи інші дані, використання імен для роботи з ними є найбільш зручним. Наприклад: A1 DW 2; Визначити слово (дві комірки пам’яті) та занести до них число 2 A2 DB 5; Визначити байт (одну комірки пам’яті) та занести до неї число5 ................................................................................................................................... ................................................................................................................................... MOV AX,A2; Занести число A2 до акумулятору. MOV CH,A1; Занести число A1 до старших 8 бітів регістра СX Існує чотири команди визначення даних, які підтримуються в мові асемблер: DB - визначити байт (одну комірку пам’яті); DW - визначити слово (дві комірки пам’яті); DQ - визначити чотири слова (вісім комірок пам’яті); DT - визначити десять слів (двадцять комірок пам’яті).
  • 30. Вирази при описуванні даних можуть бути чотирьох типів: 1. Вирази-константи. У директивах з виразами-константами чисельні дані задаються безпосередньо, при цьому визначається також їх тип. Подальше у програмі вони можуть бути використані тільки як дані визначеного типу. Крім того, після числа вказується система числення, у якій записано число: B - двійкова; Q - вісімкова; H - шістнадцятирічна; D - десяткова. Якщо, як в попередньому прикладі, явних вказівок на систему числення немає, то по замовченню число розглядається як десяткове. Наприклад: A1 DW 2 ; Визначити слово (дві комірки пам’яті) та занести до них число 2. A2 DB 15H ; Визначити байт (одну комірки пам’яті) та занести до неї ; шістнадцятирічне число 15 B1 DQ 17Q ; Визначити чотири слова та занести до них вісімкове число 17. Завдання для перевірки №1: Переведіть числа, які позначені змінними A2 та B1 у двійкову та у десяткову системи числення. Слід зазначити, що у мові асемблера процесору Intel 8086 передбачені переміщення та обробку лише даних одного типу. Наприклад, запис: A2 DB 15H MOV AX, A2 є невірним, тому що до акумулятору, якій має 16 розрядів, ми намагаємося завантажити восьмирозрядне число (1 байт). Нижче наведено 2 вірних варіанти: A2 DB 15H A2 DW 15H MOV AL, A2 MOV AX, A2 2. Невизначені вирази. Якщо комірка пам’яті мусить бути завантажена не з початку роботи програми, а тільки у процесі її роботи, то її перед початком роботи програми треба зарезервувати. Це досягається таким чином: A1 DW ?;
  • 31. Тоді у будь-якому місті програми можна поставити оператор типу: MOV A1, АX Результатом виконання такого оператора буде перенесення даних з акумулятору до комірки пам’яті з ім’ям A1. Як вам відомо, у мовах високого рівню, таких як ПАСКАЛЬ, С або ж Фортран, таке визначення змінних також ефективно використовується, а самі такі змінні називають невизначеними або динамічними. Завдання для перевірки №2: Пригадайте, як визначаються динамічні змінні у мові програмування ПАСКАЛЬ? В яких випадках вони використовуються? 3. Вирази з визначенням кількох констант. Вираз може містити водночас декілька констант, що розділяються комами. Кількість таких констант обмежується тільки довжиною рядку. Наприклад: A3 DB 10,12,23H,1001B асемблер визначає такі константи у вигляді послідовних суміжних байт. Посилання на ім’я А3 вказує на першу константу, А3+1 - на другу, А3+2 - на третю тощо. Наприклад, команда: MOV AH,A3+2 заносить до старших восьми розрядів акумулятора шістнадцятирічне число 23. При роботі з константами такого типу треба мати на увазі, що якщо команда асемблера DB резервує по одному байту для кожного числа, то команда DW – по одному слову (два байти), незалежно від кількості розрядів у числах, що завантажуються. Тому при використанні команди типа A3 DW 10,12,23H,1001B посилання на другу константу (число 12) буде здійснюватись через вираз А3+2, а не А3+1, як це було у попередньому прикладі (поясніть чому саме). У мовах високого рівня таким чином описуються змінні з індексами або масиви. Завдання для перевірки №3: Скільки констант визначено в наведеному вище операторі DB під назвою А3? Переведіть всі ці числа у двійкову, десяткову та шістнадцятирічну системи числення. Як би ви визначили відповідний масив з ім’ям А3 у мові програмування ПАСКАЛЬ?
  • 32. Завдання для перевірки №4: Напишіть на мові асемблера фрагмент програми, у якому: 1. Завантажте п’ять чисел: 12,13H,18,70Q,280 під одним ім’ям. 2. Завантажте друге з визначених чисел до регістру АХ, а п’яте до регістра СХ. Яку з наведених вище команд ви використали для визначення даних і чому? 4. Вирази з повторенням змінних. Директиви визначення даних допускають заповнення сусідніх комірок пам’яті однаковими значеннями через дублювання даних. Формат такої директиви має вигляд: [ім’я] D{n} {число повторень} DUP {вираз} Наприклад: DW 10 DUP(?) ; десять невизначених слів DB 5 DUP(14); п’ять байт, в яких містяться числа 0EH DB 3 DUP(4DUP(8)); дванадцять байт, в яких містяться числа 8H Завдання для перевірки №5: Наведіть свої приклади виразів з повторенням змінних та поясніть їх викладачеві. Які ви бачите можливості практичного використання виразів з повторенням змінних при написані програм? Вираз може містити чисельну або символьну константу. Символьні константи беруться у подвійні або одинарні ‘лапки’ та переводяться при обробці програми в коди ASCII (додаток 3). Наприклад: A1 DB ‘IBM PC AT’ Більш досконало робота з рядковими константами у мові програмування асемблер буде описана у теоретичних відомостях до лабораторної роботи №4. 1.2. Команда перенесення даних У чотирирозрядних та вісьмирозрядних процесорах існувало багато асемблерних кодів для команд перенесення даних [1]. Наприклад, існували окремі команди для перенесення даних з одного регістру процесору до іншого, з комірки пам’яті до регістру та з регістру до комірки пам’яті. Але перехід до шістнадцятирозрядної шини даних дозволив реалізувати один асемблерний код команди MOV для будь-якої операції перенесення даних [4,7-9].
  • 33. Формат команди: {позначка} [код команди] [операнд-приймач], [операнд-джерело] Увага! Розташування в цій команді приймача і джерела даних є стандартним для процесорів фірми Intel. Використання команди MOV тісно пов’язано з видами адресації, що використовуються в асемблері. Відрізняють п’ять головних видів адресації. 1. Безпосередня адресація. Дані, що завантажуються, містяться безпосередньо у коді команди. Наприклад: A4 DB ?; Зарезервувати комірку для змінної А1 ........................................................................................................... MOV AX,15H; Завантажити до акумулятору число 15H MOV A4,15H; Завантажити до комірки пам’яті A1 число 15H 2. Неявна адресація. Джерело та приймач інформації записуються у самому коді команди. Це може бути назва регістру або посилання на комірку пам’яті. Наприклад: A1 DB 100H; Завантажити до комірки пам’яті A1 число 100H ............................................................................................................... MOV BX,A1; Завантажити до регістру BX вміст комірки A1 MOV AX,BX; Завантажити до регістру AX вміст регістру BX 3. Пряма адресація. Безпосереднє звертання до комірки пам’яті з визначеним номером. Цей вид адресації використовується при системному програмуванні для занесення даних до комірок пам’яті, вміст яких впливає на виконання системних процедур та загалом на представлення інформації в комп’ютері. Наприклад: MOV [B8000], ‘A’; Завантажити символ А до відеопам’яті При вирішенні несистемних математичних та логічних задач цим видом адресації програмісти майже не користуються. Замість нього в більшості випадків використовується безпосередня та неявна адресація. 4. Посередня адресація. При цьому виді адресації вміст одного регістру або регістрової пари процесору є вказівником на комірку пам’яті, що містить потрібну інформацію або в яку вона мусить бути поміщена. Посилання на поточну комірку пам’яті позначається символом $ (долар). Наприклад:
  • 34. MOV BX, 100H МOV CX, [BX]; Завантажити до регістру СХ число з сегменту даних зі зміщенням 100Н ;(повна адреса комірки пам’яті DS:100H ) Як можна побачити з наведеного прикладу, посилання на комірку пам’яті позначається в асемблері через квадратні дужки. 5. Адресація зі зміщенням. Як і посередня адресація, місить посилання на комірку пам’яті. Зміщення вказується як безпосередній операнд. Ефективно використовується разом з директивою визначення кількох констант. Наприклад: A DB 1,2,3,4,5; Визначення масиву з кількох констант ................................................................................................. MOV BX, A+2; Завантажити до регістру BX число 3 1.3. Арифметичні операції над двійковими числами Додавання та віднімання байт або слів, що містять двійкові дані, здійснюється за допомогою команд ADD та SUB відповідно [1,4,7-9]. Формат команд додавання та віднімання у мові програмування асемблер цілком співпадає з форматом команди MOV: {позначка} [код команди] [операнд-приймач], [операнд-джерело] Зрозуміло, що результат операції буде завантажений до операнда-приймача. Таким чином, наприклад, при складанні двох чисел (виконанні команди ADD), перше з чисел, які складаються, буде втрачене, а замість нього у відповідний регістр або комірку пам’яті завантажується отриманий результат. Віднімання у двійковій арифметиці реалізується через додавання від’ємних чисел. Від’ємне число містить одиничний біт у старшому розряді та формуються за допомогою двійкового доповнення. Таким чином, для представлення від’ємного числа необхідно інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Наприклад: Число 65 01000001 Інверсія бітів 10111110 Додати 1 10111111 Число -65 Зміна знака від’ємного числа проводиться таким самим чином: треба інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Для нашого приклада:
  • 35. Число –65 10111111 Інверсія бітів 01000000 Додати 1 01000001 Число 65 Сума двох рівних за модулем, але різних за знаком чисел, при такому формуванні кодів від’ємних чисел завжди буде дорівнювати 0 (перевірте це для чисел 65 та -65 та спробуйте математично довести цю тотожність). Таким чином, процесор записує від’ємні числа як великі додатні, і правила мови асемблера не дають можливостей їх відрізнити. Програміст повинен сам чітко слідкувати за зміною чисел у регістрах і фіксувати їх знак, якщо у цьому є необхідність. Існують п’ять можливих ситуацій використання команд ADD та SUB, що пов’язані з представленням та розташуванням даних, які представлені у таблиці 12. Таблиця 12. Команди додавання та віднімання мови АСЕМБЛЕР Операція Приклади Додавання/віднімання регістр-регістр. ADD AX,BX SUB CL,DL Додавання/віднімання регістр-пам’ять. A1 DW 50H A2 DB 10H …………….......................... ADD AX,A1 SUB CL,A2 Додавання/віднімання пам’ять-регістр. A1 DW 50H A2 DB 10H …………….......................... ADD A1,AX SUB A2,CL Додавання/віднімання регістр-безпосереднє значення. ADD A1,10H SUB A2,8 Додавання/віднімання пам’ять-безпосереднє значення. A1 DW 50H A2 DB 10H …………….......................... ADD A1,5
  • 36. Операція Приклади SUB A2,12H Додавання/віднімання регістр-безпосереднє значення. ADD A1,10H SUB A2,8 Додавання/віднімання пам’ять-безпосереднє значення. A1 DW 50H A2 DB 10H ………………....................... ADD A1,5 SUB A2,12H Прямої операції «Пам’ять-Пам’ять» мікропроцесори типу Intel 80x86 не підтримують. Тому такі дії потрібно здійснювати через три елементарних операції процесора: 1. Занесення даних з комірки пам’яті №1 до регістру. 2. Виконання операції додавання або віднімання між регістром та коміркою пам’яті №2. 3. Занесення даних з регістру до комірки пам’яті №2. Наприклад: A1 DW 50H A2 DW 10H ................................................ MOV AX,A1 ADD AX,A2 MOV A2,AX Множення та ділення чисельних даних в мові асемблер здійснюється за допомогою команд MUL та DIV для беззнакових чисел та за допомогою команд IMUL та IDIV для знакових чисел. Контроль над форматом чисел, що обробляються, не може здійснюватись процесором автоматично, тому вибирати для використання ту чи іншу команду повинен сам програміст. В асемблері мікропроцесора Intel 8086 існують два формати команди множення - множення байта на байт та множення слова на слово. При множенні байта на байт один з множників знаходиться у регістрі AL, а другий - в байті пам’яті або в однобайтовому регістрі. Результат виконання операції множення буде розміщений в регістрі AX. Наприклад, фрагмент програми, що знаходить куб числа 5, можна записати таким чином: A1 DB 5H