Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



Методичні вказівки до лабораторних робіт з дисципліни " Архітектура комп ’ ютера " для студентів напряму 050103

Скачати 470.53 Kb.

Методичні вказівки до лабораторних робіт з дисципліни " Архітектура комп ’ ютера " для студентів напряму 050103




Скачати 470.53 Kb.
Сторінка1/4
Дата конвертації30.03.2019
Розмір470.53 Kb.
ТипМетодичні вказівки
  1   2   3   4

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Запорізький національний технічний університет



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

до лабораторних робіт з дисципліни

Архітектура компютера

для студентів напряму 6.050103

“Програмна інженерія”

денної форми навчання




2011


Методичні вказівки до лабораторних робіт з дисципліни “Архітектура комп’ютера” для студентів напряму 6.050103 “Програмна інженерія” денної форми навчання /Уклад.: Рисіков В.П., Степаненко О.О., Качан О.І. – Запоріжжя: ЗНТУ, 2011. – 51 с.

Укладачі: В.П. Рисіков, доцент, к.т.н.,

О.О. Степаненко, доцент, к.т.н.,

О.І. Качан, асистент

Рецензент: С.К. Корнієнко, доцент, к.т.н.
Відповідальний

за випуск: А.В. Притула, доцент, к.т.н.

Затверджено

на засіданні кафедри

"Програмні засоби"
Протокол № 1 від 29.08.2011 р.


ЗМІСТ





МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ 1

Запорізький національний технічний університет 1

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

до лабораторних робіт з дисципліни 1

Архітектура комп’ютера ” 1



для студентів напряму 6.050103 1

Програмна інженерія” 1



денної форми навчання 1

2011 2

ЗМІСТ 4

ЗАГАЛЬНІ ВІДОМОСТІ ПРО ТУРБО АСЕМБЛЕР 6

ЛАБОРАТОРНА РОБОТА № 1 8

Вивчення відлагоджувача DEBUG 8

ЛАБОРАТОРНА РОБОТА № 2 9

Вивчення режимів адресації і8086 та команд пересилання даних 9

ЛАБОРАТОРНА РОБОТА № 3 19

Арифметичні операції мікропроцесора і8086 19

ЛАБОРАТОРНА РОБОТА № 4 40

Рядкові команди МП і8086 40

ЛАБОРАТОРНА РОБОТА № 5 48

Робота з клавіатурою та дисплеєм через BIOS 48

РЕКОМЕНДОВАНА ЛІТЕРАТУРА 53

Основна 53

Додаткова 53

Додаток А 54

Завдання на лабораторну роботу №3 54

Турбо – Асемблер є могутнім асемблером, працюючим із командним рядком, який сприймає ваші початкові данні (файли із розширенням .ASM) та робить з них об’єктні модулі (файли із розширенням .OBJ). Після цього ви маєте можливість використовувати програму - компоновщик фірми Borland TLINK.EXE, яка відрізняється високою швидкістю компоновки, для компоновки отриманих об’єктних модулів та створення виконуємих файлів. (файлів з розширенням .EXE та .СОМ)



ЗАГАЛЬНІ ВІДОМОСТІ ПРО ТУРБО АСЕМБЛЕР


Турбо – Асемблер створений для роботи з процесорами серії 80х86 та 80х87 (детальніше набір інструкцій процесорів серії 80х86/80х87 описаний у інструкціях фірми Intel). У Турбо Асемблері є дуже могутній та гнучкий синтаксис командного рядка. Якщо ви запустите Турбо Асемблер, не задаючи ніяких параметрів, наприклад
TASM,
то на екран виведеться довідкова інформація, (англійською мовою), яка описує множину параметрів командного рядка та синтаксис для специфікації файлів які асемблюються.
TASM [параметри] вик_файл [,об’єкт_файл] [,лістинг] [пер_посилки]
/a,/s Упорядкування елементів по алфавітному порядку чи порядку початкового коду

/c Генерація у лістингу перехресних посилань

/dSYM[=VAL] Визначається SYM=0 чи SYM=VAL

/e/r Емулюємі чи дійсні інструкції з плаваючою точкою

/h/? Виводиться дана довідкова інформація

/lPATH Файли, які включаються, шукаються по маршруту визначеному PATH

/jCMD Визначає початкову директиву Асемблеру (наприклад IDEAL)

/kr#,/ks# Місткість хеш-таблиці #, місткість об’єму рядка #

/l/la Генерація лістингу: l-звичайний, la-розширений

/ml/mx/mu Розрізнимость у регістрі букв ідентифікаторів: ml=усі, mx=глобальні, mu=не розрізняються

/mv# Задає максимальну довжину ідентифікаторів.

/m# Дозволяє виконання декількох проходів для дозволення випереджаючих посилань

/h Вилучення у лістингах таблиці символів (ідентифікаторів)

/p Перевірка перекриття сегменту коду у захищеному режимі

/q Вилучення записів .OBJ не потрібних при компоновці

/t Вилучення повідомлень при успішному асемблюванні

/w0,/w1,/w2 Завдання рівня попередження w0=нема попереджень, w1=w2=є попередження

/w-xxx, /w+xxx Заборона чи дозвіл попередження типу ххх

/x Включення у листинги блоків умовного асемблювання

/zi, /zd Інформація про ідентифікатори для відлагодження: zi=повна, zd=тільки про номери рядків



ЛАБОРАТОРНА РОБОТА № 1

Вивчення відлагоджувача DEBUG



МЕТА РОБОТИ: Навчитися відлагоджувати програми за допомогою відлагоджувача DEBUG.

ТЕОРІЯ

Ключі до відлагоджувача DEBUG:


допомога ?

ввід команд асемблера A[адреса ]

порівняти C діапазон адрес

отримати байт пам’яті D[діапазон ]

редагувати чарунки пам’яті E адреса [список байт ]

виконати зі вказаної адреси G[=адреса][адреса]

скопіювати М діапазон адрес

вихід Q


зміст регістрів R[регістр]

пошук S


трасування T[=адреса][число повторювань]

дізасемблер U [ діапазон адрес]


ЗАВДАННЯ


Самостійно вивчити відлагоджувач Debug.

Практично продемонструвати роботу з відлагоджувачем DEBUG викладачу.



ЛАБОРАТОРНА РОБОТА № 2

Вивчення режимів адресації і8086 та команд пересилання даних



МЕТА РОБОТИ: Вивчити режими адресації МП і 8086 та команди пересилання даних, а також навчитися застосовувати отримані знання при написанні програм на мові асемблер.

ТЕОРІЯ

Директива SEGMENT


Директива SEGMENT визначає початок сегменту. Мітка, яка вказується у даній директиві, визначає початок сегменту. Наприклад, директива:

Cseg SEGMENT


Визначає початок сегменту з ім’ям Cseg. Директива SEGMENT може також (необов’язково) визначати атрибути сегмента, включаючи вирівнювання у пам’яті на кордон байта, слова, подвійного слова, параграфа (16 байт) чи сторінки (256 байт). Інші атрибути включають в себе спосіб, за допомогою якого сегмент буде комбінуватися з іншими сегментами з тим же ім’ям та класом сегмента.

Директива ENDS


Директива ENDS визначає кінець сегменту. Наприклад:
Cseg ENDS
завершує сегмент з ім’ям Cseg, який починався по директиві SEGMENT. При використанні стандартних директив визначення сегментів, ви повинні явним чином завершити кожний сегмент.

Директива ASSUME


Директива ASSUME вказує Турбо Асемблеру, у значення якого сегменту встановлений даний сегментний регістр. Директиву ASSUME CS: потрібно указати у кожній програмі, в якої використовуються стандартні сегментні директиви, бо Турбо Асемблеру необхідно знати про сегмент коду для того, щоб встановити програму яка виконується. Крім того, звичайно використовуються директиви ASSUME DS: та ASSUME ES:, завдяки яким Турбо Асемблер знає до яких чарунок пам’яті ви можете адресуватись у даний момент. Директива ASSUME дозволяє Турбо Асемблеру перевірити допустимість кожного звернення до іменованої чарунки пам’яті з урахуванням значення поточного сегментного регістру. Роздивимось наступний приклад:
Data1 SEGMENT WORD ‘DATA’

Var1 DW 0

Data1 ENDS

Data2 SEGMENT WORD ‘DATA’

var2 DW 0

Data2 ENDS

Code SEGMENT WORD ‘CODE’

ASSUME CS:CODE

Program Start:

mov ax,Data1

mov ds,ax ; установити DS у Data1

ASSUME DS:Data1

mov ax,[Var2]

; спроба завантажити Var2 у AX

; це призведе до помилки, бо

; Var2 недоступна у сегменті

; Data1
Турбо Асемблер відзначає у цій програмі помилку, бо у ній робиться спроба отримати доступ до змінної пам’яті Var2, коли регістр DS встановлений у значення сегменту Data1 (до Var2 неможливо адресуватись, допоки DS не буде встановлений у значення сегмента Data2).

Виділення даних


Тепер, коли відомо, як створювати сегменти, роздивимось, як можна заповнювати ці сегменти усвідомленими даними. Сегмент стеку проблему не являє: там знаходиться стек, а до стеку ви можете звертатися за допомогою інструкцій PUSH та POP та адресуватися через регістр ВР. Сегмент коду заповнюється інструкціями які генеруються згідно з мнемонікою інструкцій вашої програми, тому проблеми тут також немає. Залишається сегмент даних. У Турбо Асемблері передбачена множина способів визначення змінних у сегменті даних, як ініціалізуємих деяким значенням, так і неініціалізованих. Щоб зрозуміти які данні дозволяє вам визначити Турбо Асемблер, ми повинні спочатку трохи розповісти вам про головні типи даних Асемблеру.

Ініціалізовані дані


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

Директиви визначення даних DB, DW, DD, DF, DP, DQ та DT дозволяють нам визначити змінні у пам’яті різного розміру:


DB 1 байт

DW 2 байта=1 слово

DD 4 байта=1 подвійне слово

DF, DP 6 байт=1 показник дальнього типу (386)

DQ 8 байт=одне четвертне слово

DT 10 байт


Наприклад
ByteVar DB ‘Z’ ; 1 байт

WordVar DW 101b ; 2 байта (1 слово)

DwordVar DD 2BFh ; 4 байта (1 подвійне слово)

QwordVar DQ 307o ;8 байт (одне четвертне слово)

TwordVar DT 100 ; 10 байт

Ініціалізація масивів


В одній директиві визначення даних може вказуватися декілька значень. Наприклад директива:
SampleArray DW 0, 1, 2, 3, 4

DD 25, 36, 49, 64, 81

DD 100, 121, 144, 169, 196
створює масив з ім’ям SampleArray, елементи якого мають розмір в слово. В директивах визначення даних можна використовувати будь-яке число значень.

Турбо Асемблер дозволяє вам визначити блок пам’яті, ініціалізованої вказаним значенням, за допомогою операції DUP. Наприклад:


BlankArray DW 100h DUP (0)
Тут створюється масив BlankArray, який складається з 255 (десят.) слів, ініціалізованих значенням 0. Аналогічно директива:
ArrayofA DB 92 DUP (‘A’)
створює масив з 92 байт, кожний з яких ініціалізований символом А.

Ініціалізація рядків символів


Роздивимось тепер створення рядків символів. Символи являють собою допустимі операнди директив визначення даних, тому рядок символів можна визначити наступним чином:
String DB ‘A’, ‘B’, ‘C’, ‘D’
В Турбо Асемблері в цьому випадку передбачена також зручна скорочена форма:
String DB ‘ABCD”

Режими адресації пам’яті


Як при використанні операнда у пам’яті задати ту чарунку пам’яті з якою ви бажаєте працювати? Очевидна відповідь полягає в тому, щоб привласнити потрібній змінній у пам’яті ім’я, як ми це робили у останньому розділі. За допомогою, наприклад, наступних операторів ви можете вирахувати змінну пам’яті Debts (борги) зі змінної пам’яті Assets (майно):
Assets DW ?

Debts DW ?

. .

mov ax,[Debts]



sub [Assets],ax
В дійсності мова Асемблера забезпечує декілька різних способів адресації до рядків символів, масивів та буферів даних.

Найбільш простіший спосіб полягає в тому, щоб зчитати дев’ятий по рахунку символ строки CharString:


CharString DB ‘ABCDEFGHIJKLM’

.

.



mov ax,@Data

mov ds,ax

mov al,[CharString+8]
В даному випадку це теж саме, що:
mov al,[100+8]
так як CharString починається зі зміщенням 100. Все, що замкнено у квадратні дужки, інтерпретується Турбо Асемблером, як адреса, тому зміщення Charstring та 8 складаються та використовується в якості адреси пам’яті. Інструкція приймає вигляд:
mov al,[108]

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

Розглянемо наступний фрагмент програми, де у регістр AL також завантажується дев’ятий символ CharString:
mov bx, OFFSET CharString+8

mov al,[bx]


У даному прикладі для посилання на дев’ятий символ використовується регістр bx. Перша інструкція завантажує у регістр bx зміщення CharString (згадайте про те, що операція OFFSET повертає зміщення мітки у пам’яті), плюс 8. (Обчислення OFFSET та складання для цього виразу виконується Турбо Асемблером підчас асемблювання.) Друга інструкція визначає, що AL потрібно скласти зі змістом по зміщенню в пам’яті, на яке вказує регістр BX
mov AL,[108]
Квадратні дужки вказують, що в якості операнда – джерела повинна бути використовуватися чарунка, на яку вказує регістр BX, а не сам регістр BX. Не забувайте вказувати квадратні дужки при використанні BX в якості показника пам’яті. Наприклад:
mov ax,[bx] ; завантажити AX з чарунки пам’яті,

; на яку вказує BX

та

mov ax,bx ; завантажити у AX зміст



; регістра BX
це дві цілком різні інструкції.

BX – це не єдиний регістр, котрий можна використовувати для посилання на пам’ять. Допускається також використовувати разом з необов’язковим значенням-константою або міткою регістри BP, SI та DI. Загальний вигляд операндів у пам’яті виглядає наступним чином:

[базовий регістр + індексний регістр + зміщення],
де базовий регістр – це BX, індексний регістр – це SI чи DI, а зміщення – будь-яка 16-бітова константа, включно мітки та вирази. Кожний раз, коли виконується інструкція, яка використовує операнд в пам’яті, процесором 8086 ці три компоненти складаються. Кожна з трьох частин операнда у пам’яті є необов’язковою, хоча (це очевидно) ви повинні використовувати один з трьох елементів, інакше ви не отримаєте адресу у пам’яті. Ось як елементи операнда у пам’яті виглядають у іншому форматі:
BX SI

чи+ чи +Зміщення

BP DI

(база) (індекс)


Існують 16 способів завдання адреси у пам’яті:
[зміщення] [bp+зміщення]

[bx] [bx+зміщення]

[si] [si+зміщення]

[di] [di+зміщення]

[bx+si] [bx+si+зміщення]

[bx+di] [bx+di+зміщення]

[bp+si] [bp+si+зміщення]

[bp+di] [bp+di+зміщення]


Де зміщення – це те що можна привести до 16-бітового постійного значення.
Може здаватися, що 16 режимів адресації – це дуже багато, але якщо ще раз подивитесь на цей список, то побачите, що усі режими адресації отримують всього з декількох елементів, які комбінуються різними шляхами. Ось ще декілька способів, за допомогою яких можна, використовуючи різні режими адресації, завантажити дев’ятий символ рядка CharString у регістр AL.

CharString DB ‘ABCDEFGHIJKLM’,0

mov ax,@Data

mov ds,ax

mov si,OFFSET CharString+8

mov al,[si]


mov bx,8

mov al,[CharString+bx]


mov bx,OFFSET CharString

mov al,[bx+8]


mov si,8

mov al,[CharString+si]


mov bx,OFFSET CharString

mov di,8


mov al,[bx+di]
mov si, OFFSET CharString

mov bx,8


mov al,[si+bx]
mov bx,OFFSET CharString

mov si,7


mov al,[bx+si+1]
mov bx,3

mov si,5


mov al,[bx+CharString+si]
Усі ці інструкції посилаються на одну й ту ж чарунку пам’яті [CharString]+8.
У даному прикладі можна знайти декілька цікавих моментів. По-перше, повинні розуміти, що знак плюс (+), який використовується всередині квадратних дужок, має спеціальне значення.

ПОРЯДОК ВИКОНАННЯ РОБОТИ


Зарезервувати місце в пам’яті у сегменті даних Dseg_1 для масиву байт у 10 елементів MasB.

Зарезервувати місце у пам’яті у другому сегменті даних Dseg_2 для масиву слів у 30 елементів з ім’ям MasW.

Зарезервувати місце у додатковому сегменті Eseg для таблиці, складеної з 10 записів по 4 елемента TablB.

Зарезервувати місце у додатковому сегменті Eseg для таблиці подвійних слів з ім’ям TablAdr 40 елементів.

Використовуючи пряму адресацію з індексуванням заповнити масив MasB.

Використовуючи базову адресацію зі зміщенням заповнити MasW.

Використовуючи базову адресацію з індексуванням заповнити TablB наступним чином: в якості змісту 1-го елементу кожного запису береться елемент MasB з тим же номером, що й номер запису. В якості змісту решти полів береться перший байт елементів MasW по порядку їх слідування у масиві.

Використовуючи навперемінно, якщо це можливо чи команду завантаження абсолютної адреси, чи псевдооператори SEG, OFFSET заповнити таблицю TablAdr так, щоб кожний елемент таблиці удавав собою адресу відповідного елементу таблиці TablB

Використовуючи операції зі стеком спочатку залишаємо в TablB порядок елементів у записах незмінними, змінити в зворотному порядку розташування записів, а потім не змінюючи розташування записів змінити на зворотній порядок елементів.

ЗМІСТ ЗВІТУ


Постановка задачі.

Текст програми, вихідні дані.

Тести та результати відлогодження.

Блок-схема програми.

Результати рішення на ЕОМ.

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


Директива SEGMENT та її параметри.

Директива ENDS.

Директива ASSUME.

Заголовок EXE програми.

Визначення даних.

Способи адресації.

Команда MOV, призначення, обмеження при використанні.

Стек, команди роботи зі стеком.



  1   2   3   4


Скачати 470.53 Kb.

  • “ Архітектура комп ’ ютера ”
  • ЗАГАЛЬНІ ВІДОМОСТІ ПРО ТУРБО АСЕМБЛЕР
  • ЛАБОРАТОРНА РОБОТА № 1 Вивчення відлагоджувача DEBUG
  • Ключі до відлагоджувача DEBUG
  • ЛАБОРАТОРНА РОБОТА № 2 Вивчення режимів адресації і8086 та команд пересилання даних
  • Директива SEGMENT Директива SEGMENT визначає початок сегменту. Мітка, яка вказується у даній директиві, визначає початок сегменту. Наприклад, директива: Cseg SEGMENT
  • Ініціалізація рядків символів
  • Режими адресації пам’яті
  • ПОРЯДОК ВИКОНАННЯ РОБОТИ