Лабораторна робота №10 Середовище Emu8086. Перша програма на Асемблері. Мета роботи: навчиться працювати з програмою Emu8086, створити за її допомогою першу програму. Теоретичні



жүктеу 151.74 Kb.
Дата14.05.2019
өлшемі151.74 Kb.
түріЛабораторна робота


Лабораторна робота №10
Середовище Emu8086. Перша програма на Асемблері.
Мета роботи: навчиться працювати з програмою Emu8086, створити за її допомогою першу програму.
Теоретичні відомості
1.1 Програмний емулятор (віртуальний ПК) Emu8086
Для створення виконуємої програми на мові Асемблера необхідне певне програмне забезпечення: компілятор, компоновщик (редактор зв’язків) та налагоджувач (дебагер). Існує велика кількість пакетів подібного програмного забезпечення.

Програма пишеться у будь-якому текстовому редакторі та зберігається з довільним ім’ям та розширенням ASM. Такий файл називається вихідним модулем. За допомогою компілятора вихідний модуль перетворюється в об’єктний (файл з тим же ім’ям та розширенням OBJ), паралельно може створюватися і файл лістингу, який має розширення LST. Об’єктний модуль за допомогою редактора зв’язків перетворюється на виконуєму програму з розширенням COM або EXE.

Emu8086 поєднує в собі потужний редактор вихідного коду, асемблер, дізассемблер, програмний емулятор (віртуальний ПК) з відладчиком і поетапне навчання.

Візуальний інтерфейс дуже простий в роботі. Ви можете спостерігати регістри, прапори і пам'ять під час виконання вашої програми.

Арифметико-логічний пристрій (АЛП) показує внутрішню роботу центрального процесора (CPU).

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

Машинний код 8086 повністю сумісний з усіма, що послідували за ним, поколіннями мікропроцесорів Intel, включаючи Pentium II і Pentium 4, і я впевнений, що Pentium 5 буде також підтримувати команди 8086. Це робить код 8086 дуже привабливим, тому що він виконується як на старих, так і на сучасних комп'ютерних системах. Іншою перевагою є те, що набір команд 8086 порівняно невеликий, і тому вивчити його буде легше.

Emu8086 має легший синтаксис, ніж будь-які інші асемблери, але буде генерувати програму, яка зможе бути виконана на будь-якому комп'ютері, що підтримує машинний код 8086.





    1. Регістри процесора 8086

Процесор містить 14 швидкодіючих 16-розрядних чарунок пам’яті, які називаються регістрами (див. таблицю 10.1).

Регістри поділяють на регістри загального призначення, сегментні, індексні, вказівники та регістр стану процесора і регістр вказівник команд. До регістрів загального призначення (АХ, ВХ, СХ, DХ) можна звертатися як безпосередньо, так і побайтово (до молодшого та старшого розряду окремо), наприклад, регістр АХ складається з молодшого розряду AL та старшого — AH. Індексні регістри (SI, DI), призначені для зберігання індексів при роботі з рядковими даними. Регістри–вказівники (BP, SP) — використовуються для роботи зі стеком.

Сегментні регістри використовуються для зберігання адрес відповідних сегментів пам’яті. Сегментом називається область пам’яті, яка починається з адреси кратної 16 та містить дані однієї структури. Розрізняють три головні сегменти програми: сегмент коду (CS) — містить інструкції програми; сегмент даних (DS) — містить дані, задані програмістом; сегмент стеку (SS) — область пам’яті, доступ до якої організований за принципом LIFO (last in, first out — останній зайшов, перший вийшов). Також існує розширений сегмент (ES), який використовується, наприклад, при роботі з рядковими даними.

Регістр стану (регістр прапорів) визначає стан процесору після виконання кожної команди. Для мікропроцесорів Intel 8086 активними є 9 біт з 16. Ці біти називають прапорами стану (Додаток Б). Регістр–вказівник команд (IP) містить адресу команди (в сегменті коду). Під час виконання програми значення вказівника збільшується на розмір виконаної команди. Існують команди, які змінюють значення IP для реалізації переходів всередині програми.

Таблиця 10.1 – Регістри процесору Intel 8086



Ім’я

English

Призначення




Регістри загального призначення




AX

Accumulator

Акумулятор (AH, AL), надшвидкий регістр, зв’язаний безпосередньо з АЛП (арифметико- логічним пристроєм) мікропроцесора.




BX

Base

Базовий регістр (BH, BL), використовується при розширеній адресації.




CX

Counter

Регістр-лічильник (CH, CL), керує числом повто рень у циклах.




DX

Data

Регістр даних (DH, DL), використовується для введення/виведення даних та для обчислень з по- двійною точністю, або великими числами при не- достатній розрядності акумулятора.




Індексні регістри




SI

Source Index

Індексування джерела (SI)/приймача(DI), викорис- товуються при обробці рядкових даних та індек- сування масивів даних.




DI

Destination Index




Регістри – вказівники




BP

Base Pointer

Вказівник бази




SP

Stack Pointer

Вказівник стека




Сегментні регістри




CS

Code Segment

Сегмент коду, не можна змінити напряму.




SS

Stack Segment

Сегмент стеку.




DS

Data Segment

Сегмент даних.




ES

Extension Segment

Розширений сегмент даних.




Вказівник команди




IP

Instruction Pointer

Зміщення команд, програмно не доступний.




Регістр прапорів




FLAGS




Інформація про поточний стан процесора.



1.3 Синтаксис Асемблера


Програма на мові Асемблера є послідовністю операторів, що описують виконувані дії. Оператором (рядком) початкової програми може бути або команда, або псевдооператор (директива) Асемблера.

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

Команда може включати до 4-х полів наступного виду:

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

Приклад команди з усіма полями:

exit: MOV CX, DX ; помістити вміст регістра DX в регістр CX

Оскільки в [ ] вказуються необов'язкові поля, отже, команда обов'язково повинна містити мнемокод виконуваної дії. Поля можуть набиратися у будь-якому місці рядка, але відділяйте поля один від одного хоч би одним пропуском і, якщо хочете розібратися у своїй програмі по витіканню часу, потурбуйтеся про читабельність, що найчастіше забезпечується за рахунок позиціонування полів.

Мітка, команда та операнд відокремлюється один від одного символом пробілу або табуляції, коментар починається від символу «;» і до кінця рядка. Коментар не відноситься до машиного коду і ігнорується транслятором. Мітка може містити: літери латинської абетки, цифри (не може бути першим символом), спеціальні символи: ? @ _ $. Мітки в основному використовують для команд передачі керування і вони не є обов’язковими.

Мова Асемблера може містити змінні, які визначаються за допомогою директив: DB – визначає байт, DW – слово, DD – подвійне слово. Синтаксис:

ім’я DB значення

Вимоги до імені змінної такі ж, як і для мітки. Значення може бути: числовим (14, 4Вh, 1000112b), декілька чисел, строковим («рядок») та масивом, елементи якого розділяються комою, оператор «?» (який задає невизначену змінну) та DUP (дублювання даних вказану кількість раз). Змінна являє собою область пам’яті, яка помічена певним ім’ям. Зазвичай всі змінні розміщують в сегменті даних.


text_string

db

'Dobrogo dnya!'

; задавання рядку символів

number

dw

7

; number розміром 2 байти та значенням 7

tab

db

1,2,3,4,5,6,7,8,9

; визначення табличних даних (масиву)

null

db

?

; задавання невизначеної змінної

table_512

dw

512 dup(0)

; масив з 512 слів заповнених нулями.

mas

db

8 dup (‘a’, ‘b’)

; масив: 8 разів повторюється ‘ab’

В якості операнда в команді може фігурувати константа, яка може вводитися в наступних формах:

  • двійковою, як послідовність цифр 0 і 1, що закінчуються буквою В, наприклад, 10111010В;

  • десятковою, в звичній десятковій системі числення з необов'язковою буквою D на кінці, наприклад, 129d або просто 129;

  • шістнадцятиричною, як послідовність цифр від 0 до 9 і букв від A до F, що закінчується буквою H. Якщо шістнадцятирична константа розпочинається з букви, то така константа доповнюється першим символом - цифрою від 0 до 9, наприклад, 0Е23h (в даному випадку перша цифра інформує Асемблер про те, що Е23 число, а не ідентифікатор або змінна);

  • літералом, у вигляді рядка букв, цифр і інших символів, поміщеного в лапки або апострофи.

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

Не можна використати в якості міток імена регістрів і мнемокоди, крім того мітка повинна розпочинатися з букви, але може містити цифри і спеціальні символи : ?, @, /, _, $ і точку, проте точка може бути тільки першим символом мітки.

Важливою особливістю машинних команд є те, що вони не можуть маніпулювати одночасно 2-мя операндами, що знаходяться в оперативній пам'яті (ОЗУ). Це означає, що в команді тільки 1 операнд може вказувати на осередок ОЗУ, інший операнд має бути або регістром, або безпосереднім значенням. З цієї причини можливі наступні поєднання операндів в команді:


  • регістр – регістр;

  • регістр – пам'ять;

  • пам'ять – регістр;

  • регістр – безпосередній операнд;

  • пам'ять – безпосередній операнд;

  • сегментний регістр – регістр.

Для команд характерно, що за наявності двох операндів перший з них є приймачем, а другий – джерелом. Результат операції зберігається за першою адресою, ось чому перший операнд ніколи не може бути безпосереднім операндом або, інакше кажучи, константою.
1.4 Команда MOV– команда пересилки даних
Команда записується наступним чином:

MOV приймач, джерело

Дія: копіює вміст джерела в приймач, джерело не змінюється.

Приймач може бути регістром, пам’ятью. Джерело – регістром, пам’ятью, безпосереднім значенням.



mov ax, 7 ; в регістр AX буде занесене число 7.

mov ax, abc ; в регістр AX буде занесене значення за адресою АВС.

mov АВС, 82 ; за адресою АВС буде занесене число 82.

mov DS, BX ; регістр DS матиме значення регістра BX
1.5 Стек
Стек – це структура пам’яті, яка використовується для тимчасового зберігання інформації. Програма може помістити дані в стек (PUSH) або забрати їх звідти (POP). Наприклад:

PUSH AX ; у стек розмістити вміст регістру АХ

PUSH abc ; у стек розмістити значення змінної abc

PUSH 1234h ; у стек розмістити число 1234h

POP BX ; значення зі стеку розмістити у ВХ

POP [1234h] ; значення зі стеку розмістити за адресою 1234h

POP qwerty ; значення зі стеку розмістити у змінну qwerty


  1. Завдання до лабораторної роботи



Розробити програму на Асемблері для виконання наступних завдань:

2.1 За адресою рівному дню і місяцю Вашого народження (наприклад, 23 травня – 2305) занести рік Вашого народження, представивши його як шістнадцятиричне число.

2.2 Визначити змінну const, присвоївши їй день і місяць Вашого народження у форматі описаному вище. Відправити це значення до стека. Розмістити це значення зі стека у регістр CX.

2.3 Призначити змінній fio Ваше прізвище, ім'я, по батькові. У пам'яті відразу після fio розмістити символ, код якого в ASCII-кодах визначити, як Ваш варіант плюс 14. А потім через пропуск дату Вашого народження у форматі ddmmyyуу (наприклад, 23051987).

2.4 Визначити адресу fio. Визначити адресу сегмента, зміщення та фізичну адресу кожного слова fio. Розмістити в регістр AL середню букву ПІБ (значення округлити до цілого). Дані внести в таблицю:


Слово в рядку

Адреса сегмента

Зміщення

Фізична адреса













У звіті до кожного завдання повинен бути скріншот середовища Emu8086, в якому повинні відображатись текст програми, регістри, стек та данні з оперативної пам’яті.


  1. Порядок виконання лабораторної роботи

3.1 Ознайомитись з теоретичною частиною.

3.2 Написати та налагодити програму для завдання.

3.2 Записати очікувані результати.




  1. Вміст звіту

Звіт повинен містити наступне:

4.1 Індивідуальне завдання.

4.2 Основний текст програми з коментарями до опису команд у завданні.



    1. Заповнену таблицю.

4.4 Скріншоти програми, регістрів, пам’яті.

4.5 Висновок по роботі.




  1. Приклад виконання лабораторної роботи

Лабораторна робота №10


Середовище Emu8086. Перша програма на Асемблері.
Мета роботи: навчиться працювати з програмою Emu8086, створити за її допомогою першу програму.

Хід роботи.

Завдання. Розробити програму на Асемблері для виконання наступних пунктів:

1.1 За адресою рівному дню і місяцю народження – 2305 – занести рік народження – 1987, представивши його як шістнадцятиричне число (1987h).

1.2 Визначити змінну const, присвоївши їй день і місяць народження у форматі 2305. Відправити це значення до стека. Розмістити це значення зі стека у регістр CX.

1.3 Призначити змінній fio прізвище, ім'я, по батькові – Sidorov Ivan Petrovich. У пам'яті відразу після fio розмістити символ, код якого в ASCII-кодах визначити, як 44. А потім через пропуск дату народження у форматі ddmmyyуу (наприклад, 23051987).

1.4 Визначити адресу fio. Визначити адресу сегмента, зміщення та фізичну адресу кожного слова fio. Дані внести в таблицю:


Слово в рядку

Адреса сегмента

Зміщення

Фізична адреса













1.5 Розмістити в регістр AL середню букву ПІБ (значення округлити до цілого). Середня буква має номер 11 і є «а».
Текст програми для завдання.

; дата народження - 23/05/1987

org 100h

mov [2305h], 1987h

push const

pop cx


; мій варіант - 30

lea bx, fio

mov [bx+22], 44

mov [bx+23], ' '

mov [bx+24], 0523h

mov [bx+26], 8719h

mov al, [bx+10]

ret


const dw 2305d

fio db "Sidorov Ivan Petrovich"


Скріншот виконання програми до пунктів 1.1 та 1.2 (див. рисунок 10.1):

Рисунок 10.1 – Скріншот виконання програми до пунктів 1.1-1.2


Скріншот виконання програми до пунктів 1.3 та 1.5 (див. рисунок 10.2):

Рисунок 10.2 – Скріншот виконання програми до пунктів 1.3-1.5


Таблиця 10.1 – Виконання завдання до пункту 1.4

Слово в рядку

Адреса сегмента

Зміщення

Фізична адреса

Sidorov

0700

0126

07126

Ivan

0700

012Е

0712Е

Petrovich

0700

0133

07133

Висновок: виконавши цю лабораторну роботу, я навчився працювати з програмою Emu8086, створив за її допомогою першу програму.




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

6.1 Для чого використовують програмний емулятор Emu8086?

6.2 Роботу якого пристрою можна спостерігати при роботі в Emu8086?

6.3 Перелічить основні види регістрів Intel8086.

6.4 Перелічить регістри загального призначення Intel8086.

6.5 Перелічить індексні регістри Intel8086.

6.6 Перелічить регістри–вказівники Intel8086.

6.7 Перелічить сегментні регістри Intel8086.

6.8 Для чого потрібен регістр стану (регістр прапорів)?

6.9 Вкажіть структуру команди Асемблера.

6.10 Які бувають директиви визначення змінних, масивів тощо?

6.11 Які можуть бути числові дані в Асемблері?

6.12 Яким чином визначають рядок?

6.13 Чим можуть буди операнди в команді? Перерахуйте можливі їх поєднання в команді.

6.14 Опишіть команду MOV.

6.15 Опишіть команди стека.







Розробила Сайко Т.С.

Розглянуто та схвалено

на засіданні предметної (циклової) комісії Комп’ютерної інженерії

Протокол № _______ від ________20__ р.



Голова комісії Старосельцева О.В.



Достарыңызбен бөлісу:


©kzref.org 2019
әкімшілігінің қараңыз

    Басты бет