|
Лабораторна робота № 1.
Структура програми на мові асемблера.
Директиви стандартної та спрощеної сегментації.
1.1. Мета роботи.
Дослідження структури програми на мові асемблера. Придбання практичних навиків по складанню програм з використанням директив стандартної та спрощеної сегментації. Придбання практичних навиків по асемблеруванню програм написаних мовою асемблера. Придбання практичних навиків з використання відладчика.
1.2. Методичні вказівки по організації самостійної роботи студентів.
При підготовці до лабораторної роботи необхідно вивчити розділ “Сегментна модель пам’яті” та “Директиви стандартної та спрощеної сегментації”.
Приступаючи до виконання роботи необхідно:
знати: директиви стандартної та спрощеної сегментації;
вміти: описувати сегменти даних, стека та коду.
1.3. Теоретичні відомості.
Стандартна сегментація.
Синтаксичний опис сегмента на асемблері являє собою конструкцію, зображену на мал. 1:
Рис. 1. Синтаксис опису сегмента
Важливо відзначити, що функціональне призначення сегмента трохи ширше, ніж проста розбивка програми на блоки коду, даних і стека. Сегментація є частиною більш загального механізму, зв'язаного з концепцією модульного програмування. Вона припускає уніфікацію оформлення об'єктних модулів, створюваних компілятором, у тому числі з різних мов програмування. Це дозволяє поєднувати програми, написані на різних мовах. Саме для реалізації різних варіантів такого об'єднання і призначені операнди в директиві SEGMENT.
Розглянемо їх докладніше.
За замовчуванням тип вирівнювання має значення PARA.
За замовчуванням атрибут комбінування приймає значення PRIVATE.
Усі сегменти самі по собі рівноправні, тому що директиви SEGMENT і ENDS не містять інформації про функціональне призначення сегментів. Для того щоб використовувати їхній як сегменти коду, чи даних стека, необхідно попередньо повідомити транслятору про це, для чого використовують спеціальну директиву ASSUME, що має формат, показаний на мал. 15. Ця директива повідомляє транслятору про те, який сегмент до якого сегментного регістра прив'язаний. У свою чергу, це дозволить транслятору коректно зв'язувати символічні імена, визначені в сегментах. Прив'язка сегментів до сегментних регістрів здійснюється за допомогою операндів цієї директиви, у яких ім'я_сегмента повинне бути ім'ям сегмента, визначеним у вихідному тексті програми директивою SEGMENT чи ключовим словом nothing. Якщо в якості операнду використовується тільки ключове слово nothing, то попередні призначення сегментних регістрів анулюються, причому відразу для всіх шести сегментних регістрів. Але ключове слово nothing можна використовувати замість аргументу ім'я сегмента; у цьому випадку буде вибірково розриватися зв'язок між сегментом з ім'ям ім'я сегмента і відповідним сегментним регістром (див. мал. 15).
Рис. 15. Директива ASSUME
Спрощена сегментація.
Для простих програм, що містять по одному сегменті для коду, даних і стека, хотілося б спростити її опис. Для цього в транслятори MASM і TASM увели можливість використання спрощених директив сегментації. Але тут виникла проблема, зв'язана з тим, що необхідно було якось компенсувати неможливість прямо керувати розміщенням і комбінуванням сегментів. Для цього разом зі спрощеними директивами сегментації стали використовувати директиву вказівки моделі пам'яті MODEL, що частково стала керувати розміщенням сегментів і виконувати функції директиви ASSUME (тому при використанні спрощених директив сегментації директиву ASSUME можна не використовувати). Ця директива зв'язує сегменти, що у випадку використання спрощених директив сегментації мають визначені імена, із сегментними регістрами (хоча явно ініціалізувати ds усе рівно прийдеться).
У листинге 1 приведений приклад програми з використанням спрощених директив сегментації:
Листинг 1. Використання спрощених директив сегментації masm;режим роботи TASM: ideal чи masmmodel small;модель пам'яті.data;сегмент данихmessage db 'Уведіть двох шестнадцатеричні цифр,$'.stack;сегмент стека db 256 dup ('?');сегмент стека.code;сегмент кодуmain proc;початок процедури main mov ax,@data;заносимо адресу сегмента даних у регістр ax mov ds,ax;інформація з ax копіюється в ds;далі текст програми mov ax,4c00h;пересилання 4c00h у регістр ax int 21h;виклик переривання з номером 21hmain endp;кінець процедури mainend main;кінець програми з крапкою входу main |
Синтаксис директиви MODEL показаний на малюнку.
Синтаксис директиви MODEL
Обов'язковим параметром директиви MODEL є модель пам'яті. Цей параметр визначає модель сегментації пам'яті для програмного модуля. Передбачається, що програмний модуль може мати тільки визначені типи сегментів, що визначаються згаданими нами раніше спрощеними директивами опису сегментів. Ці директиви приведені в табл. 3.
Таблиця 3. Спрощені директиви визначення сегмента
Формат директиви | Формат директиви | Призначення |
.CODE [ім'я] | CODESEG[ім'я] | Чи початок продовження сегмента коду |
.DATA | DATASEG | Чи початок продовження сегмента ініціалізованих даних. Також використовується для визначення даних типу near |
.CONST | CONST | Чи початок продовження сегмента постійних даних (констант) модуля |
.DATA? | UDATASEG | Чи початок продовження сегмента неініціалізованих даних. Також використовується для визначення даних типу near |
.STACK [розмір] | STACK [розмір] | Чи початок продовження сегмента стека модуля. Параметр [розмір] задає розмір стека |
.FARDATA [ім'я] | FARDATA [ім'я] | Чи початок продовження сегмента ініціалізованихданих типу far |
.FARDATA? [ім'я] | UFARDATA [ім'я] | Чи початок продовження сегмента неініціалізованих даних типу far |
Наявність у деяких директивах параметра [ім'я] говорить про те, що можливе визначення декількох сегментів цього типу. З іншого боку, наявність декількох видів сегментів даних обумовлено вимогою забезпечити сумісність з деякими компіляторами мов високого рівня, що створюють різні сегменти даних для ініціалізованихі неініціалізованих даних, а також констант.
При використанні директиви MODEL транслятор робить доступними кілька ідентифікаторів, до яких можна звертатися під час роботи програми, для того, щоб одержати інформацію про ті чи інші характеристики даної моделі пам'яті (див. табл. 5). Перелічимо ці ідентифікатори і їхні значення (табл. 4).
Таблиця 4. Ідентифікатори, створювані директивою MODEL
Ім'я ідентифікатора | Значення перемінної |
@code | Фізична адреса сегмента коду |
@data | Фізична адреса сегмента даних типу near |
@fardata | Фізична адреса сегмента даних типу far |
@fardata? | Фізична адреса сегмента неініціалізованих даних типу far |
@curseg | Фізична адреса сегмента неініціалізованих даних типу far |
@stack | Фізична адреса сегмента стека |
Якщо ви подивитеся на текст листинга 1, те побачите приклад використання одного з цих ідентифікаторів. Це @data; з його допомогою ми одержали значення фізичної адреси сегмента даних нашої програми.
Тепер можна закінчити обговорення директиви MODEL. Операнди директиви MODEL використовують для завдання моделі пам'яті, що визначає набір сегментів програми, розміри сегментів даних і коду, спосіб зв'язування сегментів і сегментних регістрів. У табл. 5 приведені деякі значення параметра модель пам'яті директиви MODEL.
Таблиця 5. Моделі пам'яті
Модель | Тип коду | Тип даних | Призначення моделі |
TINY | near | near | Код і дані об'єднані в одну групу з ім'ям DGROUP. |
SMALL | near | near | Код займає один сегмент, дані об'єднані в одну групу з ім'ям DGROUP. |
MEDIUM | far | near | Код займає кілька сегментів, по одному на кожен поєднуваний програмний модуль. |
COMPACT | near | far | Код в одному сегменті; |
LARGE | far | far | Код у декількох сегментах, по одному на кожен поєднуваний програмний модуль |
Параметр модифікатор директиви MODEL дозволяє уточнити деякі особливості використання обраної моделі пам'яті (табл. 6).
Таблиця 6. Модифікатори моделі пам'яті
Значення модифікатора | Призначення |
use16 | Сегменти обраної моделі використовуються як 16-бітні (якщо відповідною директивою зазначений процесор i80386 чи i80486) |
use32 | Сегменти обраної моделі використовуються як 32-бітні (якщо відповідною директивою зазначений процесор i80386 чи i80486) |
dos | Програма буде працювати в MS-DOS |
Необов'язкові параметри мова і модифікатор мови визначають деякі особливості виклику процедур. Необхідність у використанні цих параметрів з'являється при написанні і зв'язуванні програм на різних мовах програмування.
Описані нами стандартні і спрощені директиви сегментації не виключають один одного. Стандартні директиви використовуються, коли програміст бажає одержати повний контроль над розміщенням сегментів у пам'яті і їх комбінуванні із сегментами інших модулів.
Спрощені директиви доцільно використовувати для простих програм і програм, призначених для зв'язування з програмними модулями, написаними на мовах високого рівня. Це дозволяє компоновщику ефективно зв'язувати модулі різних мов за рахунок стандартизації зв'язків і керування.
1.4. Порядок виконання роботи.
1.4.1. За допомогою текстового редактора створити файл з ім’ям lab1.asm. Занести в цей файл текст програми яка резервує в пам’яті два байти, заносить в них цифри 1 та 5, а потім збільшує на одиницю кожен байт:
datas segment 'data'
x db 1,5
datas ends
codes segment 'code'
assume ds:datas,ss:stk,cs:codes
mov ax,datas
mov ds,ax
inc x
inc [x+1]
mov ah,4ch
mov al,00h
int 21h
codes ends
stk segment para staсk 'staсk'
db 128 dup(?)
stk ends
end
1.4.2. Виконати асемблірування програми. Для цього на диску D: відкрити каталог TASM (турбо асемблер), скопіювати свій файл в цей каталог. Спочатку створюється об’єктний модуль за допомогою команди:
tasm lab1.asm
В результаті створюється файл lab1.obj. Потім за допомогою команди
tlink lab1.obj
створюється файл типу ЕХЕ, готовий до виконання.
1.4.3. За допомогою відладчика перевіряємо роботу програми:
afd lab1.exe
Відладчик дозволяє без запуску програми на виконання перевіряти роботу програми. Після запуску відладчика з’являється вікно у верхній частині якого відображається зміст регістрів, в нижній частині зміст ОП, посередині – сама програма та командний рядок. Пересування по програмі виконується за допомогою клавіш F1 – один крок, F2 – один цикл.
Таким чином, пересуваючись по програмі, слідкуємо за змістом регістрів і пам’яті.
1.4.4. Ввести текст програми для дослідження директив спрощеної сегментації:
masm model small .data х db 1y db 7 .stack db 128 dup ('?') .code mov ax,@data mov ds,ax inc x dec y mov ax,x add ax,1 mov x,ax mov ax,4c00h int 21hend
Приведена програма резервує в пам’яті один байт під змінну х, заносить в цей байт 1, а потім збільшує змінну х на одиницю.
1.4.5. Провести асемблірування програми.
1.4.6. За допомогою відладчика прослідкувати за змінами в пам’яті ЕОМ та в регістрах мікропроцесора.
1.5. Склад звіту.
1.5.1. Тема лабораторної роботи.
1.5.2. Мета роботи.
1.5.3. Програми у відповідності до завдання.
1.5.4. Висновки.
1.6. Контрольні запитання.
1.6.1. З яких сегментів складається програма на мові асемблера?
1.6.2. Призначення сегменту даних.
1.6.3. Призначення сегменту стека.
1.6.4. Призначення сегменту коду.
1.6.5. Для чого потрібні сегментні регістри?
1.6.6. Що таке сегментна модель пам’яті?
1.6.7. Які існують директиви стандартної сегментації?
1.6.8. Яке призначення директиви SEGMENT?
1.6.9. Яке призначення директиви ASSUME?
1.6.10. Які сегментні регістри потрібно завантажувати, а які завантажуються автоматично?
1.6.11. Які бувають моделі пам’яті?
1.6.12. Перерахуйте спрощені директиви визначення сегментів.
1.6.13. В якому випадку використовують спрощені директиви сегментації?
1.6.14. Що означають типи near та far?
Дата добавления: 2015-09-29; просмотров: 40 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
Тема: Вивчення деяких органічних речовин та їх властивостей. | | | Державний вищий навчальний заклад |