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

1.4.2 Варіанти завдань

Виконати операції NOT, AND, OR:

Варіант

Числа

Варіант

Числа

1

1011010001101101

11011011

9

1111010001111101

10011001

2

11110100011010101

10011001

10

1011110001101001

11011011

3

1011010101001101

11011011

11

1011011001100101

11111111

4

1011010011111101

11101110

12

1011010001101101

10001101

5

1011010001101101

10011001

13

1011011101111101

11001011

6

1010110001100111

10010101

14

1011011001101001

10111111

7

1111011001101111

11001111

15

1011010101100001

11001001

8

1011110001100101

11001001

16

1011010011001101

10011001

2.Мова assembler

У даний час найрозповсюдженими мовами програмування є C/C++, Pascal/Delphi, Basic/Visual Basic. Ми будемо розглядати мову асемблера. Мовою асемблера пишуть:

  • все, що потребує максимальної швидкості виконання (основні компоненти ігор, ядра операційних систем рельного часу і росто критичні частини програм);

  • все, що взаємодіє з зовнішніми пристроями (драйвери, програми, що використовують порти вводу-виводу), звуковими т відео платами;

  • все, що повністю використовує можливості процесора (ядра багатозадачних операційних систем);

  • все, що повністю використовує можливості операційної системи (віруси і антивіруси, захист від несанкціонованого доступу)

та багато іншого.

Асемблер – це програма, яка перетворює текст із зрозумілої людині мови у машинні коди. Разом з асемблером повинна бути ще одна програма – компоновщик (linker), яка створює виконувані файли (exe або com) із одного або кількох об’єктних модулів, які створює асемблер.

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

Програма виводу на екран повідомлення “Hello world” може мати вигляд:

.MODEL SMALL

.STACK 100h

.DATA

Message DB 'Hello!',13,10,'$'

.CODE

Start: mov ax,@DATA ;встановити регістр DS так,

mov dx,ax ;щоб він вказував на сегмент даних

mov ah,9 ;функція DOS виводу рядка

mov dx,OFFSET Message ;посилання на повідомлення "Hello!"

int 21h ;вивести "Hello!" на екран

mov ah,4ch ;функція DOS закінчення програми

int 21h ;закінчити програму

END Start

Цю програму необхідно записати у файл з розширенням asm, наприклад, Hello.asm. Для того, щоб створити exe-програму необхідно виконати наступну послідовність дій:

Програма мовою асемблера складається з рядків наступного вигляду

<мітка> <команда/директива> <операнди> ; коментар

Всі поля є необов’язковими, тобто можуть бути відсутні.

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

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

DB – 1 байт, DF – 6 байт,

DW – 2 байта, DQ – 8 байт,

DD – 4 байта, DT – 10 байт.

Поле значення може містити одно або кілька чисел, рядків символів, взятих в апострофи, символів ? і dup(). Всі задані таким чином дані будуть у файлі, а ім’я змінної буде відповідати адресі першого з вказаних значень.

Приклади запису констант:

text_string db ‘Hello world!’

number dw 7

table db 1,2,3,4,5,6,7,8,9,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh

float_number db 3.5e7

Ці записи заповнюють даними 33 байта. Перші 12 байт містять ASCII-коди символів “Hello world!”. Змінна text_string вказує на першу букву. Команда mov al,text_string занесе в регістр al число 48h (код букви ‘H’).

Якщо замість значення записано ?, тоді змінна вважається неініціалізованою і на момент запуску програми може мати будь-яке значення. Для запису у пам’ять даних, що повторюються, використовують оператор dup. Наприклад, командою table_512w dw 512dup(?) створюється масив двобайтних слів, на перше із яких вказує змінна table_512w.

Дані і код програми можуть розміщуватись в окремих сегментах. Сегменти програми описуються директивами SEGMENT i ENDS:

ім’я_сегменту SEGMENT

ім’я_сегменту ENDS

У програмі вказуються сегменти даних, коду і стеку. Директива ASSUME вказує асемблеру з яким сегментом зв’язаний той чи інший сегментний регістр.

Для різних типів програм застосовують відповідні моделі пам’яті. Вони вказуються директивою MODEL. Формат запису .MODEL <модель>, де <модель> може мати значення:

  • TINY – код, дані і стек розміщуються в одному і тому ж сегменті, розміром до 64K (ця модель найчастіше використовується для написання невеликих програм);

  • SMALL – код розміщується в одному сегменті, а дані і стек – в іншому;

  • COMPACT – код в одному сегменті, а для даних можуть використовуватись декілька сегментів;

  • MEDIUM – код може бути розміщений в кількох сегментах, а дані – в одному;

  • LARGE i HUGE – і код і дані можуть розміщуватись в кількох сегментах.

Програмна модель процесора Intel Pentium містить:

  • 8 32-розрядних регістрів загального призначення, які використовуються для зберігання даних або адрес;

  • 6 16-розрядних регістрів сегментів, які зберігають адреси сегментів;

  • 32-розрядний регістр управління і контролю EFLAGS, який дозволяє управляти станом виконання програми і станом процесора;

  • 32-розрядний регістр EIP, який вказує на наступну команду процесора;

  • система команд процесора;

  • режими адресації даних в командах.

Регістри процесора Intel Pentium є основними операндами команд і використовуються програмах для обробки даних. Вони показані на рис. 3.

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

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

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

Лічильник команд

Рисунок 3 - Регістри процесора Intel Pentium

Регістри загального призначення можуть використовуватись як операнди арифметичних або логічних команд, операнди для обчислення адрес операндів, вказувачі на комірки пам’яті (адреси). Кожен із цих регістрів був придуманий для певних цілей, хоча вони можуть використовуватись і не за прямим призначенням:

  • EAX виконує функцію акумулятора і зберігає результат команди;

  • EBX вказує на дані, які знаходяться в сегменті даних, на який вказує регістр DS;

  • ECX - лічильник циклів і символів в командах обробки рядків символів;

  • EDX – вказувач на порти пристроїв вводу-виводу;

  • ESI – вказувач на дані, які знаходяться в сегменті даних, на який вказує регістр DS, а в командах обробки рядків символів містить зміщення рядка-джерела;

  • EDI – вказувач на дані, які знаходяться в сегменті даних, на який вказує регістр ES, а в командах обробки рядків символів містить зміщення рядка-приймача;

  • EBP вказує на дані стеку, на який вказує регістр SS;

  • ESP – вказувач стеку, на який вказує регістр SS.

У програмах молодші 16 біт 32-розрядних регістрів загального призначення можуть використовуватись як 16-розрядні регістри в процесорах 8086, а саме AX, BX, CX, DX, BP, SI, DI, SP. Перші 4 регістри також можуть використовуватись частинами. Старші 8-розрядні регітри: AH, BH, CH, DH, а молодші: AL, BL, CL, DL. Це показано на рис.4.

Рисунок 4 - Використання регістрів загального призначення

Сегментні 16-розрядні сегментні регістри CS, DS, SS, ES, FS,GS містять адреси сегментів пам’яті. Процесор Intel Pentium підтримує наступні типи сегментів:

  • Сегмент коду. Містить команди програми. Для доступу до цього сегмента служить регістр CS (code segment register) - сегментний регістр коду. Він містить адресу сегмента з командами, які виконує процесор.

  • Сегмент даних. Містить оброблювані програмою дані. Для доступу до цього сегмента служить регістр DS (data segment register) — сегментний регістр даних, що зберігає адресу сегмента даних програми.

  • Сегмент стека. Цей сегмент є частиною пам'яті, яку називають стеком. Роботу зі стеком процесор організує за принципом: останній записаний у цю память елемент вибирається першим. Адреса цього сегмента міститься в регістрі SS (stack segment register) — сегментний регістр стека.

  • Додатковий сегмент даних. Неявно алгоритми виконання більшості команд припускають, що оброблювані ними дані розташовані в сегменті даних, адреса якого перебуває в сегментному регістрі DS. Якщо програмі недостатньо одного сегмента даних, тоді вона має можливість використовувати додаткові сегменти даних. Але на відміну від основного сегмента даних, адреса якого зберігається в сегментному регістрі DS, при використанні додаткових сегментів даних їхні адреси потрібно вказувати явно за допомогою спеціальних префіксів перевизначення сегментів у команді. Адреси додаткових сегментів даних повинні міститись в регістрах ES, GS, FS (extension data segment registers).

Процесор Intel Pentium містить ще два регістри: EIP та EFLAGS У лічильнику команд EIP зберігається зміщення в сегменті коду, на який вказує сегментний регістра cs, наступної команди для виконання. Цей регістр безпосередньо недоступний програмістові, але завантаження або зміна його значення виконується командами керування, до яких відносяться команди умовних і безумовних переходів, виклику процедур і повернення із процедур. Виникнення переривань також приводить до зміни вмісту регістра EIP.

Використовуючи регістр EFLAGS, можна одержувати інформацію про результати виконання команд і впливати на стан процесора. Назви бітів-прапорів цього регістру зображено на рис.5.

Рисунок 5 - Регістр прапорів EFLAGS

Виходячи з функціонального призначення, прапори регістра EFLAGS можна розділити на три групи:

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

  2. 1 прапор керування. Позначається DF (Directory Flag). Він знаходиться в 10-му біті регістра EFLAGS і використовується ланцюговими командами. Значення прапора DF визначає напрямок поелементної обробки в цих командах: від початку рядка до кінця (DF = 0) або навпаки, від кінця рядка до його початку (DF = 1). Для роботи із прапором DF існують спеціальні команди: CLD (зняти прапор DF) і STD (установити прапор DF). Застосування цих команд дозволяє привести прапор DF у відповідність із алгоритмом і забезпечити автоматичне збільшення або зменшення лічильників при виконанні операцій з рядками символів;

5 системних прапорів, керуючих вводом/виводом, маскуванням переривань, налагодженням, перемиканням між завданнями й віртуальним режимом. Прикладним програмам не рекомендується модифікувати без необхідності ці прапори, тому що в більшості випадків це приведе до переривання роботи програми.

Для зручності та наглядного використання асемблерних команд використовується оболонка Turbo Debugger (td.exe). В основному вікні, що відображене нижче показані п’ять підекранів: команд, регістрів та прототипів стекової пам’яті, комірок оперативної пам’яті.

Для запису команди необхідно просто почати на клавіатурі її набір. Автоматично з’явиться підекран команд, котрі будуть виконуватися. Наприклад,

Після набору команди та натиску ОК ця команда появиться у списку-черзі команд, підготовлених до виконання.

Виконати команду можна вибравши набрану команду у вікні списку команд та натиснувши F8. Після виконання команди відразу ж можна переконатися у правильності виконання по стану регістрів та флажків. Щоб переключатися між екранними вікнаим оболонки необхідно користуватися клавішою Tab. В наведеному прикладі ми побачили, що змінилося значення регістру АХ та лічильник ІР набув значення 0103, котре в стеку відповідає наступній команді.

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

Тема роботи: Команди пересилання даних.

Мета роботи: Навчитися використовувати команди MOV.