Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_лабы.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.33 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-програми.