Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум_СП

.pdf
Скачиваний:
38
Добавлен:
15.02.2015
Размер:
1.01 Mб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ПЕРВОМАЙСЬКИЙ ПОЛІТЕХНІЧНИЙ КОЛЕДЖ ПЕРВОМАЙСЬКОГО ПОЛІТЕХНІЧНОГО ІНСТИТУТУ НАЦІОНАЛЬНОГО УНІВЕРСИТЕТУ КОРАБЛЕБУДУВАННЯ ІМЕНІ АДМІРАЛА МАКАРОВА

В. І. Мартиненко, І.О. Островська

МЕТОДИЧНІ ВКАЗІВКИ

ДО ОПРАЦЮВАННЯ ПРАКТИКУМУ З ДИСЦИПЛІНИ „СИСТЕМНЕ ПРОГРАМУВАННЯ”

ДЛЯ САМОСТІЙНОЇ РОБОТИ СТУДЕНТІВ ДЕННОЇ ФОРМИ НАВЧАННЯ СПЕЦІАЛЬНОСТІ “ОБСЛУГОВУВАННЯ КОМП’ЮТЕРНИХ СИСТЕМ ТА МЕРЕЖ”

Рекомендовано методичною радою ППК ППІ НУК ім. адмірала Макарова Пр. від 24.11.2008 №4

ПЕРВОМАЙСЬК 2008

В.І. Мартиненко, І.О. Островська. Методичні вказівки щодо самостійної роботи по опрацюванню практикуму з дисципліни “Системне програмування” для студентів денної форми навчання спеціальності 5.05010201 “Обслуговування комп’ютерних систем та мереж”. – Первомайськ: ППК ППІ НУК, 2008. – 92 с.

Відділення „Обслуговування комп’ютерних систем”

Методичні вказівки відповідають програмі з системного програмування для підготовки молодших спеціалістів за спеціальністю 5.05010201 “Обслуговування комп’ютерних систем та мереж” напряму підготовки 0915 “Комп’ютерна інженерія”. Вказівки містять теоретичний матеріал у обсязі, необхідному для виконання практикуму, інструкції щодо самостійного виконання практичних робіт, контрольні питання для перевірки рівня опрацювання матеріалу, завдання для самостійної роботи та приклади виконання індивідуальних завдань.

Вказівки призначені для студентів ППК ППІ НУК імені адмірала Макарова спеціальності 5.05010201 „Обслуговування комп’ютерних систем і мереж”.

Рецензент: кандидат фізико-математичних наук, доцент О.П. Слободянюк

©В.І. Мартиненко, І.О. Островська © Первомайський політехнічний коледж Первомайського політехнічного інституту, 2008 © Видавництво ППК ППІ, 2008

2

ВСТУП

Методичні вказівки відповідають програмі з системного програмування для підготовки молодших спеціалістів за спеціальністю 5.05010201 “Обслуговування комп’ютерних систем та мереж” напряму підготовки 0915 “Комп’ютерна інженерія”. Вказівки містять теоретичний матеріал у обсязі,

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

У ході самостійного опрацювання практикуму організовується детальний розгляд студентами окремих теоретичних положень основ програмування мовою Асемблера, формуються уміння і навички виконання окремих прийомів написання, асемблювання, компіляції та виконання програм відповідно до сформованих знань.

При виконанні практичних робіт закріплюється розуміння студентами термінів, позначень, структур та процедур Асемблера; формуються навички застосування теоретичних знань до написання та реалізації програм..

Вивчення мови асемблера є невід'ємною частиною професійної комп'ютерної освіти студентів ППК ППІ НУК імені адмірала Макарова спеціальності 5.05010201 „Обслуговування комп’ютерних систем і мереж”. Assembler IBM PC, що є символічним представленням машинної мови,

нерозривно пов'язаний з архітектурою процесорів Intel 80x86, що створює можливість майбутнім спеціалістам вивчення комп'ютера на "нижньому рівні",

а саме: систему команд і формати даних, програмну модель комп'ютера і логічну організацію пам'яті, управління операціями введення-виведення і систему обробки переривань, функції базової системи введення/виведення

BIOS і операційної системи DOS.

3

Практична робота № 1

Тема: Мова асемблера. Початкові відомості.

Мета роботи: Вивчення засобів створення програм, основних директив асемблера і організації програми.

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

Програма, написана на мові Асемблера є один, а частіше декілька текстових (у ASCII кодах) файлів (Source files – початкові файли), що містять текст програми, що відповідає синтаксису мови. Початкові файли створюються за допомогою будь-якого текстового редактора, що здатний створювати "чисті" (без символів, що управляють табуляцією, форматуванням тексту і іншою інформацією) текстові файли.

Потім використовується транслятор для перетворення початкових файлів в об’єктні модулі. Як транслятори використовуються програми: TASM.EXE (Turbo Assembler) – транслятор з мови асемблера, створений фірмою Borland і MASM.EXE (Macro Assembler) – транслятор з мови асемблера, створений фірмою Microsoft. Об’єктні модулі – це файли в двійковому форматі, що містять код програми, що не повністю згенеровано, на мові процесора: у командах переходів не проставлені адреси.

Після отримання об’єктного файлу (файлів) використовується програма редактор зв’язків, для створення виконуваного файлу програми. Це є кінцевим етапом процесу розробки програми. Як редактор зв’язків використовуються:

TLINK (Turbo Linker) – редактор зв’язків фірми Borland, LINK (Linker) –

редактор зв’язків фірми Microsoft, а також відповідні програми інших фірм. Слід відмітити, що об’єктні файли створюють транслятори і з інших мов

(окрім асемблера), наприклад компілятори з мов високого рівня. При цьому в один виконуваний файл редактором зв’язків можуть бути об’єднані об’єктні модулі, які згенеровані різними програмами, що відповідає модульному принципу розробки програм.

Для отримання інформації по використанню вказаних програм слід звернутися до документації.

Початкові файли програми на мові асемблера складаються з директив і власне команд. Відмінність команд від директив полягає в тому, що команди асемблюютсься в команди процесора, а директиви – ні. Основними директивами мови асемблера є:

-Директиви управління сегментами;

-Директиви визначення даних;

-Директиви визначення імен;

-Директиви визначення процедур;

-Директиви визначення зовнішніх посилань;

-Директива кінця програми.

4

Всі директиви асемблера мають наступний формат:

[<ім’я>] <назва директиви> [<операнди>] [;<коментар>]

Директиви управління сегментами

name SEGMENT [datatype] [combinetype] ['class'] ; початок сегменту

. Оператори сегменту

name ENDS ; кінець сегменту

datatype - визначає тип вирівнювання, тобто визначає межу, на якій повинен бути розміщений логічний сегмент:

-BYTE – з будь-якої адреси;

-WORD – з будь-якої парної адреси (границя слова);

-PARA – з будь-якої адреси, парної 16 (межа параграфа);

-PAGE – з будь-якої адреси, парної 256 (межа сторінки); За умовчанням приймається тип вирівнювання PARA. combinetype – визначає тип об’єднання сегменту:

-PUBLIC – сегменти з однаковими іменами об’єднуються шляхом конкатенації, тобто займають суміжні області пам’яті;

-COMMON – всі сегменти з однаковими іменами накладаються один на одного і починаються з однієї адреси пам’яті;

-STACK – сегменти з однаковими іменами перекриваються, але так, що всі вони закінчуються за одною і тою ж адресою пам’яті;

-AT exp – сегмент починається з адреси, що дорівнює exp * 16.

class – визначає ім’я класу, керуючись яким редактор зв'язків розміщує сегменти у фізичній пам'яті:

-CODE – область коду програми;

-CONST – область констант;

-DATA – область даних;

-STACK – область стека;

Крім того можна використовувати свої імена для групування необхідних ділянок пам’яті.

name GROUP seg1, seg2 ...

Ця директива дозволяє об’єднати логічні сегменти з іменами seg1, seg2

... у один фізичний сегмент із загальною базовою адресою.

ASSUME sr:seg, sr:seg ...

Директива ASSUME указує Асемблеру, до якого сегменту seg відноситься сегментний регістр sr. Ця інформація використовується для правильної адресації звернень до пам’яті.

ASSUME NOTHING дозволяє відмінити призначення всіх сегментних регістрів, директива

ASSUME NOTHING sr, sr ... дозволяє відмінити призначення конкретних сегментних регістрів sr (CS, DS, SS або ES).

Директива ORG дозволяє примусово встановити лічильник команд на необхідну адресу, що задається виразом expr, значення якого обчислюється по модулю 64K.

ORG expr

5

Директиви визначення даних

Дані представляються константами та змінними. Константи бувають числові та текстові (літерали, стринги, ланцюжок – послідовність символів узята в лапки, наприклад "Повторіть введення>"). З кожною змінною в програмі зв’язано три атрибути: тип (TYPE), довжина (LENGTH) і розмір

(SIZE).

Для визначення змінних використовуються наступні директиви:

<name> DB <operand> [,<operand>] ; для типу BYTE

(LENGTH = 1)

<name> DW <operand>[,<operand>]; для типу WORD

(LENGTH = 2)

<name>DD <operand> [,<operand>] ; для типу DWORD (LENGTH = 3) <name>DQ <operand> [,<operand>] ; для типу QWORD (LENGTH = 4) <name>DT <operand> [,<operand>] ; для типу TWORD (LENGTH = 5)

де name – ім’я змінної або масиву, його атрибут розміру залежить від кількості і розміру операндів, operand – операнд: чисельна або текстова константа,

символ "?", конструкція типу const DUP (<operand> [<operand>]), де const

коефіцієнт повторення.

Директиви визначення імен

name EQU text ; ім’я name отримує текстове значення text name EQU exp; ім’я name отримує значення виразу exp

name = exp; ім’я name отримує значення виразу exp, при цьому значення name можна перевизначати, на відміну від EQU.

name LABEL type; визначає ім’я змінної з вказаним типом (BYTE, WORD, DWORD) або мітку з відповідним атрибутом (NEAR або FAR)

Директиви визначення процедури

name PROC [type] ; заголовок процедури

. Текст процедури

RET ; повернення з процедури name ENDP ; кінець процедури

де type – атрибут виклику: NEAR (ближній) – тільки з даного сегменту; FAR (дальній) – може викликатися з інших сегментів. За умовчанням приймається

NEAR.

Директиви визначення зовнішніх посилань

Ці директиви використовуються при розробці багатомодульної програми для визначення зв’язків між модулями.

PUBLIC name1, name2...

Уполі операндів директиви PUBLIC перераховуються імена змінних і мітки, які визначені в даному модулі, але використовуватимуться і в інших модулях.

EXTRN name1: type, name2: type ...

Уполі операндів директиви EXTRN перераховуються імена змінних і мітки, які використовуються в даному модулі, але визначені в інших модулях.

6

Для змінних указується їх атрибут типу (BYTE, WORD, DWORD, QWORD, TBYTE), а для міток – їх атрибут відстані (NEAR або FAR)

INCLUDE file

Дана директива дозволяє включати вміст вказаного файлу file в текст початкової програми.

Директива кінця програми

END [label]

Є останнім оператором програми, ім’я label визначає точку передачі управління після завантаження програми (тільки для програм в EXE-форматі).

Мова асемблера застосовується для написання програм і драйверів пристроїв під різні операційні системи. Тому виконувані файли відрізняються по формату. Для системи MS-DOS основними типами програм є програми типу COM і EXE. Для прикладу приведемо дві прості програми в цих форматах.

COM-програма:

;hello-l.asm

;Виводить на екран повідомлення "Hello My Firend!" і завершується

.model tiny

;модель пам’яті, використовувана для СОМ

.code

;початок сегменту коду

org 100h

;початкове значення лічильника – 100h

start: mov ah,9

;номер функції DOS – в АН

mov dx,offset message

;адреса рядка – в DX

int 21h

;виклик системної функції DOS

ret

;завершення СОМ-програми

message db "Hello My Firend!",0Dh,0Ah,'$' ;рядок для виведення end start ;кінець програми

EXE-програма:

;hello-2.asm

;Виводить на екран повідомлення "Hello My Firend!" і завершується

.model small

;модель пам’яті, використовувана для ЕХЕ

.stack 100h

;сегмент стеку розміром у 256 байтів

.code

 

start: mov ax,DGROUP;сегментна адреса рядка message

mov ds,ax

;поміщується у DS

mov dx,offset message

mov ah,9

;функція DOS "виведення"

int 21h

mov ax,4C00h

;функція DOS "завершує програму"

int 21h

data

message db "Hello My Firend!",0Dh,0Ah,'$' end start

7

Інструкція по створенню виконуваного файлу типу СОМ та ЕХЕ:

1.Створіть текстовий документ, що містить початковий модуль програми, за допомогою текстового редактора Блокнот або RullNote.

2.Збережіть створений текстовий файл у каталозі C:\tasm\bin під ім’ям hello-1.asm.

3.Виконайте команду «Пуск\Программы\Стандартные\Командная

строка».

4.Перейдіть у директорію C:\tasm\bin за допомогою команди cd C:\tasm\bin.

5.Для перетворення програми на виконуваний файл, спочатку викличте асемблер та скомпілюйте його в об’єктний файл. Для цього введіть

C:\tasm\bin\tasm hello-1.asm.

a. Для COM програми введіть tlink /x /t hello-1.obj та натисніть Enter. b. Для EXE програми введіть tlink /x hello-2.obj та натисніть Enter.

6.Зараз потрібно запустити програму на виконання. Для цього введіть hello-1.com, і на екрані повинен з’явитися напис «Hello My Firend!».

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

1.З використанням текстового редактора створити початковий файл програми на мові асемблера для розглянутих вище програм (com і exe).

2.Отримати об'єктний файл програми.

3.Створити виконувану програму.

4.Запустити на виконання.

Контрольні питання

1.Відтворіть послідовність створення програм на мові асемблера.

2.У чому відмінність директив асемблера від команд.

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

4.Поясніть призначення операндів директиви SEGMENT.

5.Поясніть призначення директиви ASSUME.

6.Охарактеризуйте типи даних, що використовуються в мові асемблера.

7.Охарактеризуйте директиви визначення даних, їх формат і призначення.

8

Практична робота № 2

Тема: Режими адресації даних. Програма Debug.

Мета роботи: Вивчення способів адресації оброблюваних в програмі даних.

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

Режими адресації визначають способи доступу до даних в програмі на мові Асемблера. У командах асемблерної програми режими адресації задаються різними комбінаціями регістрів, символічних імен і виразів в записі операндів, якими ідентифікується в командах оброблювані дані і точки передачі управління (переходів).

Операнд, що обробляється командою, може знаходитися в одному з робочих регістрів мікропроцесора або в пам’яті, при цьому залежно від структури команди в ній може міститися один або два операнди. Якщо команда містить один операнд, то він може знаходитися в регістрі або в пам’яті. У разі, коли команда містить два операнди, то допускаються будь-які комбінації їх місцеположення (регістр або пам’ять, за винятком випадку, що обидва операнди розташовані в пам’яті, тобто хоча би один з двох операндів повинен бути в регістрі. Операнд, що знаходиться в регістрі, задається ім’ям цього регістра. Що стосується операнда, розташованого в пам’яті, то його місцеположення може задаватися різними способами, які включають комбінації наступних чотирьох елементів:

IMED (безпосереднє значення), задається символічним ім’ям або константою, виражається одноабо двобайтовим числом із знаком;

INDEX (індексний регістр), задається ім’ям одного з індексних регістрів SІ або DІ;

BASE (базовий регістр), задається ім’ям одного з базових регістрів BX або BP;

DISP (зсув), задається символічним ім’ям або константою, виражається одноабо двобайтовим числом із знаком;

Під час асемблювання команди аналізується мнемонічний запис операнда в кожній команді з тим, щоб визначити, яким способом задана його адресація. В результаті цього аналізу формуються відповідні поля формату команди, які при її виконанні забезпечать правильний доступ до операнда. Необхідно пам’ятати про те, що для операндів, розташованих в пам’яті, під час виконання команди з адресного посилання, що міститься в команді, формується так звана виконувана адреса (ЕА), що є зсувом в сегменті, який складається з адресою сегменту для отримання абсолютної (фізичної) адреси в пам’яті.

Регістрова адресація

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

9

ХОR

АН, АН

;Очистити старший байт регістра

AX

INC

DX

;Збільшити вміст регістра DХ на

1

Безпосередня адресація IMED

В даному випадку операнд є частиною самої команди і, отже, не вимагає звернення до пам’яті під час виконання команди, оскільки він міститься вже в черзі команд. Такий спосіб завдання операнда дуже зручний для визначення початкових значень і констант.

Tab EQU

9

;Визначити константу символьним ім’ям

СМР AL,

Tab

;Порівняти

вміст регістра AL з значенням

константи 9

 

;Помістити у регістр DL ASCII-код букви D

MOV DL, ‘D’

ADD ВХ, 2000

;Додати до вмісту ВХ константу 2000

MOV

DX,OFFSET MSG_ERR

;Завантажити в регістр DX адресу

;області пам’яті з ім’ям MSG_ERR

 

TEST

AL,OFOH ;Перевірити старший півбайт регістру AL

Пряма адресація (BA = DISP)

Цей спосіб є найбільш природним, оскільки операнд указується символьним ім’ям, при обробці якого в команду поміщається адресний зсув позначеного даним символьним ім’ям елементу пам’яті. За умовчанням операнд передбачається в сегменті даних (DS), проте за допомогою префікса зміни сегменту можна вказати будь-який інший сегмент (CS, SS, ES). Даний режим адресації використовується для доступу до окремих байтів або слів в пам’яті.

MOV CХ,Count ;Завантажити в регістр CX вміст осередку ;пам’яті, позначеної в сегменті даних ім’ям Count

MOV AL,C3:Nxt_Byte ;Завантажити в регістр АХ вміст елементу ;пам’яті, позначеного в сегменті кодів символьним ім’ям Nxt_Byte

Непряма адресація (ЕА = BASE або INDEX)

При цьому режимі адресації виконувана адреса ЕА визначається вмістом вказаного в команді регістра BX, SI або DI. (Увага: базовий регістр BP не допускається!). Даний режим адресації ефективний для обробки послідовностей з байтів або слів в пам’яті, при цьому вміст регістра (BX, SI або DI), змінюючись в програмі, визначає адресу поточного елементу послідовності. За умовчанням операнд розміщується в сегменті даних (DS), проте за допомогою префікса заміни сегменту можна вказати будь-який інший сегмент (CS, SS, ES).

DEC

BYTE PTR [BX]

;Декрементувати байт, зсув якого в

;поточному сегменті даних задано вмістом регістру ВХ

MOV

DX,SS:[S1]

;Привласнити регістру DX слово, на

;яке в поточному сегменті стека вказує S1

CMP WORD PTR ES: [DI],0

;Перевірити на нуль вміст слова, на

;яке в поточному додатковому сегменті вказує регістр DI

10