
Лабораторна робота № 1
Тема: Підготовка і налагодження програми у середовищі Turbo Assembler.
Мета: Навчити студентів виконувати підготовку та налагодження програм у середовищі Turbo Assembler.
Обладнання:Комп’ютерний клас.
Програмне забезпечення: Операційна система Windows, система програмування Turbo Assembler.
Завдання для самостійної підготовки:
Програмна модель процесора.
Регістри загального призначення.
Сегментні регістри.
Регістри стану та керування.
Типи даних.
Формат команд.
Теоретичні відомості
Програма мовою Асемблера складається з логічних розділів, які мають назву сегменти і можуть належати до класів: сегмент кодів, сегмент даних і сегмент стеку.
У сегмент кодів записують команди, процедури програми (власне програму). Послідовність розміщення сегментів для більшості задач може бути довільною. Структура, коли є усі три частини, вважається типовою для нескладних програм, хоча може бути й іншою.
У сегменті даних визначаються змінні та області, з якими працює програма.
У сегменті стеку визначається розмір області пам’яті, яка резервується під стек відповідно до потреб програми.
Далі наведена структура програми, що може бути зразком для виконання лабораторних робіт (сегмент стеку можна не визначати). У сегменті кодів цієї програми визначені дві процедури: основна MAIN і допоміжна PRINT, яка викликається із основної командою call print.
Кожний оператор програми мови Асемблера розміщується в окремому рядку. Після оператора праворуч від символу ; (крапка з комою) може бути коментар. Можливий окремий рядок (рядки) з коментарем.
Оператори мови поділяють на командні оператори (команди мови) та директиви. Кожній команді мови відповідає певна команда (інструкція) процесора. Директиви визначають сегменти програми (segment, ends), змінні (db, dw, тощо), процедури (proc, endp) програми, закінчення програми (end мітка), містять іншу необхідну транслятору інформацію про програму (наприклад, assume cs:code …).
Приклад:
Підготовка програми до виконання
Процес підготовки і відлагодження програми мовою Асемблера містить етапи підготовки вихідного тексту, трансляції, компонування і та відповідає наступній схемі:
|
|
|
|
Підготовка вихідного тексту програми виконується за допомогою будь-якого текстового редактора, який формує «чистий» текст без керівних символів. Можна також використовувати вбудовані редактори систем програмування. Файл з вихідним текстом повинен мати розширення .asm.
Для трансляції та компонування програми можна користуватись програмними пакетами фірми Microsoft (транслятор MASM і компонувальник LINK) або фірми Borland (транслятор TASM і компонувальник TLINK). Далі наведено приклади, що використовують транслятор tasm.exe і компонувальник tlink.exe.
Виклик транслятора має вигляд:
tasm <ім’я вхідного файла>.asm
Після відповіді на запит система дає інформацію про помилки в програмі. Програма не має помилок, якщо сформовано повідомлення:
Error messages: None
Warning messages: None
Після трансляції створюється об’єктний файл з розширенням .obj. В разі потреби, якщо додати директиву /L (тобто, tasm /l <ім’я вхідного файла>.asm), отримаємо файл результатів трансляції з розширенням .lst
Компонування об‘єктного файла виконується за допомогою програми-компонувальника (редактора зв’язків), який створює завантажувальний (виконуваний) файл з розширенням .exe Компонувальник tlink викликається інструкцією:
tlink <ім’я вхідного файла>.obj
Відлагодження готової програми може виконуватись різними методами.
Робота з Turbo Debugger
Turbo Debugger – програма-відлагоджувач – віконне середовище відлагодження програм на рівні вихідного тексту мовами Pascal (C), Асемблер. Вона дозволяє знаходити місце й причини логічних помилок в програмі, для чого у відлагоджувачі є декілька режимів виконання програм, в тому числі й покроковий режим. В цьому режимі за один крок виконується одна машинна інструкція. Цей режим корисний для детального вивчення роботи програми або її відлагодження. Окрім того, під час знаходження у відлагоджувачі, можна вносити зміни до виконуваного коду програми, перевіряти й модифікувати значення змінних у пам’яті й регістрах.
Почати роботу в Turbo Debugger можна, зробивши виклик програми td.exe.
Запуститься програма-відлагоджувач Turbo Debugger й буде відкрито його вікно CPU. Вікно розбите на п’ять підвікон: в одному відображаються дизасембльовані машинні команди, в другому – шістнадцяткові байти даних, в третьому – стек (шістнадцяткові слова), в четвертому – вміст регістрів процесора й у п’ятому – стан прапорів процесора.
Для управління відлагоджувачем використовується головне меню (<F10>) та локальне меню, котре викликається за допомогою правої кнопки миші або клавішами <Alt+F10>.
Для завантаження програми у середовище налагоджувача необхідно в меню File вибрати Open… і далі необхідну програму (наприклад lab1_1.exe, код якої наводиться нижче).
У підвікні Code побачите текст програми lab1_1.asm. Також буде зазначена поточна виконувана команда маркуванням зліва у вигляді трикутника (у даному випадку це – перша команда).
Для покрокового виконання програми використовується клавіша <F8>. На кожному кроці переміщується курсор виконання (див. наступний рис.), змінюються значення регістрів процесора, стан прапорців (ознак), а також вміст стеку. Регістр SP змінюється після виконання команд PUSH та POP.
Виконання програми до зазначеного місця (команди) здійснюється за допомогою клавіші <F4>, попередньо встановивши курсор у необхідне місце.
Існує можливість змінити стан регістрів процесора під час виконання програми. Для цього необхідно правою кнопкою мишки натиснути вмісті регістра (наприклад, ax).
З‘явилось меню з наступними опціями:
Increment |
Для збільшення вмісту регістра на 1. |
Decrement |
Для зменшення вмісту регістра на 1. |
Zero |
Для встановлення в 0000. |
Change… |
Для введення вмісту регістра з клавіатури. |
Registers 32-bit |
Yes – для 32-розрядних регістрів. No – для 16-розрядних регістрів. |
Для зміни вмісту регістра ax, наприклад, на значення 0059 потрібно вибрати Change… та вказати 0059. Далі програма буде виконуватись вже з новим вмістом ax.
В області пам’яті (Dump) подається вміст комірок пам’яті визначеної області (в шістнадцятковому вигляді). Зліва у кожному рядку показана адреса комірки (у вигляді сегмент:зміщення). Справа від адреси виводяться значення елементів у відповідному форматі.
SpeedMenu в області Dump містить команди для переміщення в області, модифікації вмісту, переміщення за вказівниками, вибору формата виведення і роботи з блоками пам’яті. Його склад наступний:
Goto |
Позиціонує курсор на елементах даних із вказаною адресою. Після вибору цієї команди необхідно ввести нову адресу, до якої потрібно перейти. |
||||||||||
Search |
Шукає рядок символів чи список байтів, починаючи з вказаної адреси. |
||||||||||
Next |
Шукає наступний екземпляр елементу, заданого в команді пошуку. |
||||||||||
Change |
Дозволяє модифікувати байти за поточним положенням курсору. При виведенні в форматі ASCII чи шістнадцятковому вигляді виконується запит списку байтів, в іншому випадку – елемент поточного формату виведення. |
||||||||||
Follow |
Дана команда відкриває меню, яке дозволяє організацію ланцюгів ближніх і дальніх вказівників:
|
||||||||||
Previous |
Відновлює адресу області даних, яка була до останньої команди, явно змінивши значення даної адреси. Відлагоджувач підтримує стек з п’яти останніх адрес, тому ви можете повернутись назад після багатократного (але < 5) використання команд локального меню Follow чи команди Goto. |
||||||||||
Display As |
Дозволяє вибирати формат виведення в область даних. Ви можете вибирати один з форматів даних, що використовуються в мовах (С), Pascal чи Асемблер. Ці формати можна вибрати з меню. Наприклад, команда Byte встановлює область даних в режим виведення шістнадцяткових байтових даних, а Word – в режим виведення шістнадцяткових слів. |
||||||||||
Block |
Дозволяє працювати з блоками пам’яті. Ви можете переміщувати, очищати, присвоювати значення блокам пам’яті, а також записувати і зчитувати блоки пам’яті з файлів на диску, використовуючи меню. Наприклад, Set присвоює неперервному блоку в пам’яті конкретне байтове значення. Адресу блоку, кількість байтів, яким потрібно присвоїти значення, а також саме значення запитується у підказці. |
За допомогою команди Goto… можна відслідковувати будь-який сегмент. Переглянемо, наприклад, вміст сегменту кодів (cs). Для цього необхідно вибрати Goto… та вказати адресу (сегмент:зміщення). В даному випадку cs:0000.
Також можна змінити вміст комірки пам’яті, що належить сегменту програми. Для цього необхідно виділити комірку, яку потрібно замінити, вибрати в локальному меню команду Change та ввести нове значення. Значення може бути числом в шістнадцятковому коді або символом в одинарних лапках (буде записаний ASCII код символу).