Програмна модель процесорів сімейства X86

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

ПРОГРАМНА МОДЕЛЬ ПРОЦЕСОРІВ СІМЕЙСТВА X 86

Користувальницькі регістри

Як випливає з назви, призначеними для користувача регістри називаються тому, що програміст може використовувати їх при написанні своїх програм. До цих регістрів відносяться (рис. 1):

  • вісім 32-бітових регістрів, які можуть використовуватися програмістами для зберігання даних і адрес (їх ще називають регістрами загального призначення (РОН)):

  • eax / ax / ah / al;

  • ebx / bx / bh / bl;

  • edx / dx / dh / dl;

  • ecx / cx / ch / cl;

  • ebp / bp;

  • esi / si;

  • edi / di;

  • esp / sp.

  • регістр прапорів eflags / flags;

  • регістр покажчика команди eip / ip.

Рис. 1. Користувальницькі регістри мікропроцесорів i486 і Pentium

Чому багато хто з цих регістрів наведені з похилою рискою?

Ні, це не різні регістри - це частини одного великого 32-розрядного регістра. Їх можна використовувати у програмі як окремі об'єкти.

Так зроблено для забезпечення працездатності програм, написаних для молодших 16-розрядних моделей мікропроцесорів фірми Intel, починаючи з i8086.

Мікропроцесори i486 і Pentium мають в основному 32-розрядні регістри. Їх кількість, за винятком сегментних регістрів, таке ж, як і у i8086, але розмірність більше, що і відображено в їх позначеннях - вони мають приставку e (E xtended).



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

Всі регістри цієї групи дозволяють звертатися до своїх "молодшим" ​​частинами.

Для самостійної адресації можна використовувати лише молодші 16 і 8-бітні частини цих регістрів. Старші 16 біт цих регістрів як самостійні об'єкти недоступні. Це зроблено, як ми зазначили вище, для сумісності з молодшими 16-розрядними моделями мікропроцесорів фірми Intel.

Перерахуємо регістри, які відносяться до групи регістрів загального призначення. Так як ці регістри фізично знаходяться в мікропроцесорі всередині арифметико-логічного пристрою (АЛП), то їх ще називають регістрами АЛУ:

  • eax / ax / ah / al (Accumulator register) - акумулятор.

Застосовується для зберігання проміжних даних. У деяких командах використання цього регістра обов'язково;

  • ebx / bx / bh / bl (Base register) - базовий регістр.

Застосовується для зберігання базової адреси деякого об'єкту в пам'яті;

  • ecx / cx / ch / cl (Count register) - регістр - лічильник.

Застосовується в командах, які виробляють деякі повторювані дії. Його використання найчастіше неявно і приховано в алгоритмі роботи відповідної команди.

Наприклад, команда організації циклу loop крім передачі керування команді, що знаходиться за деякою адресою, аналізує і зменшує на одиницю значення регістра ecx / cx;

  • edx / dx / dh / dl (Data register) - регістр даних.

Так само, як і регістр eax / ax / ah / al, він зберігає проміжні дані. У деяких командах його використання обов'язково; для деяких команд це відбувається неявно.

Наступні два регістри використовуються для підтримки так званих ланцюжкових операцій, тобто операцій, які виробляють послідовну обробку ланцюжків елементів, кожен з яких може мати довжину 32, 16 або 8 біт:

  • esi / si (Source Index register) - індекс джерела.

Цей регістр у ланцюжкових операціях містить поточну адресу елемента в ланцюжку-джерелі;

  • edi / di (Destination Index register) - індекс приймача (одержувача).

Цей регістр у ланцюжкових операціях містить поточну адресу в ланцюжку-приймачі.

В архітектурі мікропроцесора на програмно-апаратному рівні підтримується така структура даних, як стік. Для роботи зі стеком в системі команд мікропроцесора є спеціальні команди, а в програмній моделі мікропроцесора для цього існують спеціальні регістри:

  • esp / sp (Stack Pointer register) - регістр покажчика стека.

Містить покажчик вершини стека в поточному сегменті стека.

  • ebp / bp (Base Pointer register) - регістр покажчика бази кадру стека.

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

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

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

Сегментні регістри cs, ss, ds, es, gs, fs.

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

Для того, щоб вказати на сегменти, до яких програма має доступ в конкретний момент часу, і призначені сегментні регістри. Фактично, з невеликою поправкою, як ми побачимо далі, в цих регістрах містяться адреси пам'яті з яких починаються відповідні сегменти. Логіка обробки машинної команди побудована так, що при вибірці команди, доступі до даних програми або до стека неявно використовуються адреси в цілком певних сегментних регістрах. Мікропроцесор підтримує такі типи сегментів:

  1. Сегмент коду. Містить команди програми.

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

  1. Сегмент даних. Містить оброблювані програмою дані. Для доступу до цього сегменту служить регістр ds (data segment register) - сегментний регістр даних, який зберігає адресу сегменту даних поточної програми.

  2. Сегмент стека. Цей сегмент являє собою область пам'яті, звану стеком. Роботу зі стеком мікропроцесор організує за наступним принципом: останній записаний в цю область елемент вибирається першим. Для доступу до цього сегменту служить регістр ss (stack segment register) - сегментний регістр стека, що містить адресу сегмента стека.

  3. Додатковий сегмент даних.

Неявно алгоритми виконання більшості машинних команд припускають, що оброблювані ними дані розташовані в сегменті даних, адреса якого знаходиться в сегментному регістрі ds.

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

Адреси додаткових сегментів даних повинні міститися в регістрах es, gs, fs (extension data segment registers).

Регістри стану і управління eflags і ip

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

eflags / flags (flag register) - регістр прапорів. Розрядність eflags / flags - 32/16 біт. Окремі біти даного регістра мають певне функціональне призначення і називаються прапорами. Молодша частина цього регістра повністю аналогічна регістру flags для i8086.

Рис. 2. Вміст регістра eflags

Виходячи з особливостей використання, прапори регістру eflags / flags можна розділити на три групи:

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

  • 1 прапор управління - df (Directory Flag). Значення прапора df визначає напрямок поелементної обробки ланцюжків даних: від початку рядка до кінця (df = 0) або навпаки, від кінця рядка до її початку (df = 1).

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

eip / ip (Instraction Pointer register) - регістр - покажчик команд.

Регістр eip / ip має розрядність 32/16 біт і містить зсув наступного підлягає виконанню команди щодо вмісту сегментного регістра cs в поточному сегменті команд. Цей регістр безпосередньо недоступний програмісту, але завантаження і зміна його значення виробляються різними командами управління, до яких відносяться команди умовних і безумовних переходів, виклику процедур і повернення з процедур. Виникнення переривань також призводить до модифікації регістру eip / ip.

Типи даних. Змінні

У програмі на асемблері змінними є регістри або комірки пам'яті, в яких зберігаються дані. Існує кілька типів даних-змінних:

  1. Безпосередні дані, що представляють собою числові або символьні значення, що є частиною команди. 20 d, 0 a 2 h, 10111 b

  2. Дані простого типу, якi описуються обмеженого набору директив резервування пам'яті, що дозволяють виконати самі елементарні операції з розміщення та ініціалізації числової і символьної інформації.

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

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

Фізична інтерпретація даних простого типу грунтується на розмірності даних:

  • байт - вісім послідовно розташованих бітів, пронумерованих від 0 до 7, при цьому біт 0 є наймолодшим значущим бітом;

  • слово - послідовність з двох байт, що мають послідовні адреси. Розмір слова - 16 біт; біти в слові нумеруються від 0 до 15. Байт, що містить нульовий біт, називається молодшим байтом, а байт, що містить 15-й біт - старшим байтом. Мікропроцесори Intel мають важливу особливість - молодший байт завжди зберігається за меншим адресою. Адресою слова вважається адреса його молодшого байта. Адреса старшого байта може бути використаний для доступу до старшої половині слова.

  • подвійне слово - послідовність з чотирьох байт (32 біта), розташованих по послідовних адресами.

  • учетверенное слово - послідовність з восьми байт (64 біта), розташованих по послідовних адресами.

Рис. 3. Основні типи даних мікропроцесора

Логічна інтерпретація цих типів:

  • Цілий тип зі знаком - двійкове значення зі знаком, розміром 8, 16 або 32 біта. Знак у цьому двійковому числі міститься в 7, 15 або 31-м бите відповідно. Нуль в цих бітах в операндах відповідає позитивному числу, а одиниця - негативному. Негативні числа представляються в додатковому коді. Числові діапазони для цього типу даних наступні:

    • 8-розрядне ціле - від -128 до +127;

    • 16-розрядне ціле - від -32 768 до +32 767;

    • 32-розрядне ціле - від -2 31 до +2 31 -1.

  • Цілий тип без знака - двійкове значення без знака, розміром 8, 16 або 32 біта. Числовий діапазон для цього типу наступний:

    • байт - від 0 до 255;

    • слово - від 0 до 65 535;

    • подвійне слово - від 0 до 2 32 -1.

  • Покажчик на пам'ять двох типів:

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

    • далекого типу - 48-розрядний логічна адреса, що складається з двох частин: 16-розрядної сегментної частини - селектора, і 32-розрядного зсуву.

  • Ланцюжок - представляє собою деякий безперервний набір байтів, слів або подвійних слів максимальної довжини до 4 Гбайт.

  • Бітове поле являє собою безперервну послідовність біт, в якій кожен біт є незалежним і може розглядатися як окрема змінна. Бітове поле може починатися з будь-якого біта будь-якого байта і містити до 32 біт.

  • Неупакованих двійково-десятковий тип - байтове подання десяткового цифри від 0 до 9. Неупаковані десяткові числа зберігаються як байтові значення без знака по одній цифрі в кожному байті. Значення цифри визначається молодшим полубайта.

  • Упакований двійково-десятковий тип являє собою упаковане представлення двох десяткових цифр від 0 до 9 в одному байті. Кожна цифра зберігається в своєму полубайте. Цифра в старшому полубайте (біти 4-7) є старшою.

Рис. 4. Основні логічні типи даних мікропроцесора

Мова мікрооперацій. Асемблер.

Структура програми на асемблері:

Model small; модель програми, або ж кількість пам'яті на сегмент

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

; Опис змінних

. Stack 100 h ; Сегмент стека

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

; Процедури, макрокоманди

main:

; Основна програма

end main

Директиви резервування пам'яті

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

Машинного еквівалента цих директив немає; просто транслятор, обробляючи кожну таку директиву, виділяє необхідну кількість байт пам'яті і при необхідності ініціалізує цю область деяким значенням.

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

Рис. 5. Директиви опису даних простих типів

На рис. 5 використані наступні позначення:

  • ? Показує, що вміст поля не визначено, тобто при завданні директиви з таким значенням вираження вміст виділеної ділянки фізичної пам'яті змінюватися не буде. Фактично, створюється неініціалізованих мінлива;

  • значення ініціалізації - значення елементу даних, яке буде занесено в пам'ять після завантаження програми. Фактично, створюється ініціалізований змінна, в якості якої можуть виступати константи, рядки символів, константні та адресні вираження в залежності від типу даних. Детальна інформація наведена у додатку 1;

  • вираз - ітеративна конструкція з синтаксисом, описаним на рис. 5.17. Ця конструкція дозволяє повторити послідовне занесення в фізичну пам'ять вирази в дужках n разів.

  • ім'я - деяке символічне ім'я мітки або комірки пам'яті в сегменті даних, що використовується в програмі.

  • db - резервування пам'яті для даних розміром 1 байт. Директивою db можна задавати такі значення:

    • вираз або константу, приймаючу значення з діапазону:

      • для чисел зі знаком -128 ... +127;

      • для чисел без знака 0 ... 255;

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

  • dw - резервування пам'яті для даних розміром 2 байти. Директивою dw можна задавати такі значення:

    • вираз або константу, приймаючу значення з діапазону:

      • для чисел зі знаком -32 768 ... 32 767;

      • для чисел без знака 0 ... 65 535;

    • вираз, що займає 16 або менше біт, в якості якого може виступати зміщення в 16-бітовому сегменті або адреса сегмента;

    • 1 - або 2-байтове рядок, укладена в лапки.

  • dd - резервування пам'яті для даних розміром 4 байти. Директивою dd можна задавати такі значення:

    • вираз або константу, приймаючу значення з діапазону:

      • для i386 і вище:

        • для чисел зі знаком -2147483648 ... +2 147 483 647;

        • для чисел без знака 0 ... 4294967295;

    • відносне або адресне вираз, що складається з 16-бітового адреси сегмента і 16-бітового зсуву;

    • рядок довжиною до 4 символів, укладену в лапки.

  • df - резервування пам'яті для даних розміром 6 байт;

  • dp - резервування пам'яті для даних розміром 6 байт. Директивами df і dp можна задавати такі значення:

    • вираз або константу, приймаючу значення з діапазону:

        • для чисел зі знаком -2147483648 ... +2 147 483 647;

        • для чисел без знака 0 ... 4294967295;

    • відносне або адресне вираз, що складається з 32 або менше біт (для i80386) або 16-менш біт (для молодших моделей мікропроцесорів Intel);

    • адресний вираз, що складається з 16-бітового сегмента і 32-бітового зсуву;

    • рядок довжиною до 6 байт, укладену в лапки.

  • dq - резервування пам'яті для даних розміром 8 байт. Директивою dq можна задавати такі значення:

    • відносне або адресне вираз, що складається з 32 або менше біт

    • константу зі знаком з діапазону -2 63 ... 2 63-1;

    • константу без знака з діапазону 0 ... 2 64-1;

    • рядок довжиною до 8 байт, укладену в лапки.

  • dt - резервування пам'яті для даних розміром 10 байт. Директивою dt можна задавати такі значення:

    • відносне або адресне вираз, що складається з 32 або менше біт

    • адресний вираз, що складається з 16-бітового сегмента і 32-бітового зсуву;

    • константу зі знаком з діапазону -2 79 ... 2 79-1;

    • константу без знака з діапазону 0 ... 2 80-1;

    • рядок довжиною до 10 байт, укладену в лапки;

    • упаковану десяткову константу в діапазоні 0 ... 99 999 999 999 999 999 999.

Дуже важливо усвідомити собі порядок розміщення даних у пам'яті. Він безпосередньо пов'язаний з логікою роботи мікропроцесора з даними. Мікропроцесори Intel вимагають проходження даних в пам'яті за принципом: молодший байт по молодшому адресою.

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

Лістинг 1. Приклад використання директив резервування та ініціалізації даних. Програма вводить рядок з клавіатури.

model small

. Stack 100 h

. Data

message db 'Масив байт, що містять символьні змінні', 10,13 '$'

po db 1, 3, 4, 5, 0fh, 0bh, 32, 01011b

perem_1 db 0ffh

perem_2 dw 3a7fh

perem_3 dd 0f54d567ah

k1 db 10

k2 db?

mas db 10 dup ('?')

adr dw k1

adr_full dd perem_3

. Code

start:

mov ax, @ data

mov ds, ax

mov ah, 0ah

mov dx, offset message; mov dx, adr

int 21h

mov ax, 4c00h

int 21h

end start

Система команд

Формат пропозиції асемблера

[Ім'я мітки:] КОП [операнд1] [, операнд2] [; коментарі]

Команди пересилання даних

mov <Операнд призначення>, <операнд-джерело>

можна

Не можна

Повинно бути

mov ах, вх; ах: = вх

mov ах, 0а2 h; ах: = 0а2 h

mov per1, ax

mov ax, bh

mov per1, per2


mov ds, per1


mov cs, ds


mov cs, ax; пара cs: ip містить адреса наступної команди

mov ah, bh

mov al, per2

mov per1, al

mov ax, per1

mov ds, ax

mov ax, ds або push ds

mov cs, ax pop cs


xchg <операнд1>, <операнд2>; двонаправлений обмін даними а: = в; в: = с; з: = а

xchg dl, dh; міняє місцями дані

Команди вводу-виводу в порт

in акумулятор, номер_порту - введення в акумулятор з порту

out порт, акумулятор - виведення вмісту акумулятора в порт

Команди роботи з адресами і покажчиками пам'яті

lea призначення, джерело - завантаження ефективного адреси джерела в регістр-призначення;

lea dx, x; аналогічно команді mov dx, offset x

lds призначення, джерело - завантаження ефективного адреси джерела в регістр призначення та завантаження покажчика (адреса сегмента де міститься джерело) в регістр сегменту даних ds;

les призначення, джерело --//- регістр додаткового сегменту даних es;

lgs призначення, джерело - - / / - регістр додаткового сегменту даних gs;

lfs призначення, джерело - - / / - регістр додаткового сегменту даних fs;

lss призначення, джерело - - / / - регістр сегмента стека ss.

les dx, per1; повний покажчик на per1 в пару es: dx

Команди роботи зі стеком

Для роботи зі стеком призначені три регістра:

ss - сегментний регістр стека;

sp / esp - регістр покажчика стека;

bp / ebp - регістр покажчика бази кадру стека.

push джерело - запис значення джерело у вершину стека.

Алгоритм роботи:

  • зменшити значення покажчика стека esp / sp на 4 / 2 (в залежності від значення атрибута розміру адреси - use16 або use32);

  • записати джерело у вершину стека (адресованих парою ss: esp / sp).

Розмір записуваних значень - слово або подвійне слово. Також в стек можна записувати безпосередні значення. В стек можна класти значення сегментного регістра cs. Інший цікавий момент пов'язаний з регістром sp. Команда push esp / sp записує в стек значення esp / sp станом до видачі цієї команди

Команда push використовується спільно з командою pop для запису значень в стек і вилучення їх із стека

pop призначення - запис значення з вершини стека за місцем, вказаним операндом призначення. Значення при цьому "знімається" з вершини стека.

Push ax

Push bx

push cx

...

pop cx

pop bx

pop ax

push ax

pop bx; аналогічно команді mov bx, ax

push a - розміщення в стеку регістрів загального призначення в такій послідовності: ax, cx, dx, bx, sp, bp, si, di

push ad - розміщення в стеку регістрів загального призначення в такій послідовності: eax, ecx, edx, ebx, esp, ebp, esi, edi

pushf - розміщення у вершині стека (ss: sp) вмісту регістра прапорів flags

pushfd - розміщення в стеку вмісту регістра прапорів eflags.

p opa - Вилучення з стека регістрів загального призначення di, si, bp, sp, bx, dx, cx, ax

p opad - витяг з стека регістрів загального призначення edi, esi, ebp, esp, ebx, edx, ecx, eax

p opf - витяг з стека слова і відновлення його в регістр прапорів flags

p opfd - витяг з стека подвійного слова і відновлення його в регістр прапорів eflags

Організація обчислень

Логічні команди

Будь-яка логічна команда змінює значення наступних прапорів of, sf, zf, pf, cf (переповнення, знак, нуля, паритет, перенесення)

and операнд_1, операнд_2 - операція логічного множення (І - сполучення).

оп 1: = оп 1 липні оп 2

and ah, 0a1h; ah: = ah 7 0ah

and bx, cx; bx: = bx 7 cx

and dx, x1; dx: = dx 7 x1

or операнд_1, операнд_2 - операція логічного додавання (АБО - диз'юнкцію)

or al, x1; оп 1: = оп 1 & оп 2

or eax, edx

or dx, x1

xor операнд_1, операнд_2 - операція логічного виключає складання (виключає АБО АБО-НЕ)

test операнд_1, операнд_2 - операція "перевірити" (способом логічного множення).

Команда виконує поразрядно логічну операцію І над бітами операндів операнд_1 і операнд_2. Стан операндів залишається тим самим, змінюються лише прапори zf, sf, і pf, що дає можливість аналізувати стан окремих бітів операнда без зміни їх стану.

not операнд - операція логічного заперечення. Команда виконує поразрядное інвертування (заміну значення на протилежне) кожного біта операнда. Результат записується на місце операнда.

Приклад програми логічного складання двох однобайтовим чисел.

model small

. Stack 100h

. Data

x1 db 0c2h

x2 db 022h

y db?

. Code

start:

mov ax, @ data

mov ds, ax

mov al, x1

or al, x2

mov y, al

mov ax, 4c00h

int 21 h

end start

Арифметичні операції над цілими двійковими числами

Додавання двійкових чисел без знаку

inc операнд - операція інкремента, тобто збільшення значення операнда на 1;

inc ax; ax: = ax +1

inc x1

add ОП1, ОП2 - команда складання з принципом дії: ОП1 = ОП1 + ОП2 (addition)

add al, bl

add ax, 0fe2h

add ebx, x1 +2

add x1, 0fh

add x 2, ax

adc ОП1, ОП2 - команда складання з урахуванням прапора перенесення cf. ОП1 = ОП1 + ОП2 + знач_cf

Віднімання двійкових чисел без знаку

dec операнд - операція декремента, тобто зменшення значення операнда на 1;

dec cx; cx: = cx-1

dec x

sub операнд_1, операнд_2 - команда вирахування; її принцип дії:

операнд_1 = операнд_1 - операнд_2

sub al, bl; al: = al - bl

sub ax, x1

sub x2, dx

sub eax, 0f35h

sub x2, 22h

sbb операнд_1, операнд_2 - команда вирахування з урахуванням позички (прапора cf):

операнд_1 = операнд_1 - операнд_2 - значеніе_cf

Приклад програми складання двох однобайтовим чисел.

model small

. Stack 100h

. Data

x1 db 0c2h

x2 db 022h

y db?

. Code

start:

mov ax, @ data

mov ds, ax

mov al, x1

add al, x2

mov y, al

mov ax, 4c00h

int 21 h

end start

Множення двійкових чисел

mul множітель_1 - операція множення двох цілих чисел без урахування знака

Алгоритм роботи:

Команда виконує множення двох операндів без урахування знаків. Алгоритм залежить від формату операнда команди і вимагає явного вказівки місцеположення тільки одного співмножники, який може бути розташований в пам'яті або в регістрі. Розташування друге сомножителя фіксоване і залежить від розміру першого співмножники

mul dl; ax: = al * dl, dl - множітель_1, al - множітель_2

mul x 1; dx: ax = ax * 0 ad 91 h, x 1 word - множітель_1   , Ax - множітель_2

mul ecx; edx: eax = eax * ecx, ecx - множітель_1   , Eax - множітель_2

imul множітель_1 - операція множення двох цілочисельних двійкових значень зі знаком

Розподіл двійкових чисел

div дільник - виконання операції ділення двох двійкових беззнакових значень

Алгоритм роботи:

Для команди необхідно завдання двох операндів - діленого і дільника. Ділене задається неявно і розмір його залежить від розміру дільника, який вказується в команді

div dl; ah: al = ax / dl, ax-ділене, dl - дільник, ah-приватне, al-залишок

div x 1; ax: dx = dx: ax / 0 ad 91 h, dx: ax-ділене, x 1 word - дільник, ax-приватне,

; Dx-залишок

div ecx; eax: edx = edx: eax / ecx, edx: eax-ділене, ecx - дільник, eax-приватне,

; Edx-залишок

idiv дільник - операція ділення двох двійкових значень зі знаком

Приклад програми множення двох однобайтовим чисел.

model small

. Stack 100h

. Data

x1 db 78

yl db?

yh db?

. Code

start:

mov ax, @ data

mov ds, ax

xor ax, ax

mov al, 25

mul x 1

jnc m 1; якщо немає переповнювання

mov yh, ah

m1:

mov yl, al

mov ax, 4c00h

int 21h

end start

Приклад. Обчисліть такий вираз у = (х2-х3) / х1, х1, х2, х3 - однобайтні числа

model small

. Stack 100h

. Data

s1 db 'Введіть х 1 ', 10,13,' $ '

s 2 db 'Введіть х2', 10,13, '$'

s 3 db 'Введіть х3', 10,13, '$'

x 1 db?

x 2 db?

yc db? ; Приватне

yo db? ; Залишок

. Code

start:

mov ax, @ data

mov ds, ax


mov ah, 09h

mov dx, offset s1

int 21 h; висновок рядка

mov ah, 01 h вводимо х1

int 21 h; вводимо число

sub al, 30 h; al: = x 1

mov x1, al

mov ah, 09h

mov dx, offset s2

int 21h

mov ah, 01 h вводимо х2

int 21 h

sub al, 30h; al: = x2

mov x2, al

mov ah, 09h

mov dx, offset s3

int 21h

mov ah, 01h вводимо х 3

int 21h

sub al, 30h; al: = x3


mov bl, x2; bl: = x2

sub bl, al; bl: = x2-x3

xchg al, bl; al: = bl, al: = x2-x3

xor ah, ah; ax: = x2-x3 обчислюємо у

mov dl, x1; dl: = x1

div dl; ax / dl, ax/x1

mov yc, ah

mov yo, al

; Можна вивести результат на екран

mov ax, 4 c 00 h

int 21h

end start

Команди зсуву

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

Усі команди зсуву встановлюють прапор переносу cf.

shl операнд, счетчік_сдвігов (Shift Logical Left) - логічний зсув вліво. Вміст операнда зсувається вліво на кількість бітів, що визначається значенням счетчік_сдвігов. Справа (в позицію молодшого біта) вписуються нулі;

shr операнд, счетчік_сдвігов - логічний зсув вправо.

Алгоритм роботи команд:

  • черговий "висувається" біт встановлює прапор cf;

  • біт, що вводиться в операнд з іншого кінця, має значення 0;

  • при зсуві чергового біта він переходить у прапор cf, при цьому значення попереднього зрушеного біта губиться!

sal операнд, счетчік_сдвігов (Shift Arithmetic Left)

sar операнд, счетчік_сдвігов

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

Команда sal не зберігає знака, але встановлює прапор cf у разі зміни знаку черговим висунутим бітом. В іншому команда sal повністю аналогічна команді shl;

Команда sar зберігає знак, відновлюючи його після зсуву кожного чергового біта.

Команди циклічного зсуву

rol операнд, лічильник _ зрушень (Rotate Left) - циклічний зрушення вліво.

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

ror операнд, счетчік_сдвігов (Rotate Right) - циклічний зсув вправо.

Як видно з рис., Команди простого циклічного зсуву в процесі своєї роботи здійснюють одну корисну дію, а саме: циклічно зрушується біт не тільки вдвигается в операнд з іншого кінця, але й одночасно його значення ставати значенням прапора cf.

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

rcl операнд, счетчік_сдвігов (Rotate through Carry Left) - циклічний зсув вліво через перенесення.

Вміст операнда зсувається вліво на кількість біт, що визначається операндом счетчік_сдвігов. Зсунути біти по черзі стають значенням прапора перенесення cf.

rcr операнд, счетчік_сдвігов (Rotate through Carry Right) - циклічний зсув вправо через перенесення.

Вміст операнда зсувається вправо на кількість біт, що визначається операндом счетчік_сдвігов. Зсунути біти по черзі стають значенням прапора перенесення cf.

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

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

Приклад. Дано негативне число. Виведіть на екран його значення за модулем поділене на 2.

Будь-яке від'ємне число зберігається в додатковому форматі

-1 Ffh

-2 Feh

...

-10 F 6 h

отримати значення числа по модулю, можна здійснивши логічне заперечення над числом і додавши 1.

model small

. Stack 100h

. Data

x db -12

. Code

start:

mov ax, @ data

mov ds, ax

mov al, x; в al від'ємне число

not al

inc al; число по модулю

shr al, 1

; Виводимо результат на екран

aam;

; Перетворення двійкового числа меншого 63h (99 10), яке знаходиться в al в його; неупакованих BCD-еквівалент

;-Розділити значення регістра al на 10;

;-Записати приватне в регістр ah, залишок - в регістр al.

mov dx, ax; число в регістр dx

or dx, 3030 h; отримую ASCII код числа

xchg dh, dl; міняю місцями старший і молодший байт, для виведення символу з dl

mov ah, 02 h;

int 21 h; виводжу старшу половинку числа

xchg dh, dl; міняю місцями старший і молодший байт,

int 21 h; виводжу молодшу половинку числа

mov ax, 4c00h

int 21h

end start

Команди передачі управління

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

1. Команди безумовної передачі керування:

- Команда безумовного переходу; jmp

- Виклику процедури і повернення з процедури; call, ret

- Виклику програмних переривань та повернення з програмних переривань. Int, iret

2. Команди умовної передачі управління:

- Команди переходу по результату команди порівняння cmp;

- Команди переходу за станом певного прапора;

- Команди переходу по вмісту регістру ecx / cx.

3. Команди управління циклом:

- Команда організації циклу з лічильником ecx / cx;

- Команда організації циклу з лічильником ecx / cx з можливістю дострокового виходу з циклу по додатковому умові.

jmp адрес_перехода - безумовний перехід без збереження інформації про точку повернення. Аналог goto.

jmp m 1 m 4:

... ...

m 1: jmp m 4

Умовні переходи

Команди умовного переходу мають однаковий синтаксис:

jcc метка_перехода

Мнемокод всіх команд починається з "j" - від слова jump (стрибок), cc - визначає конкретна умова, аналізоване командою. Що стосується операнда метка_перехода, то ця мітка може знаходиться лише в межах поточного сегмента коду, міжсегментний передача управління в умовних переходах не допускається.

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

      • будь-яка команда, що змінює стан арифметичних прапорів;

      • команда порівняння cmp, що порівнює значення двох операндів;

      • стан регістра ecx / cx.

Умовні переходи по вмісту прапорів

Назва прапора

Номер біта в eflags / flag

Команда умовного переходу

Значення прапора для здійснення переходу

Прапор переносу cf

1

jc

cf = 1

Прапор парності pf

2

jp

pf = 1

Прапор нуля zf

6

jz

zf = 1

Прапор знака sf

7

js

sf = 1

Прапор переповнення of

11

jo

of = 1

Прапор переносу cf

1

jnc

cf = 0

Прапор парності pf

2

jnp

pf = 0

Прапор нуля zf

6

jnz

zf = 0

Прапор знака sf

7

jns

sf = 0

Прапор переповнення of

11

jno

of = 0

jcxz метка_перехода (Jump if cx is Zero) - перехід, якщо cx нуль;

jecxz метка_перехода (Jump Equal ecx Zero) - перехід, якщо ecx нуль.

Приклад програми: визначте, чи рівні два числа вводяться користувачем з клавіатури.

model small

. Stack 100h

. Data

s1 db 'числа дорівнюють $ '

s2 db 'числа не рівні $'

. Code

start:

mov ax, @ data

mov ds, ax

mov ah, 01 h

int 21 h; ввели перше число

mov dl, al

mov ah, 01h

int 21 h; ввели друге число

sub al, dl; порівняли числа

jnz m1

mov dx, offset s1

jmp m2

m1: mov dx, offset s2

m 2: mov ah, 09 h

int 21 h; виводимо інформаційну рядок

mov ax, 4 c 00 h

int 21h

end start

Команда порівняння cmp

cmp операнд_1, операнд_2 - порівнює два операнда і за результатами порівняння встановлює прапори. Команда порівняння cmp має цікавий принцип роботи. Він абсолютно такий же, як і у команди віднімання sub. Єдине, чого вона не робить - це запис результату віднімання на місце першого операнда.

Алгоритм роботи:

-Виконати віднімання (операнд1-операнд2);

-В залежності від результату встановити прапори, операнд1 і операнд2 не змінювати (тобто результат не запам'ятовувати).

Умовні переходи після команд порівняння

Типи операндів

Мнемокод команди умовного переходу

Критерій умовного переходу

Значення прапорів для осществленія переходу

Будь-які

je

операнд_1 = операнд_2

zf = 1

Будь-які

jne

операнд_1 <> операнд_2

zf = 0

Зі знаком

jl / jnge

операнд_1 <операнд_2

sf <> of

Зі знаком

jle / jng

операнд_1 <= операнд_2

sf <> of or zf = 1

Зі знаком

jg / jnle

операнд_1> операнд_2

sf = of and zf = 0

Зі знаком

jge / jnl

операнд_1 => операнд_2

sf = of

Без знака

jb / jnae

операнд_1 <операнд_2

cf = 1

Без знака

jbe / jna

операнд_1 <= операнд_2

cf = 1 or zf = 1

Без знака

ja / jnbe

операнд_1> операнд_2

cf = 0 and zf = 0

Без знака

jae / jnb

операнд_1 => операнд_2

cf = 0

Приклад програми: визначте, чи рівні два числа вводяться користувачем з клавіатури.

model small

. Stack 100h

. Data

s1 db 'числа дорівнюють $ '

s2 db 'числа не рівні $'

. Code

start:

mov ax, @ data

mov ds, ax

mov ah, 01 h

int 21 h; ввели перше число

mov dl, al

mov ah, 01h

int 21 h; ввели друге число

cmp al, dl; порівняли числа

jne m1

mov dx, offset s1

jmp m2

m1: mov dx, offset s2

m 2: mov ah, 09 h

int 21 h; виводимо інформаційну рядок

mov ax, 4 c 00 h

int 21h

end start

Організація циклів

loop метка_перехода (Loop) - повторити цикл

Робота команди полягає у виконанні наступних дій:

- Декремента регістру ecx / cx;

- Порівняння регістру ecx / cx з нулем:

- Якщо (ecx / cx)> 0, то управління передається на мітку переходу;

- Якщо (ecx / cx) = 0, то управління передається на наступну після loop команду

mov cx, кількість циклів

м1: тіло циклу

loop m 1

loope / loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) - повторити цикл, поки cx <> 0 або zf = 0.

loopne / loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag = 0) - повторити цикл поки cx <> 0 або zf = 1

Недолік команд організації циклу loop, loope / loopz і loopne / loopnz в тому, що вони реалізують тільки короткі переходи (від -128 до +127 байт).

Організація вкладених циклів

mov c х, n; в сх заносимо кількість ітерацій зовнішнього циклу

m 1:

push cx

...

mov cx, n 1, у сх заносимо кількість ітерацій внутрішнього циклу

m 2:

тіло внутрішнього циклу

loop m 2

...

pop cx

loop m 1

Приклад програми: Напишіть програму підрахунку у = 1 +2 +3 + ... + n, n не більше 10000.

model small

. Stack 100h

. Data

yb dd?

ym dw?

s1 db 'введіть n', 10,13, '$'

. Code

start:

mov ax, @ data

mov ds, ax

mov dx, offset s1

mov ah, 09h

int 21h

mov cx, 3

m: shl bx, 4

mov ah, 01 h

int 21 h вводимо n в регістр bx

sub ax, 130h

add bx, ax

loop m

mov cx, bx

xor dx, dx

xor al, al

m 1: add dx, cx вважаємо у

jnc m2

mov al, 1

m2: loop m1

cmp al, 1

je m3

mov ym, dx

m3: mov yb, edx

mov ax, 4c00h

int 21 h

end start

Ланцюгові команди

(Команди обробки рядків символів)

Ланцюжок - це послідовність елементів, розмір яких може бути байт, слово, подвійне слово. Вміст цих елементів може бути будь-яке - символи, числа.

У системі команд мікропроцесора є сім операцій-примітивів обробки ланцюжків.

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

Разом з цепочечних командами зазвичай застосовують префікси повторень, які ставляться перед командою в полі [мітки]. Цепочечная команда без префікса виконується один раз. З префіксом цепочечниє команди виконуються циклічно.

rep (REPeat) - команда виконується, поки вміст в ecx / cx не стане рівним 0. При цьому Цепочечная команда, перед якою стоїть префікс, автоматично зменшує вміст ecx / cx на одиницю. Та ж команда, але без префікса, цього не робить.

repe або repz (REPeat while Equal or Zero) - команда виконується до тих пір, поки вміст ecx / cx не дорівнює нулю або прапор zf дорівнює 1. Як тільки одне з цих умов порушується, управління передається наступній команді програми

repne або repnz (REPeat while Not Equal or Zero) - команда циклічно виконується до тих пір, поки вміст ecx / cx не дорівнює нулю або прапор zf дорівнює нулю. При невиконанні однієї з цих умов робота команди припиняється.

Формування фізичної адреси операндів адрес_істочніка і адрес_пріемніка відбувається наступним чином:

адрес_істочніка - пара ds: esi / si;

адрес_пріемніка - пара es: edi / di

Важливий момент, що стосується всіх цепочечних команд, - це напрям обробки ланцюжка. Є дві можливості:

- Від початку ланцюжка до її кінця, тобто в напрямку зростання адрес;

- Від кінця ланцюжка до початку, тобто в напрямку зменшення адрес.

Ланцюгові команди самі виконують модифікацію регістрів, що адресують операнди, забезпечуючи тим самим автоматичне просування по ланцюжку. Кількість байт, на які ця модифікація здійснюється, визначається кодом команди. А ось знак цієї модифікації визначається значенням прапора напрямки df (Direction Flag) в регістрі eflags / flags. Станом прапора df можна керувати за допомогою двох команд, які не мають операндів:

cld (Clear Direction Flag) - очистити прапор напрямку df = 0, значення індексних регістрів esi / si і edi / di буде автоматично збільшуватися (операція інкремента) цепочечних командами, тобто обробка буде здійснюватися в напрямку зростання адрес;

std (Set Direction Flag) - встановити прапор напрямку df = 1, то значення індексних регістрів esi / si і edi / di буде автоматично зменшуватися (операція декремента) цепочечних командами, тобто обробка буде йти в напрямку зменшення адрес.

Типовий набір дій для виконання будь-якої цепочечной команди:

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

  • Завантажити покажчики на адреси ланцюжків у пам'яті в пари регістрів ds: (e) si і es: (e) di.

  • Завантажити в регістр ecx / cx кількість елементів, що підлягають обробці.

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

Пересилання ланцюжків

movs адрес_пріем, адрес_істочніка (MOVe String) - переслати ланцюжок;

movsb MOVe String Byte) - переслати ланцюжок байт;

movsw (MOVe String Word) - переслати ланцюжок слів;

movsd (MOVe String Double word) - переслати ланцюжок подвійних слів.

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

Для ланцюгових команд з операндами типу movs адрес_пріемніка, адрес_істочніка, не існує машинного аналога. При трансляції в залежності від типу операндів транслятор перетворює її в одну з трьох машинних команд: movsb, movsw або movsd.

Сама по собі команда movs пересилає тільки один елемент, виходячи з його типу, і модифікує значення регістрів esi / si і edi / di. Якщо перед командою написати префікс rep, то однією командою можна переслати до 64 Кбайт даних. Число пересилаються елементів має бути додано в лічильник - регістр cx (use16) або ecx (use32).

Приклад проги. Пересилання рядків командою movs

MODEL small

STACK 256

. Data

source db 'Тестована рядок','$'; рядок - джерело

dest db 19 DUP (''); рядок - приймач

. Code

mai n:

mov ax, @ data; завантаження сегментних регістрів

mov ds, ax; налаштування регістрів DS і ES на адресу сегменту даних

mov es, ax

cld; скидання прапора DF - обробка рядка від початку до кінця

lea si, source; завантаження в si зсуву рядка-джерела

lea di, dest; завантаження в DS зсуву рядка-приймача

mov cx, 20; для префікса rep - лічильник повторень (довжина рядка)

rep movs dest, source; пересилання рядки

lea dx, dest

mov ah, 09h; висновок на екран рядка-приймача

int 21h

mov ax, 4c00h

int 21h

end main

Операція порівняння ланцюжків

cmps адрес_пріемніка, адрес_істочніка (CoMPare String) - порівняти рядки;

cmpsb (CoMPare String Byte) - порівняти рядок байт;

cmpsw (CoMPare String Word) - порівняти рядок слів;

cmpsd (CoMPare String Double word) - порівняти рядок подвійних слів.

Алгоритм роботи команди cmps полягає в послідовному виконанні віднімання (елемент ланцюжка-джерела - елемент ланцюжка-одержувача) над черговими елементами обох ланцюжків. Принцип виконання вирахування командою cmps аналогічний команді порівняння cmp. Вона, так само, як і cmp, виробляє віднімання елементів, не записуючи при цьому результату, і встановлює прапори zf, sf та of.

Після виконання вирахування чергових елементів ланцюжків командою cmps, індексні регістри esi / si і edi / di автоматично змінюються відповідно до значення прапора df на значення, рівне розміром елемента порівнюваних ланцюжків.

Щоб змусити команду cmps виконуватися кілька разів, тобто робити послідовне порівняння елементів ланцюжків, необхідно перед командою cmps визначити префікс повторення. З командою cmps можна використовувати префікс повторення repe / repz або repne / repnz:

  • repe або repz - якщо необхідно організувати порівняння до тих пір, поки не буде виконана одна з двох умов: досягнення кінця ланцюжка (вміст ecx / cx дорівнює нулю) або в ланцюжках зустрілися різні елементи (прапор zf став дорівнює нулю);

  • repne або repnz - якщо потрібно проводити порівняння до тих пір, поки: не буде досягнутий кінець ланцюжка (вміст ecx / cx дорівнює нулю) або в ланцюжках зустрілися однакові елементи (прапор zf став дорівнює одиниці).

Приклад програми Порівняння двох рядків командою cmps

MODEL small

STACK 256

. Data

sov db 0ah, 0dh, 'Строки збігаються .','$'

nesov db 0ah, 0dh, 'Рядки не збігаються','$'

s1 db '0123456789 ', 0ah, 0dh ,'$'; досліджувані рядки

s2 db 10

s3 db 11 dup (0)

. Code

main:

mov ax, @ data; завантаження сегментних регістрів

mov ds, ax

mov es, ax; настройка ES на DS

; Вводимо рядок

mov ah, 0 а h

mov dx, offset s2

int 21 h

; Пошук співпадаючих елементів, скидання прапора DF - порівняння в напрямку зростання адрес

cld

lea si, s1; завантаження в si зміщення string1

lea di, s 3; завантаження в di зміщення string 2

mov cx, 10; довжина рядка для префікса repe

repe cmpsb; порівняння рядків (поки порівнювані елементи рядків рівні)

; Вихід у разі виявлення співпала елемента

jcxz equal; cx = 0, тобто рядки збігаються

lea dx, nesov

jmp exit; вихід

equal: lea dx, sov

exit: mov ah, 09h

int 21h; висновок повідомлення

mov ax, 4 c 00 h

int 21 h

end main; кінець програми

Операція сканування ланцюжків

scas адрес_пріемніка (SCAning String) - сканувати ланцюжок;

scasb (SCAning String Byte) - сканувати ланцюжок байт;

scasw (SCAning String Word) - сканувати ланцюжок слів;

scasd (SCAning String Double Word) - сканувати ланцюжок подвійних слів

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

(Вміст регістра_аккумулятора - вміст очередного_элемента_цепочки).

У залежності від результатів віднімання проводиться установка прапорів, при цьому самі операнди не змінюються.

Так само, як і у випадку команди cmps, з командою scas зручно використовувати префікси repe / repz або repne / repnz:

      • repe або repz - якщо потрібно організувати пошук до тих пір, поки не буде виконана одна з двох умов: досягнення кінця ланцюжка (вміст ecx / cx дорівнює 0) або в ланцюжку зустрівся елемент, відмінний від елемента в регістрі al / ax / eax;

      • repne або repnz - якщо потрібно організувати пошук до тих пір, поки не буде виконана одна з двох умов досягнення кінця ланцюжка (вміст ecx / cx дорівнює 0) або в ланцюжку зустрівся елемент, що співпадає з елементом в регістрі al / ax / eax.

Приклад проги. знайти кількість * в рядку

MODEL small

STACK 256

. Data

s1 db 20

s 2 db 21 dup?

s3 db 'кількість * в стрічці', 0ah, 0dh, '$'

. Code

main:

mov ax, @ data

mov ds, ax

mov es, ax; настройка ES на DS

; Вводимо рядок

mov ah, 0ah

mov dx, offset s1

int 21 h

; Пошук *

mov al, '*'; символ для пошуку - `а` (кирилиця)

cld ; Скидання прапора df

lea di, s2; завантаження в es: di зсуву рядка

inc di; перший елемент у s 3 це кількість введених символів, його ігноруємо

xor bl; Обнуляємо лічильник зірочок

mov cx, 20; для префікса repne - довжина рядка

m 1: repne scas b; поки шуканий символ і символ у рядку не співпадуть йде пошук,; вихід при збігу

je found; якщо рівні - перехід на обробку

; Виведення кількості зірочок в рядку

mov ah, 09 h

mov dx, offset s3

int 21h; висновок повідомлення nochar

mov al, bl

aam

or ax, 3030h

mov dx, ax

xchg dh, dl

mov ah, 02h

int 21h

xchg dh, dl

int 21h

mov ax, 4c00h

int 21h

; Підсумовуємо кількість зірочок

found: inc bl

jmp m 1

end main

Завантаження елемента ланцюжка в акумулятор

lods адрес_істочніка (LOaD String) - завантажити елемент з ланцюжка в регістр-акумулятор al / ax / eax;

lodsb (LOaD String Byte) - завантажити байт з ланцюжка в регістр al;

lodsw (LOaD String Word) - завантажити слово з ланцюжка в регістр ax;

lodsd (LOaD String Double Word) - завантажити подвійне слово з ланцюжка в регістр eax.

Ця операція-примітив дозволяє витягти елемент ланцюжка і помістити його в регістр-акумулятор al, ax або eax. Цю операцію зручно використовувати разом з пошуком (скануванням) з тим, щоб, знайшовши потрібний елемент, витягти його (наприклад, для зміни).

Перенесення елемента з акумулятора в ланцюжок

stos адрес_пріемніка (STOre String) - зберегти елемент з регістра-акумулятора al / ax / eax в ланцюжку;

stosb (STOre String Byte) - зберегти байт з регістра al в ланцюжку;

stosw (STOre String Word) - зберегти слово з регістра ax в ланцюжку;

stosd (STOre String Double Word) - зберегти подвійне слово з регістра eax в ланцюжку.

Ця операція-примітив дозволяє провести дію, зворотне команді lods, тобто зберегти значення з регістра-акумулятора в елементі ланцюжка. Цю операцію зручно використовувати разом з операцією пошуку (сканування) scans і завантаження lods, з тим, щоб, знайшовши потрібний елемент, витягнути його в регістр і записати на його місце нове значення.

Складні структури даних

Одновимірні масиви

Всі елементи масиву розташовуються в пам'яті послідовно

Опис елементів масиву

mas db 1,2,3,4,5

mas dw 5 dup (0)

Доступ до елементів масиву

mov ax, mas [si]; в si номер елемента в масиві

mov mas [si], ax; в di номер елемента в масиві

Використовуючи команди i 486 можна використовувати адресацію з масштабуванням, при розмірі елементів більше байтів

Mov ax, mas [si * 2];

Приклад програми Знайти в рядку хоча б один нульовий елемент

model small

. Stack 100 h

. Data

bufer dw 25; формую розмір буфера для введення рядка

mas dw 25 dup (''); формую буфер

adr dw bufer; описую адресу

subj 1 db 'у рядку знайдений нульовий елемент', '$'

subj 2 db 'у рядку не знайдено нульовий елемент', '$'

. Code

main:

mov ax, @ data

mov ds, ax

mov ah, 0ah

mov dx, adr

int 21 h; введення рядка з клавіатури

; Пошук нульового елемента

xor si, si

mov cx, mas [si]; завантажуємо в сх кількість елементів у рядку

mov ax, 030 h; в ax завантажуємо ASCII код нуля

m1: inc si або inc si

inc si cmp ax, mas [si * 2]

cmp ax, mas [si]

je m 2; якщо в рядку знайдемо нульовий елемент, то виходимо з циклу на висновок subj 1

loop m 1

; Нормальний вихід з циклу означає що в рядку немає нульових елементів

mov ah, 09h

lea dx, subj2

int 21h

jmp exit

m2: mov ah, 09h

lea dx, subj1

int 21h

exit: mov ax, 4c00h

int 21 h

end main

Двовимірні масивів

! Спеціальних засобів для опису двовимірних масивів в асемблері немає!

Двовимірний масив описується також як і одновимірний масив, відмінність полягає у трактуванні розташування елементів. Нехай послідовність елементів трактується як двовимірний масив, розташований по рядках, тоді адресу елемента [i, j] обчислюється так

База + коліч_елем_строке * размер_елем * I + j

Для визначення бази використовують ім'я масиву, для другого доданка регістр bx, для третього si, це базово-індексна адресація.

Опис масиву:

Mas 1 db 10 dup (3 dup (?))

Mas 2 db 1,2,3,4,5

3,4,5,6,7

4,7,9,2,0

Приклад пошуку максимального елемента в кожному рядку однобайтное масиву mas, розміром 5 * 10, з занесенням максимальних елементів в масив max (1 * 5). Ініціалізацію масиву mas розглядати не будемо.

...

xor di, di; Обнуляємо індекси масиву max

xor bx, bx; Обнуляємо індекси рядків масиву mas

xor si, si; Обнуляємо індекси стовпців масиву mas

mov cx, 5; в cx кількість рядків, зовнішній цикл

m 1: push cx

mov cx, 10; в сх кількість стовпців, внутрішній цикл

mov al, mas [si + bx]; перший елемент з 1 рядка mas в аl

m 2: inc si

cmp al, mas [si + bx]; порівнюємо з наступним елем. рядки

jb m 3; якщо менше на m 3

mov al, mas [si + bx]; інакше в а l заносимо більший елемент

m 3: loop m 2; після виходу з циклу в ах максимальний елемент у цьому рядку

mov max [di], al; кладемо максимальний елемент в масив max

inc di

xor si, si; Обнуляємо номер стовпця

add bx, 10; переходимо на наступний рядок

pop cx; дістаємо сх

loop m 1

...

Структура - це тип даних, що складається з фіксованого числа елементів різного типу.

Для використання структур в програмі необхідно виконати три дії:

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

Синтаксис опису шаблону структури:

імя_структури STRUC

<Опис полів>; послідовність директив опису даних dd, dw, db ...

імя_структури ENDS

    1. Визначити примірник структури. Цей етап має на увазі ініціалізацію конкретної змінної заздалегідь визначеною (за допомогою шаблону) структурою. У даному випадку транслятору дається вказівка ​​виділити пам'ять і присвоїти цій області символічне ім'я.

Описати структуру в програмі можна тільки один раз, а визначити - скільки завгодно раз.

Визначення даних з типом структури має наступний вигляд:

[Ім'я змінної] імя_структури <[список значень]>

    1. Організувати звернення до елементів структури.

    Для того щоб послатися в команді на полі деякої структури, використовується такий вираз:

    имя_переменной.имя_поля_структуры,

    Фрагмент програми. Знайти зі списку студентів відмінника з усіх предметів.

    Model small

    .586 P

    Stud struc

    Name db 20 dup ('')

    Phisika db?

    Matem db?

    Stud ends

    . Data

    Bufer Stud <"",'','',''>; зарезервували порожню структуру

    S1 Stud <"Ivanov", '5 ', '5', '5 '>

    S2 Stud <"Petrov", '3 ', '3', '3 '>

    S3 Stud <"Сидоров", '5 ', '2', '5 '>

    ...

    mov bx, offset s1

    mov al, [bx]. Phisika

    cmp al, '5 '

    jne m2

    mov al, [bx]. Matem

    cmp al, '5 '

    jne m 2

    ; Знайшли одного з відмінників, треба вивести його прізвище

    m 2: mov al, s 2. Phisika ; Шукаємо наступного відмінника

    mov ah, s2. Matem

    cmp ax, '55 '

    jne m 3

    ; Знайшли одного з відмінників, треба вивести його прізвище

    m 3:; шукаємо наступного відмінника

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

    Опис об'єднань у програмі нагадує опис структур, тобто спочатку описується шаблон, в якому за допомогою директив опису даних перераховуються імена і типи полів:

    імя_об'едіненія UNION

    <Опис полів>

    імя_об'едіненія ENDS

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

    Model small

    .586 P

    st union

    stu1 dw?

    stu2 db?

    stu3 dd?

    st ends

    . Data

    q st <>; пусте об'єднання

    z st <12 ffh>; заповнили об'єднання значенням

    ...

    mov q. stu 2, al; в змінну поклали вміст регістра al

    mov q.stu3, edx

    mov bx, z.stu1

    mov dx, offset q. stu 1

    Запис - структурний тип даних, що складається з фіксованого числа елементів довжиною від одного до кількох біт. При описі запису для кожного елемента вказується його довжина в бітах і, що необов'язково, деяке значення. Сумарний розмір запису визначається сумою розмірів її полів і не може бути більше 8, 16 або 32 біт. Якщо сумарний розмір запису менше зазначених значень, то всі поля запису "притискаються" до молодших розрядів

    Використання записів у програмі, так само, як і структур, організується в три етапи:

    1. Опис шаблону запису

    імя_запісі RECORD <опис елементів>

    2. Для використання шаблону запису в програмі необхідно визначити змінну з типом цього запису, для чого застосовується така синтаксична конструкція (рис. 7):

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

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

        • розмір елемента запису в бітах можна дізнатися за допомогою оператора width;

        • оператор mask дозволяє локалізувати біти потрібного елемента запису;

        • всі дії з перетворення елементів записи проводяться за допомогою логічних команд;

        • команда setfield встановлює значення деякого поля запису

    setfield імя_елемента_запісі регістр_ призначення, регістр_істочнік

        • команда getfield здійснює вибірку деякого поля запису

    getfield імя_елемента_запісі регістр_назначеніе, регістр_ джерело

    Процедури. Дії

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

    Опис процедури може розміщується в будь-якому місці програми, але таким чином щоб на неї випадковим чином не потрапило управління:

        • на початку програми, до першої виконуваної команди;

        • в кінці, після команди повертає керування операційній системі;

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

        • в іншому модулі.

    Синтаксис опису процедури:

    Імя_процедури PROC заголовок

    Команди, директиви тіло процедури

    [Ret] повернення з процедури

    [Імя_процедури] ENDP кінець процедури

    Виклик процедури здійснюється командою

    CALL [модифікатор] імя_процедури

    Команда call передає управління за адресою із символічною адресою імя_процедури, із збереженням в стеку адреси повернення, команди наступного після команди call.

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

    RET [число]

    Команда ret зчитує адреса повернення з стека і завантажує його в регістри cs і ip / eip, повертаючи таким чином управління команді, наступної за командою call. Число - необов'язковий параметр, що позначає кількість елементів, що видаляються з стека при поверненні з процедури. Розмір елемента залежить від використовуваної моделі сегментації 32 або 16 розрядної.

    Передача аргументів з / в процедуру може здійснюватися через регістри, змінні або стік.

    Приклад.

    Model small

    . Stack 100h

    . Data

    w db 25 dup (?)

    . Code

    vvod proc

    mov ah, 0ah

    lea dx, w

    int 21h

    ret

    vvod endp

    main:

    ...

    Call schet

    Call vvod

    ...

    exit:

    mov ax, 4c00h

    int 21h

    schet proc

    ..

    ret

    schet endp

    end main

    Макрокоманда є одним з багатьох механізмів заміни тексту програми. За допомогою дії в текст програми можна вставляти послідовності рядків і прив'язувати їх до місця вставки.

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

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

    Імя_макрокоманди MACRO [список_формальных_аргументов]

    <Тіло макровизначеннями>

    ENDM

    Існує три варіанти розташування макроозначень:

        • на початку вихідного тексту програми до сегмента коду та даних з тим, щоб не погіршувати читабельність програми. У даному випадку дії будуть актуальні тільки в межах цієї програми;

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

    include ім'я_файлу

        • в макробібліотеке. Макробібліотека створюється в тому випадку, коли написані макроси використовуються практично у всіх програмах. Підключається бібліотека директивою include. Недолік цього і попереднього методів в тому, що у вихідний текст програми включаються абсолютно всі макровизначеннями. Для виправлення ситуації можна використовувати директиву purge, в якості операндів якій перераховуються дії, які не повинні включатися до тексту програми.

    Include macrobibl. inc; у вихідний текст програми будуть вставлені рядки з macrobibl. inc

    Purge outstr, exit; за винятком макроозначень outstr, exit

    Активізація макросу здійснюється наступним чином:

    Імя_макрокоманди спісок_ фактіческіх_ аргументів

    Model small

    Vivod macro rg

    Mov dl, rg

    Mov ah, 02h

    Int 21h

    endm

    . Data

    ..

    . Code

    ..

    vivod al

    ..

    Model small

    sravnenie macro rg, met

    cmp rg, 'a'

    ja met

    add rg, 07h

    met: add rg, 30h

    endm

    . Data

    ..

    . Code

    ..

    sravnenie al, m1

    ..

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

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

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

    Підключення процедур і макросів в зовнішньому файлі

    Зовнішній файл з розширенням inc, а у файлі якої дотримується процедур або макрос присутні наступні рядки

    Model small

    Include [NAME]. INC

    А виклик макросів і процедур як зазвичай.

    Робота з портами вводу виводу

    Адресний простір пам'яті в будь-мікропроцесорної системі сімейства х86 ділиться на простір адрес пам'яті і простір портів вводу / виводу. Це обумовлено архітектурної реалізацією та історичною еволюцією процесорів х86.

    Для звернення до простору введення / виводу використовуються команди in, out, ins, outs.

    In регістр, номер порту - введення даних з порту в регістр

    Out номер порту, регістр - виведення даних з регістра в порт

    Ins, Outs - працюють з елементами рядка пам'яті.

    In ax, 064 h; запис слова в ах з порту 064 h

    Out 064, al; запис байта в порт

    In ax, dx; непряма адресація порту через регістр dx, застосовується при використанні 16 розрядної адреси порту

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

    Розподілом адрес управляє BIOS через регістри конфігурування чіпсета. Зазвичай для сумісності апаратного і програмного забезпечення розподіл адрес стандартно для будь-яких мікропроцесорних систем сімейства х86.

    ОБЧИСЛЮВАЛЬНІ СИСТЕМИ

    Склад будь-який обчислювальної системи однаковий: мікропроцесор, електронна пам'ять підсистема вводу-виводу. Ці пристрій об'єднує системна шина, яка складається з таких шин: даних, адреси та управління.

    Кожен мікропроцесор має певну кількість елементів пам'яті, що називаються регістрами, арифметично-логічний пристрій і пристрій керування. Регістри використовуються для тимчасового зберігання виконуваної команди, адрес пам'яті, оброблюваних даних й іншої внутрішньої інформації МП. В АЛП здійснюється арифметична й логічна обробка даних. Пристрій керування реалізує тимчасову діаграму і виробляє необхідні керуючі сигнали для внутрішньої роботи МП і зв'язку його з іншою апаратурою через зовнішні шини МП.

    Структури різних типів МП можуть істотно відрізнятися, однак найбільш важливими параметрами є архітектура, адресний простір пам'яті, розрядність шини даних, швидкодія. Архітектуру МП визначає розрядність слова і внутрішньої шини даних МП. Перші МП грунтувалися на 4-розрядної архітектури. Перші ПЕОМ використовували МП із 8-розрядною архітектурою, а сучасні МП засновані на МП з 64 - і 32-розрядною архітектурою.

    Мікропроцесори використовують послідовний принцип виконання команд, принцип паралельної роботи, або конвеєрний метод виконання команд.

    Послідовний принцип, при якому чергова операція починається тільки після виконання попередньої.

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

    У МП із 32-розрядною архітектурою використовується конвеєрний метод виконання команд, при якому кілька внутрішніх пристроїв МП працюють паралельно, здійснюючи одночасно обробку декількох послідовних команд програми.

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

    Одним з важливих параметрів МП є швидкодія, що визначається тактовою частотою його роботи, що зазвичай задається зовнішніми синхросигналами. Виконання найпростіших команд (наприклад, додавання двох операндів із регістрів або пересилання операндів у регістрах МП) вимагає мінімально двох періодів тактових імпульсів (для вибірки команди і її виконання). Більш складні команди вимагають для виконання до 10-20 періодів тактових імпульсів. Якщо операнди знаходяться не в регістрах, а в пам'яті, додатковий час витрачається на вибірки операндів у регістри і запису результату на згадку.

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

    Електронна пам'ять

    Містить операнди і програму, яку виконує МП. Використовуються два типи електронної пам'яті: постійні запам'ятовуючі пристрої (ПЗП) і оперативні запам'ятовуючі пристрої (ОЗУ).

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

    Постійний запам'ятовуючий пристрій є незалежною пам'яттю: після вимкнення живлення інформація в ньому зберігається. Інформація в ОЗП руйнується при вимиканні харчування.

    В ОЗП зберігаються оперативні дані і програми, використовувані МП. Тому мікросхеми ОЗУ за швидкодією повинні бути узгоджені з МП, а ємність ОЗУ (разом з ПЗУ) повинна наближатися до межі, що визначається адресним простором МП.

    Схеми введення-виведення

    Зв'язок МП з контролерами ПП зазвичай здійснюється через порти введення-виведення під безпосереднім управлінням МП або під управлінням спеціалізованих контролерів. Зв'язок МП з ПУ проводиться через стандартизовані інтерфейси ПУ.

    Організація і швидкодію схеми введення-виведення впливає на швидкодію всієї обчислювальної системи.

    Мікропроцесори

    Архітектура однокристального 16-ти розрядного мікропроцесора К1810ВМ86.

    Аналог I 8086.

    Орієнтований на паралельне виконання вибірки і команд, може бути умовно розділений на дві частини, що працюють асинхронно: пристрій сполучення з магістраллю (БІ - інтерфейсний блок) і блок обробки (БО).

    Інтерфейсний блок забезпечує формування 20-розрядного фізичної адреси пам'яті, вибірку команд та операндів з пам'яті, організацію черговості команд і запам'ятовування результатів виконання команд у пам'яті.

    БІ складається з черги команд, сегментних регістрів, регістра адреси команд, суматора адреси (SM) та управління машинними циклами.

    Пристрій сполучення готове виконати цикл вибірки слова з пам'яті кожного разу, коли в черзі звільняються, щонайменше, два байти, БО витягує з неї коди команд в міру необхідності. Черга організована за принципом «першим прийшов - першого обслужили», а шість її рівнів дозволяють задовольняти запити БО в кодах команд достатньо ефективно, скорочуючи тим самим до мінімуму витрати часу МП на очікування вибірки команд з пам'яті. Виконання команд відбувається в логічній послідовності, визначеній програмою, оскільки в черзі знаходяться ті команди, які зберігалися в комірках пам'яті, безпосередньо наступних за поточною командою. При передачі управління в іншу комірку пам'яті хід виконання програми порушується. Пристрій сполучення очищає регістри черги, вибирає команду за адресою переходу, передає її УО і починає заповняти цих регістрів. При поверненні з підпрограми або з переривання відбувається відновлення черги команд, адреси яких автоматично обчислюються в СМА. Якщо МП необхідно виконати цикл читання або запису, то вибірка команд призупиняється на час циклу.

    Блок обробки призначений для виконання операцій з обробки даних і складається з блоку мікропрограмного управління (БМУ), АЛУ, восьми регістрів загального призначення (РОН) і регістра прапорів (F).

    Команди, вибрані БІ з пам'яті і записані в чергу команд, по запитах від БО надходять в БМУ. Це пристрій, що містить пам'ять мікрокоманд, декодує команди і виробляє послідовність мікрокоманд, що управляє процесом обробки. В АЛП виконуються арифметичні і логічні операції над 8 - і 16-розрядними числами з фіксованою комою.

    Програмно-доступними функціональними частинами МП є регістри загального призначення (для зберігання операндів і результатів виконання команд), сегментні (для зберігання базових адрес поточних сегментів пам'яті), адреси команд і регістр прапорів.

    Функціональне призначення висновків мікропроцесора К1810ВМ86

    Вхід MN / MX служить для вибору режиму функціонування, який пропонує користувачеві вибір складу вихідних керуючих сигналів у відповідності зі ступенем складності проектованої МП-системи.

    У мінімальному режимі (висновок MN / MX підключений до шини живлення), орієнтованому на малі обчислювальні системи, МП видає сигнали управління обміном з пам'яттю і зовнішніми пристроями, а також забезпечує доступ до системної магістралі за запитом прямого доступу до пам'яті, використовуючи сигнали HOLD і HLDA . Якщо висновок MN / MX підключений до шини «Земля» (загальний), то МП знаходиться в максимальному режимі і може працювати в складних одно-і багатопроцесорних системах. При роботі в цьому режимі змінюються функції ряду висновків МП.

    Позначення висновків

    Функціональне призначення висновків

    AD 0 .. AD 15

    16-розрядна двунаправленная мультиплексована шина адреси / даних

    A16/S3 .. A 19 / S 6

    4-х розрядна вихідна шина мікропроцесора, за якою в такті Т1 передаються 4 старших розряду адреси пам'яті, а в тактах Т2, Т3, Т4, при виконанні операцій звернення до пам'яті та області вводу / виводу - ознаки стану мікропроцесора.

    S 4, S 3 - вказують номер одного з 4 сегментних регістрів, який у цьому циклі бере участь у формуванні виконавчого адреси.

    S 5 - вказує стан тригера дозволу переривання

    S 6 - завжди дорівнює 0.

    BHE / S 7

    Вихід, 0 на якому в Т1 вказує, що по шині адреси / даних передаються 8-розрядне слово. Зроблено для сумісності зі старим ПЗ.

    У тактах Т2, Т3, Т4 на цьому виході присутній S 7 - ознака стану МП. Якщо S 7 = 1 - МП знаходиться в стані захоплення шин зовнішнім пристроєм.

    RD

    Читання, вихід, 0 на якому означає, що МП здійснює читання з пам'яті або портів введення / виводу.

    R ЕА DY

    Готовність, вхід для подачі сигналу закінчення циклу роботи пристроїв пам'яті або введення / виводу. Використовується для синхронізації більш повільних пам'яті або ВУ.

    INTR

    Вхід маскуються запитів на переривання. Наявність запиту на цьому вході аналізується в кінці виконання кожної команди

    TEST

    Вхід, що перевіряється по команді WFT

    NMI

    Вхід немаскируемого запитів на переривання

    RESET

    Вхід початкової установки мікропроцесора

    CLK

    Вхід для подачі тактових імпульсів

    MN / MX

    Вхід для подачі сигналу перемикання мінімального / максимального режиму.

    Мінімальний режим

    INTA

    Підтвердження переривання, вихідний сигнал стробирующий введення інформації в МП з джерела переривання, що викликав перехід в режим переривання

    ALE

    Строб адреси, вихідний сигнал, стробирующий в такті Т1 передачу адресної інформації з шин МП AD 0 .. AD 15 на інші елементи системи

    DEN

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

    DT / R

    Введення / висновок даних, вихідний сигнал, який вказує на напрям передачі. 1 - МП видає інформацію, 0 - МП приймає дані.

    M / IO

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

    W R

    Запис, вихідний сигнал вказує на те, що МП видає інформацію для запису в пам'ять / ВУ.

    HLDA

    Дозвіл прямого доступу, підтвердження захоплення шин МП зовнішнім пристроєм.

    HOLD

    Запит прямого доступу (захоплення шини)

    Максимальний режим

    QS0, QS 1

    Стан черги команд

    S 0 .. S2

    Тип циклу обміну, вказує на одну з можливих ситуацій:

    000 - ознака INTA

    001 - введення інформації з ВУ

    010 - висновок даних на ВУ

    011 - останов

    100 - вибірка команди

    101 - читання з пам'яті

    110 - запис в пам'ять

    LO З K

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

    RQ/GT0, RQ/GT1

    Запит на дозвіл доступу до шини

    Шинні цикли К1810ВМ86

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

    Для звернення до пристроїв введення / виведення процесор має окремі інструкції IN і OUT, результатом виконання яких є формування шинних сигналів IORD і IOWR. У циклах введення / виводу використовують лише молодші 16 біт шини адреси, що дозволяє адресувати до 64кбайт регістрів введення / виводу. Адреса пристрою задається або в команді, або береться з регістра DX.

    Цикли звертання до портів відрізняються від циклів пам'яті використанням шини адреси. При зверненні до портів лінії адреси А16 .. А19 завжди містять 0, а лінії А8 .. А15 містять старший байт адреси, тільки при непрямої адресації через регістр DX. При зверненні по безпосередньому адресою лінії А8 .. А15 містять 0.

    Цикл підтвердження переривання аналогічний циклу читання порту але замість сигналу IORD, активний сигнал INTA, а стан шини адреси процесором в цей час не управляється.

    САМОСТІЙНО

    Організація систем введення-виведення.

    Введення-виведення по перериваннях.

    Програмний введення-виведення.

    Прямий доступ пам'яті.

    Контролер прямого доступу пам'яті.

    Переривання.

    Призначення і типи переривань.

    Механізм обробки програмний переривань.

    Механізм обробки апаратних переривань.

    Контролер переривань.

    Пам'ять.

    Сегментна організація пам'яті.

    Види пам'яті. ОЗУ. ПЗУ.

    Типи ОЗУ: статична пам'ять, динамічна пам'ять.

    Типи ПЗУ.

    Ієрархія пам'яті.

    КЕШ пам'ять.

    Принципи дії КЕШ пам'яті.

    Організація КЕШ пам'яті.

    Розподіл адресного простору.

    Нові види пам'яті.

    Побудова обчислювальних систем.

    Організація апарату програмного автомата.

    Способи підвищення продуктивності ЕОМ.

    Багатомашинні і мультипроцесорні НД

    Мультипрограмних НД

    Тенденції розвитку ЗС і засобів Вт

    Нові види пам'яті.

    FeRAM

    Ферроелектріческая пам'ять - Ferroelectric RAM (FeRAM), це енергонезалежний тип пам'яті, аналогічний Flash пам'яті, що означає можливість зберігання даних без використання джерел енергії. Чіпи FeRAM мають маленьку ємність, на рівні кілобіт, але виробництво 1 Мбіт чіпів FeRAM вже не за горами, цим займається компанія NEC.

    DRDRAM

    Технологія пам'яті Rambus основний архітектурою для виготовлення системної пам'яті персональних комп'ютерів, в результаті чого з 1999 року почнеться витіснення з цього ринку пам'яті типу SDRAM. Знаючи можливості Intel, можна з великою часткою впевненості сказати, що так воно і буде. Фахівці корпорація Intel випробували різні технології пам'яті типу DRAM, перш ніж зупинити свій вибір на технології Rambus. Intel ліцензувала архітектуру RDRAM у компанії Rambus, після чого обидві фірми почали спільні розробки по створенню нового типу пам'яті, який отримав найменування DRDRAM (Direct RDRAM). До речі, компанія Rambus видала ліцензії на свою технологію виготовлення пам'яті семи найбільшим виробникам чіпів DRAM і близько 15 виробникам контролерів. Результатом вибору корпорацією Intel технології Rambus може стати поява більш швидкого і більш досконалої пам'яті, яка буде застосовуватися повсюдно.

    DDR SDRAM

    Новий тип пам'яті DDR SDRAM (Double Data Rate SDRAM), з'явився в слідстві поліпшень архітектури SDRAM, тому інша назва цього типу пам'яті - SDRAM II. Лідерство в розробці цього пам'яті належить корпорації Samsung. В даний час багато великих виробників чіпів пам'яті заявили про намір просувати цю архітектуру. Однак, у світлі того, що Intel збирається просувати іншу архітектуру пам'яті - DRDRAM, майбутнє DDR SDRAM представляється туманним.

    Пам'ять типу DDR SDRAM може передавати і приймати дані по висхідному і низхідному рівню сигналу шини, на відміну від звичайної пам'яті типу SDRAM, яка передає дані лише по висхідному рівнем сигналу. При цьому команди і адреси в DDR SDRAM все одно передаються по верхньому фронту сигналу. Пам'ять типу DDR SDRAM має велику ширину смуги пропускання, але тільки у випадку передачі довгих пакетів даних. Максимальна величина ширини смуги пропускання DDR SDRAM може досягати 1.6 Гб / сек при частоті шини 100MHz.

    Восени 1998 компанія Fujitsu Microelectronics представить перші зразки модулів DIMM, створених за технологією DDR SDRAM. Працює ця пам'ять на частоті 125 МГц, з пропускною здатністю близько 200 мільйонів операцій в секунду, що приблизно відповідає DRDRAM. При всіх своїх перевагах, ця технологія чудово працює з нинішніми машинами, будучи еволюційним розвитком DRAM, на відміну від абсолютно нової технології Rambus, для якої знову знадобляться нові чіпсети системних плат і т.д.

    ESDRAM

    Enhanced SDRAM (ESDRAM - поліпшена SDRAM) - більш швидка версія SDRAM, зроблена у відповідності зі стандартом JEDEC компанією Enhanced Memory Systems (EMS). З точки зору часу доступу продуктивність ESDRAM в два рази вище в порівнянні зі стандартної SDRAM. У більшості програм ESDRAM, завдяки більш швидкому часу доступу до масиву SDRAM і наявності кеша, забезпечує навіть більшу продуктивність, ніж DDR SDRAM.

    Більш висока швидкість роботи ESDRAM досягається за рахунок додаткових функцій, які використовуються в архітектурі цієї пам'яті. ESDRAM має рядок кеш-регістрів (SRAM), в яких зберігаються дані, до яких вже було звернення. Доступ до даних в рядку кеша здійснюється швидше, ніж до осередків SDRAM, зі швидкістю 12 ns, тому що не потрібно звертатися до даних у рядку через адресу в колонці. При цьому швидкість роботи осередків ESDRAM становить 22 ns на відміну від стандартної швидкості роботи осередків SDRAM, що має значення 50 - 60 ns.

    При цьому варто зауважити, що пам'ять ESDRAM повністю сумісна зі стандартною пам'яттю JEDEC SDRAM на рівні компонентів і модулів, за кількістю контактів і функціональності. Однак, щоб використовувати всі переваги цього пам'яті, необхідно використовувати спеціальний контролер (чіпсет).

    Збільшення продуктивності при використанні ESDRAM досягається за рахунок застосування двухбанковой архітектури, яка складається з масиву SDRAM і SRAM рядкових регістрів (кеш). Рядкові регістри разом з швидким масивом SDRAM забезпечують більш швидкий доступ для читання і запису даних у порівнянні зі стандартної SDRAM. ESDRAM може працювати в режимі "попереджувального звернення" до масиву SDRAM, в результаті наступний цикл запису або читання може початися в момент, коли виконання поточного циклу не завершено. Можливість використовувати такий режим безпосередньо залежить від центрального процесора, який керує роботою конвеєра адресації.

    З точки зору застосування в якості системної (оперативної) пам'яті комп'ютера чіпсет VCS-164 (Polaris) компанії VLSI Technology підтримує ESDRAM, правда, цей чіпсет розрахований для застосування в системах на базі процесора Digital Alpha. ESDRAM повністю відповідає специфікації Intel PC-100 SDRAM, і відповідно, сумісна з чіпсетами Intel 440BX і Via Technologies MVP-3.

    FCRAM

    Fast Cycle Random Access Memory (FCRAM). Розробник цього пам'яті - компанія Fujitsu. В основу цього пам'яті лягла принципово інша концепція в порівнянні з DRAM. Час виконання циклу відповідає за все 20нс, тобто в 3-4 рази менше, ніж у нинішніх модулів DRAM. Це досягнуто завдяки двом принципових моментів. По-перше, на відміну від сучасних чіпів пам'яті, де спочатку з'ясовується адреса рядка (RAS), а потім, після деякої затримки, адреса стовпця (CAS), де знаходиться потрібна клітинка, в FCRAM миттєво з'ясовуються обидві координати. По-друге, існуюча пам'ять типу DRAM має час виконання циклу 70нс, через те, що після виконання кожної операції над осередком повинна пройти команда скидання. У FCRAM ж вбудована ланцюг автоматичного скидання, завдяки чому можлива конвеєрна обробка команд, де наступна команда починає виконуватися ще до закінчення виконання попередньої. Підсумок - час виконання циклу - 20нс. У результаті ми отримуємо дуже цікавий гібрид. За швидкістю роботи FCRAM більше нагадує SRAM, а за обсягом - звичайну пам'ять DRAM.

    MRAM

    MRAM - Magnetic random access memory. Розробник - компанія Toshiba. Вже є пробний зразок основної структури чіпа MRAM, що втілює в собі нову технологію пам'яті, потенційно здатну перевершити існуючі типи DRAM і за швидкістю, і за обсягом, і по енергоспоживанню. Вже цей тестовий зразок демонструє видатні швидкісні якості - цикл читання займає всього 6 нс.

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

    Посилання (links):
  1. http://www.vlsi.com/
  2. http://www.ixbt.com/cpu/alpha.html
  3. http://www.ixbt.com/mainboard/pc100.html
  4. http://www.ixbt.com/mainboard/mvp-3.html
  5. Додати в блог або на сайт

    Цей текст може містити помилки.

    Програмування, комп'ютери, інформатика і кібернетика | Лекція
    319.6кб. | скачати


    Схожі роботи:
    Бакалаврська робота Програмна модель 32-разядной МЕВМ фірми Motorola
    Програмна модель пошуку глобального мінімуму нелінійних яружних функцій двох змінних
    Характеристика двоядерних процесорів
    Передумови створення морфологічних процесорів
    Сокети використовувані для встановлення процесорів Intel
    Методика вивчення текстових процесорів в основній школі
    Історія перших процесорів і найбільші маркетингові помилки
    Проектування і програмна реалізація інтернет-магазину
    Розробка та програмна реалізація інформаційної системи Кадри
    © Усі права захищені
    написати до нас