Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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



Лабораторна робота № 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. Спрощені директиви визначення сегмента

Формат директиви
(режим MASM)

Формат директиви
(режим IDEAL)

Призначення

.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.
Використовується для створення програм формату.com.

SMALL

near

near

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

MEDIUM

far

near

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

COMPACT

near

far

Код в одному сегменті;
посилання на дані — типу 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 21h

end

Приведена програма резервує в пам’яті один байт під змінну х, заносить в цей байт 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 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
Тема: Вивчення деяких органічних речовин та їх властивостей. | Державний вищий навчальний заклад

mybiblioteka.su - 2015-2024 год. (0.033 сек.)