Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод вказів лаборат роб Опер сист.doc
Скачиваний:
11
Добавлен:
08.02.2016
Размер:
1.41 Mб
Скачать

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

Для виконання усіх лаборараторних робіт пропонується єдиний порядок, що передбачає наступні кроки.

1. Ознайомитися з постановкою задачі і вихідних даних. Визначити варіант індивідуального завдання.

2. Сконструювати структуру програми.

3. Скласти і набрати текст програми і затвердити його у викладача.

4. Пункти 1 - 3 повинні бути виконані попередньо, до проведення даної лабораторної роботи.

5. Виконати компіляцію програми.

6. Провести аналіз і виправлення виявлених синтаксичних помилок у тексті програми і повторити пункти 5 і 6. При усуненні всіх синтаксичних помилок перейти до виконання пункту 7.

7. Одержати рішення (зображення) і, у випадку виявлення логічних помилок, визначити й усунути їх. Продемонструвати викладачу остаточний варіант програми і її роботу.

Зміст звіту

Звіт оформляється по кожній лаборараторній роботі і складається з наступних розділів.

  • Номер та тема лаборараторної роботи;

  • Автор (ф.і.п. студента, факультет, спеціальність, група);

  • Мета роботи;

  • Індивідуальне завдання;

  • Опис структур даних і алгоритмів;

  • Текст програми;

  • Результати роботи програми (вихідні дані та результати у вигляді копій екрану).

  • Інтерпретація результатів.

  1. Лабораторні роботи на мові Асемблер

    1. Лабораторна робота n 1_1 Перша програма на Асемблері

Мета роботи: ознайомитися з основними вимогами до програм мовою Асемблера.

Короткі теоретичні відомості

Першим етапом створення програми є написання текстового файлу на мові Асемблер. Цей файл створюється будь-яким текстовим редактором.

Надалі цей текстовий файл буде оброблений спеціальною програмою- транслятором для перетворення в машинний код.

У цій і наступних лабораторних роботах наведені правила написання програм мовою Асемблера фірми Mіcrosoft - MASM.

Програма, написана мовою Асемблера, складається з рядків. Максимальна довжина рядка - 132 символу. Реально використовується 80 (ширина екрана). Рядки відокремлюються друг від друга символом повернення каретки (Enter).

Основний формат рядка.

[мітка] команда [операнд][,операнд] [;коментарий]

Мітка (якщо є), команда і перший операнд розділяються принаймні одним пробілом чи символом табуляції.

МІТКА - це мнемонічне ім'я, що позначає даний рядок для наступного звертання. Мітка може містити до 31 символу. Припустимі символи:

букви: від A до Z і від a до z;

цифри: від 0 до 9;

спеціальні символи: знак питання (?),

крапка (.) - тільки перший символ,

амперсенд (@),

підкреслення (_),

долар ($).

Першим символом у мітці повинна бути буква чи спеціальний символ. Асемблер не робить розходження між заголовними і малими літерами.

Імена регістрів зарезервовані. Їх допускається використовувати тільки для позначення регістрів.

КОМАНДА (оператор) позначає дію, що повинний зробити чи процесор транслятор з мови Асемблер. Як команди можуть використовуватися команди процесора (власне команди) і директиви (псевдокоманди) Асемблеру.

ОПЕРАНД визначає елемент, над яким робить дія команда.

Команда може мати один чи два операнда чи не мати їх зовсім.

RET - команда без операнда;

ІNC CX - команда з одним операндом;

ADD AX,12 - команда з двома операндами.

Якщо команда має два операнда, вони розділяються коми (,). При використанні двох операндов першим вказується операнд-приемник, другим - операнд-источник. Тобто результат операції заноситься в перший операнд.

Приклади операндов

MOV AX,BX ;перслать уміст BX у AX

MOW AX,WORDA ;переслати вміст комірки пам'яті під ім'ям WORDA у AX

MOV AX,[BX] ;перслать уміст пам'яті за адресою зазначеному в BX у AX

MOV AX,25 ;перслать число 25 у регістр AX

MOV AX,[25] ;переслати вміст комірки пам'яті зі зсувом 25 у AX

КОМЕНТАРИЙ починається з крапки з коми (;). Може займати весь чи рядок випливати за командою в тім же рядку.

Коментарий з'являється тільки в листингах і не приводять до генерації машинних кодів. У коментарии допускаються будь-які символи основної клавіатури.

ДИРЕКТИВИ (чи псевдокоманди).

Це ряд операторів, що дозволяють керувати процесом трансляції і формування листинга. Вони діють тольков процесі трансляції і не генерують машинних кодів.

Директива SEGMENT. Використовується для опису використовуваних у програмі сегментів. Будь-яка програма містить принаймні один сегмент - сегмент коду. Може бути присутнім також сегмент стека і сегмент даних, а також додатковий сегмент. Формат директиви:

Ім'я Директива Операнд

ім'я SEGMENT [парметры]

. .

.

ім'я ENDS

Ім'я сегмента повинне обов'язково бути присутнім, бути унікальним і відповідати угодам для імен в Асемблере. Директива ENDS означає кінець сегмента. Обидві директиви SEGMENT і ENDS повинні мати однакові імена. Директива SEGMENT може містити три типи параметрів: вирівнювання, об'єднання і клас.

Вирівнювання. Даний параметр визначає границю початку сегмента. Звичайним значенням є PARA, по якому сегмент установлюється на границю параграфа. У випадку відсутності цього опреанда за замовчуванням приймається PARA.

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

Можливі наступні типи об'єднань: STACK, COMMON, PUBLІС, AT-вираження і MEMORY.

Якщо програма не повинна поєднуватися з іншими програмами, то указівка цих типів може бути опущена.

Клас. Даний елемент, укладений в апострофи, використовується для групування сегментів при компонуванні.

Сегмент стека визначається в такий спосіб:

ім'я SEGMENT PARA STACK 'Stack'

DB 30 DUP(?)

ім'я ENDS

Директива PROC. Сегмент коду містить виконувані команди програми. Він може містити в собі одну чи кілька процедур, які починаються директивою PROC. Сегмент, що містить тільки одну процедуру має вид:

ім'я -сегмента SEGMENT PARA

ім'я -процедури PROC FAR Сегмент коду з однією процедурою

.

.

RET

ім'я процедури ENDP

ім'я сегмента ENDS

Ім'я процедури повинне обов'язково бути присутнім, бути унікальним і відповідати угодам по іменах в Асемблері. Опертор FAR указує завантажувачу DOS, що початок даної процедури є крапкою входу для виконання програми. Сегмент може мати кілька процедур. Кожна процедура повинна закінчуватися директивою RET.

Директива ASSUME. Процесор використовує регістр SS для адресації стека, регістр DS - для адресації сегмента даних і регістр CS - для адресації сегмента коду. Асемблеру необхідно повідомити призначення кожного сегмента.

Директива Операнд

ASSUME SS: ім'я _стека,DS: ім'я _даних,CS: ім'я_код

де ім'я _стека, ім'я_даних, ім'я _код - імена відповідно сегментів стека, даних і коду, привласнені їм директивою SEGMENT.

Операнды можуть записуватися в будь-якій послідовності. Регістр ES також може бути присутнім серед операндов. Якщо програма не використовує регістр ES, то його можна чи опустити вказати ES:NOTHІNG.

Директива END. Цілком завершує всю програму.

Директива Операнд

END [ім'я процедури]

ІНІЦІАЛІЗАЦІЯ ПРОГРАМИ.

Система DOS має чотири вимоги для ініціалізації асемблерної EXE-програми.

1. Необхідно вказати Асемблеру, які сегментні регістри відповідають сегментам (здійснюється директивою ASSUME).

2. Потрібно зберегти в стеку адресу, що знаходиться в регістрі DS, коли програма починає виконання.

Завантажувальному модулю в оперативній пам'яті безпосередньо передує 256-байтовая (100Н) область, яка називається префіксом програмного сегмента (PSP). Програма завантажника використовує регістр DS для установки адреси початкової крапки PSP.

Користувальницька програма повинна зберегти цю адресу, помістивши їїв стек. Пізніше команда RET візьме цю адресу зі стека для повернення в DOS.

3. Необхідно записати в стек нульову адресу.

4. Необхідно завантажити в DS адресу сегмента даних.

Завантажувач DOS встановлює правильні адреси стека в регістрі SS і сегмента кодів у регістрі CS. Оскільки програма з авантажувача використовує регістр DS для інших цілей, необхідно ініціалізувати регістр DS.

Вихід із програми і повернення в DOS зводиться до використання команди RET.

Команда RET забезпечує вихід з користувальницької програми і повернення в OS, використовуючи для цю адресу, записана в стек на початку програми з регістра DS. Іншим часто використовуваним способом завершення програми є команда ІNT 20H.

Приклад програми.

SEGST SEGMENT PARA STACK 'Stack'

DB 30 DUP(?)

SEGST ENDS

;

SEGDT SEGMENT PARA 'DATA'

DB 12 DUP(?)

SEGDT ENDS

;

SEGCOD SEGMENT PARA 'CODE'

ASSUME CS:SEGCOD,SS:SEGST,DS:SEGDT

BEGІ PROC FAR

PUSH DS ;зберегти вміст DS у стеці

SUB AX,AX ;обнулить регістр AX

PUSH AX ;занести вміст AX у стек

MOV AX,SEGDT ;занести адресу початку сегмента даних у регістр AX

MOV DS,AX ;занести вміст AX у регістр DS

SUB BX,BX ;обнулить регістр BX-

ADD BX,10 ;додати до вмісту BX 10

MOV CX,20 ;занести в CX 20

ADD BX,CX ;додати CX до BX

SUB BX,CX ;відняти CX з BX

RET

BEGІ ENDP

SEGCOD ENDS

END BEGІ

ПІДГОТОВКА ДО РОБОТИ

1. Вивчити короткі теоретичні відомості і рекомендовану літературу.

2. Підготувати програму у відповідності із своїм варіантом.

РОБОЧЕ ЗАВДАННЯ

Набити текст підготовленої програми, використовуючи будь-який текстовий редактор, наприклад, редактор Norton Commander.

ВИМОГА ДО ЗВІТУ

У звіті зафіксувати текст файлу з підготовленою програмою.

КОНТРОЛЬНІ ПИТАННЯ

1. Приведіть формат рядка мови Асемблер.

2. Що буде знаходитися в регістрах AX і BX після виконання наступних команд:

MOV AX, 20

MOV BX, 10

ADD AX, BX

3. Перелічіть вимоги для ініціалізації EXE-програми.