Мова асемблера команди. Реферат: План: Передмова

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ УЗБЕКІСТАНУ ІМЕНІ МИРЗО УЛУГБЕКА

ФАКУЛЬТЕТ КОМП'ЮТЕРНИХ ТЕХНОЛОГІЙ

На тему: Семантичний аналіз EXE-файлу.

Виконав:

Ташкент 2003 року.

Передмова.

Мова асемблера та структура команд.

Структура EXE-файлу (семантичний аналіз).

Структура COM-файлу.

Принцип дії та поширення вірусу.

Дисасемблер.

Програми.

Передмова

Професія програміста дивовижна та унікальна. В наш час науку та життя неможливо уявити без новітніх технологій. Все, що пов'язане з діяльністю людини не обходиться без обчислювальної техніки. А це сприяє її високому розвитку та досконалості. Нехай розвиток персональних комп'ютерів почалося нещодавно, але протягом цього часу були зроблені колосальні кроки по програмним продуктам і ще довгий часці продукти широко використовуватимуться. Область пов'язаних з комп'ютерами знання зазнала вибуху, як і відповідна технологія. Якщо не брати до розгляду комерційну сторону, то можна сказати, що чужих людей у ​​цій галузі професійної діяльностіні. Багато хто займається розробкою програм не заради вигоди або заробітку, а з власної волі, захоплення. Звичайно це не позначиться на якості програми, і в цій справі «бізнесі» є конкуренція та попит на якість виконання, на стабільній роботі і відповідає всім вимогам сучасності. Тут також варто відзначити появу мікропроцесорів у 60-х роках, які прийшли на заміну великої кількості набору ламп. Є деякі різновиди мікропроцесорів, які сильно відрізняються один від одного. Ці мікропроцесори відмінні один від одного розрядністю та вбудованими системними командами. Найпоширеніші такі як: Intel, IBM, Celeron, AMD тощо. Всі ці процесори стосуються розвиненої архітектури процесорів фірми Intel. Поширення мікрокомп'ютерів спричинило перегляд відносини до мови асемблера з двох основних причин. По-перше, програми, написані мовою асемблера, вимагають значно менше пам'яті та часу виконання. По-друге, знання мови асемблера та результуючого машинного коду дає розуміння архітектури машини, що навряд чи забезпечується під час роботи мовою високого рівня. Хоча більшість фахівців у галузі програмного забезпечення ведуть розробки мовами високого рівня, таких як Паскаль, С або Delphi, що простіше при написанні програм, найбільш потужне та ефективне програмне забезпеченняповністю або частково написано мовою асемблера. Мови високого рівня були розроблені для того, щоб уникнути спеціальної технічної особливостіконкретні комп'ютери. А мова асемблера, у свою чергу, розроблена для конкретної специфіки процесора. Отже, щоб написати програму мовою асемблера для конкретного комп'ютера, слід знати його архітектуру. В даний час видом основного програмного продуктує EXE файл. З огляду на позитивні сторони цього автор програми може бути впевнений у її недоторканності. Але часто це далеко не так. Існує так само і дисасемблер. За допомогою дисассемблера можна дізнатися про переривання і коди програми. Людині, яка добре знається на асемблері не складно буде переробити всю програму на свій смак. Можливо звідси виникає найнерозв'язніша проблема – вірус. Навіщо люди пишуть вірус? Деякі ставлять це питання з подивом, деякі зі злістю, але продовжують існувати люди, які цікавляться цим завданням не з погляду завдання якоїсь шкоди, а як інтересу до системного програмування. Пишуть віруси з різних причин. Одним подобається системні виклики, іншим удосконалювати свої знання в асемблері. Про все це я постараюся викласти у своїй роботі. Також у ньому сказано як про структуру EXE-файлу а й про мову асемблера.

^ Мова Асемблера.

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

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

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

По-справжньому вирішити проблеми, пов'язані з апаратурою (або навіть, залежать від апаратури як, наприклад, підвищення швидкодії програми), неможливо без знання асемблера.

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

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

Типовий сучасний комп'ютер (на базі i486 чи Pentium) складається з наступних компонентів (рис. 1).

Рис. 1. Комп'ютер та периферійні пристрої

Рис. 2. Структурна схема персонального комп'ютера

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

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

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

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

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

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

З усього вищесказаного можна дійти невтішного висновку, що, оскільки мова асемблера для комп'ютера “рідний”, те й найефективніша програма може бути написана лише у ньому (за умови, що її пише кваліфікований програміст). Тут є одне маленьке "але": це дуже трудомісткий процес, що вимагає великої уваги та практичного досвіду. Тому реально на асемблері пишуть переважно програми, які мають забезпечити ефективну роботуз апаратною частиною. Іноді на асемблері пишуться критичні за часом виконання або витрачання пам'яті ділянки програми. Згодом вони оформляються як підпрограм і поєднуються з кодом мовою високого рівня.

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

Дані регістри можна розділити на великі групи:

^ 16 користувальницьких регістрів;

16 системних регістрів.

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

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

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

шість регістрів сегментів: cs, ds, ss, es, fs, gs;

регістри стану та управління:

Реєстр прапорів eflags/flags;

Реєстр покажчика команди eip/ip.

Рис. 3. Регістри користувача мікропроцесорів i486 і Pentium

Чому багато хто з цих регістрів наведено з похилою роздільною рисою? Ні, це різні регістри - це частини одного великого 32-разрядного регістру. Їх можна використовувати у програмі як окремі об'єкти. Так зроблено задля забезпечення працездатності програм, написаних для молодших 16-розрядних моделей мікропроцесорів фірми Intel, починаючи з i8086. Мікропроцесори i486 та Pentium мають в основному 32-розрядні регістри. Їхня кількість, за винятком сегментних регістрів, така ж, як і у i8086, але розмірність більша, що й відображено в їх позначеннях - вони мають
приставку e(Extended).

^ Реєстри загального призначення
Усі регістри цієї групи дозволяють звертатися до своїх "молодших" частин (див. рис. 3). Розглядаючи цей малюнок, зауважте, що використовувати для самостійної адресації можна лише молодші 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) - регістр покажчика бази кадру стека.
Призначений для організації довільного доступу до даних усередині стека.

Стеком називають область програми тимчасового зберігання довільних даних. Зрозуміло, дані можна зберігати і в сегменті даних, проте в цьому випадку для кожного зберігається на час даного треба заводити окрему іменовану комірку пам'яті, що збільшує розмір програми та кількість використовуваних імен. Зручність стека полягає в тому, що його область використовується багаторазово, причому збереження в стеку даних і вибірка звідти виконується за допомогою ефективних команд push і pop без вказівок будь-яких імен.
Стек традиційно використовується, наприклад, для збереження вмісту регістрів, що використовуються програмою, перед викликом підпрограми, яка, у свою чергу, використовуватиме регістри процесора "у своїх особистих цілях". Вихідний вміст регістрів витікається зі стека після повернення з підпрограми. Інший поширений прийом - передача підпрограмі необхідних нею параметрів через стек. Підпрограма, знаючи, в якому порядку поміщені в стек параметри, може забрати їх звідти та використовувати під час виконання. Відмінною особливістюстека є своєрідний порядок вибірки які у ньому даних: у час в стеку доступний лише верхній елемент, тобто. елемент, завантажений у стек останнім. Вивантаження зі стека верхнього елемента робить доступним наступний елемент. Елементи стека розташовуються в області пам'яті, відведеної під стек, починаючи з дна стека (тобто з його максимальної адреси) за адресами, що послідовно зменшуються. Адреса верхнього доступного елемента зберігається в регістрі-покажчику стека SP. Як і будь-яка інша область пам'яті програми, стек повинен входити до якогось сегмента або утворювати окремий сегмент. У будь-якому випадку сегментна адреса цього сегмента міститься в сегментний регістр стека SS. Таким чином, пара регістрів SS:SP описують адресу доступного осередку стека: в SS зберігається сегментна адреса стека, а в SP - усунення останнього збереженого в стеку даного (рис. 4, а). Звернемо увагу на те, що у вихідному стані покажчик стека SP вказує на комірку, що лежить під дном стека і не входить до нього.

Рис 4. Організація стеку: а - вихідний стан, б - після завантаження одного елемента (в даному прикладі- вмісту регістру АХ), - після завантаження другого елемента (вмісту регістру DS), г - після вивантаження одного елемента, д - після вивантаження двох елементів і повернення у вихідний стан.

Завантаження у стек здійснюється спеціальною командою роботи зі стеком push (проштовхнути). Ця команда спочатку зменшує на 2 вміст покажчика стека, а потім поміщає операнд за адресою SP. Якщо, наприклад, ми хочемо тимчасово зберегти у стеку вміст регістру АХ, слід виконати команду

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

переведе стек у стан, показаний на рис. 1.10 ст. У стеку тепер зберігатимуться два елементи, причому доступним буде тільки верхній, на який вказує покажчик стека SP. Якщо через якийсь час нам знадобилося відновити вихідний вміст збережених у стеку регістрів, ми повинні виконати команди вивантаження зі стеку pop (виштовхнути):

pop DS
pop AX

Якого розміру має бути стек? Це залежить від того, наскільки інтенсивно він використовується у програмі. Якщо, наприклад, планується зберігати в стеку масив об'ємом 10 000 байт, то стек повинен бути не меншим за цей розмір. При цьому треба мати на увазі, що у ряді випадків стек автоматично використовується системою, зокрема, при виконанні команди переривання int 21h. По цій команді спочатку процесор поміщає в стек адресу повернення, а потім DOS відправляє туди вміст регістрів та іншу інформацію, що відноситься до перерваної програми. Тому, навіть якщо програма зовсім не використовує стек, він все ж таки повинен бути присутнім у програмі і мати розмір не менше кількох десятків слів. У першому прикладі ми відвели під стек 128 слів, що безумовно достатньо.

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

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

Пропозиції асемблера бувають чотирьох типів:

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

макрокоманди - оформляються певним чином речення тексту програми, які замінюються під час трансляції іншими пропозиціями;

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

рядки коментарів, що містять будь-які символи, у тому числі літери російського алфавіту. Коментарі ігноруються транслятором.

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

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

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

Рис. 6. Формат директив

Рис. 7. Формат команд та макрокоманд

На цих малюнках:

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

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

код операції (КОП) та директива – це мнемонічні позначення відповідної машинної команди, макрокоманди або директиви транслятора;

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

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

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

Усі латинські літери: A-Z, a-z. При цьому великі та малі літери вважаються еквівалентними;

Цифри від 0 до 9;

Знаки?, @, $, _, &;

Розділювачі, . ()< > { } + / * % ! " " ? \ = # ^.

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

Лексемами є:

ідентифікатори - послідовності допустимих символів, що використовуються для позначення таких об'єктів програми, як коди операцій, імена змінних та назви міток. Правило запису ідентифікаторів полягає в наступному: ідентифікатор може складатися з одного або кількох символів. Як символи можна використовувати літери латинського алфавіту, цифри та деякі спеціальні знаки - _, ?, $, @. Ідентифікатор не може стати символом цифри. Довжина ідентифікатора може бути до 255 символів, хоча транслятор приймає лише перші 32, а інші ігнорує. Регулювати довжину можливих ідентифікаторів можна за допомогою опції командного рядка mv. Крім цього існує можливість вказати транслятор на те, щоб він розрізняв великі і малі літери або ігнорував їх відмінність (що і робиться за замовчуванням).

^ Команди асемблера.

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

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

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

1 - після виконання команди прапор встановлюється (рівний 1);

0 - після виконання команди прапор скидається (рівний 0);

r – значення прапора залежить від результату роботи команди;

Після виконання команди прапор не визначено;

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

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

r8, r16, r32 - операнд в одному з регістрів розміром байт, слово чи подвійне слово;

m8, m16, m32, m48 – операнд у пам'яті розміром байт, слово, подвійне слово або 48 біт;

i8, i16, i32 – безпосередній операнд розміром байт, слово або подвійне слово;

a8, a16, a32 - відносна адреса (зміщення) у сегменті коду.

Команди (за абеткою):

*Дані команди докладно описані.

ADD
(ADDition)

Додавання

^ Схема команди:

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

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

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

скласти операнди джерело та приймач;

записати результат додавання до приймача;

встановити прапори.

Стан прапорів після виконання команди:

Застосування:
Команда add використовується для складання двох цілих операндів. Результат додавання міститься за адресою першого операнда. Якщо результат додавання виходить за межі операнда приймач (виникає переповнення), то врахувати цю ситуацію слід шляхом аналізу прапора cf та подальшого можливого застосування команди adc. Наприклад, складемо значення в регістрі ax та області пам'яті ch. При додаванні слід врахувати можливість переповнення.

Регістр плюс регістр або пам'ять:

|000000dw|modregr/rm|

Реєстр AX (AL) плюс безпосереднє значення:

|0000010w|--data--|data, якщо w=1|

Реєстр або пам'ять плюс безпосереднє значення:

|100000sw|mod000r/m|--data--|data, якщо BW=01|

CALL
(CALL)

Виклик процедури чи завдання

^ Схема команди:

Призначення:

передача керування близькою або далекою процедурою із запам'ятовуванням у стеку адреси точки повернення;

перемикання завдань.

Алгоритм роботи:
визначається типом операнда:

Мітка ближня - в стек заноситься вміст покажчика команд eip/ip і цей же регістр завантажується нове значення адреси, відповідне мітці;

Мітка дальня - в стек заноситься вміст покажчика команд eip/ip та cs. Потім ці ж регістри завантажуються нові значення адрес, відповідні дальньої мітці;

R16, 32 або m16, 32 - визначають регістр або комірку пам'яті, що містять зміщення у поточному сегменті команд, куди передається управління. При передачі управління у стек заноситься вміст покажчика команд eip/ip;

Покажчик на пам'ять - визначає комірку пам'яті, що містить 4 або 6-байтний покажчик на процедуру, що викликається. Структура такого покажчика 2+2 або 2+4 байти. Інтерпретація такого покажчика залежить від режиму роботи мікропроцесора:

^ Стан прапорів після виконання команди (крім перемикання задачі):

виконання команди не впливає на прапори

При перемиканні завдання значення прапорців змінюються відповідно до інформації про регістр eflags в сегменті стану TSS задачі, на яку здійснюється перемикання.
Застосування:
Команда call дозволяє організувати гнучку та багатоваріантну передачу управління на підпрограму із збереженням адреси точки повернення.

Об'єктний код (чотири формати):

Пряма адресація у сегменті:

11101000 | disp-low | diep-high |

Непряма адресація у сегменті:

|11111111|mod010r/m|

Непряма адресація між сегментами:

|11111111|mod011r/m|

Пряма адресація між сегментами:

|10011010|offset-low|offset-high|seg-low|seg-high|

CMP
(CoMPare operands)

Порівняння операндів

^ Схема команди:

cmp операнд1,операнд2

Призначення: Порівняння двох операндів.

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

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

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

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

Об'єктний код (три формати):

Регістр або пам'ять із регістром:

|001110dw|modregr/m|

Безпосереднє значення з регістром AX (AL):

|0011110w|--data--|data, якщо w=1|

Безпосереднє значення з регістром або пам'яттю:

|100000sw|mod111r/m|--data--|data, якщо sw=0|

DEC
(DECrement operand by 1)

Зменшення операнда на одиницю

^ Схема команди:

dec операнд

Призначення: зменшення значення операнда у пам'яті або регістрі на 1.

Алгоритм роботи:
команда віднімає 1 з операнда. Стан прапорів після виконання команди:

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

Реєстр: |01001reg|

^ Реєстр або пам'ять: |1111111w|mod001r/m|

DIV
(DIVide unsigned)

Поділ беззнаковий

Схема команди:

div дільник

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

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

якщо дільник розміром байт, то ділене має бути розташоване в регістрі ax. Після операції приватне міститься в al, а залишок - в ah;

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

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

^ Стан прапорів після виконання команди:

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

Об'єктний код:

|1111011w|mod110r/m|

INT
(INTerrupt)

Виклик підпрограми обслуговування переривання

^ Схема команди:

int номер_переривання

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

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

записати в стек регістр прапорів eflags/flags та адресу повернення. При записі адреси повернення спочатку записується вміст сегментного регістру cs, потім вміст покажчика команд eip/ip;

скинути у нуль прапори if та tf;

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

^ Стан прапорів після виконання команди:

Застосування:
Як видно із синтаксису, існують дві форми цієї команди:

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

Друга форма команди займає два байти, має код операції 0cdh та дозволяє ініціювати виклик підпрограми обробки переривання з номером вектора в діапазоні 0–255. Особливості передачі управління, як було зазначено, залежить від режиму роботи мікропроцесора.

Об'єктний код (два формати):

Реєстр: |01000reg|

^ Реєстр або пам'ять: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(Jump if condition)

(Jump if CX = Zero / Jump if ECX = Zero)

Перехід, якщо виконана умова

Перехід, якщо CX/ECX дорівнює нулю

^ Схема команди:

jcc мітка
jcxz мітка
jecxz мітка

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

^ Алгоритм роботи команд (крім jcxz/jecxz):
Перевірка стану прапорів залежно від коду операції (воно відображає умову, що перевіряється):

якщо перевіряється умова істинно, перейти до осередку, позначеної операндом;

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

Алгоритм роботи команди jcxz/jecxz:
Перевірка умови рівності нулю вмісту регістру ecx/cx:

якщо перевіряється умов

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

Кожна машинна команда складається із двох частин:

  • операційної - визначальною, "що робити";
  • операндної - визначальною об'єкти обробки, "з чим робити".

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

мітка команда/директива операнд(и); коментарі

При цьому обов'язковим полем у рядку є команда чи директива.

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

Якщо команду або директиву необхідно продовжити на наступному рядку, використовується символ зворотний слєш: \.

За замовчуванням мова асемблера не розрізняє великі та малі літери в написанні команд або директив.

Приклади рядків коду:

Count db 1 ;Ім'я, директива, один операнд
mov eax,0 ;Команда, два операнди
cbw; Команда

Мітки

Мітка у мові асемблера може містити такі символи:

  • усі літери латинського алфавіту;
  • цифри від 0 до 9;
  • спецсимволи: _, @, $, ?.

В якості першого символу мітки може бути використана точка, але деякі компілятори не рекомендують застосовувати цей знак. Як позначки не можна використовувати зарезервовані імена Асемблера (директиви, оператори, імена команд).

Першим символом у мітці має бути буква або спецсимвол (але не цифра). Максимальна довжинамітки – 31 символ. Усі мітки, які записуються в рядку, що не містить директиви асемблера, повинні закінчуватися двокрапкою: .

Команди

Команда вказує транслятору, яку дію має виконати мікропроцесор. У сегменті даних команда (або директива) визначає поле, робочу область чи константу. У сегменті коду команда визначає дію, наприклад, пересилання (mov) або додавання (add).

Директиви

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

Операнди

Операнд – об'єкт, над яким виконується машинна команда чи оператор мови програмування.
Команда може мати один або два операнди, або взагалі не мати операндів. Число операндів неявно задається кодом команди.
Приклади:

  • Немає операндів ret ;Повернутись
  • Один операнд inc ecx; Збільшити ecx
  • Два операнди add eax,12 ;Додати 12 до eax

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

Як операнди можуть виступати

  • ідентифікатори;
  • ланцюжки символів, укладених у одинарні чи подвійні лапки;
  • цілі числа у двійковій, вісімковій, десятковій або шістнадцятковій системі числення.
Ідентифікатори

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

Правила запису ідентифікаторів.

  • Ідентифікатор може складатися з одного або кількох символів.
  • Як символи можна використовувати літери латинського алфавіту, цифри та деякі спеціальні знаки: _, ?, $, @.
  • Ідентифікатор не може стати символом цифри.
  • Довжина ідентифікатора може бути 255 символів.
  • Транслятор приймає перші 32 знаки ідентифікатора, а інші ігнорує.
Коментарі

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

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

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

Приклад «що нічого не робить» програми мовою асемблера:

686P
.MODEL FLAT, STDCALL
.DATA
.CODE
START:

RET
END START

У цій програмі представлена ​​лише одна команда мікропроцесора. Ця команда RET. Вона забезпечує правильне закінчення роботи програми. У випадку ця команда використовується для виходу з процедури.
Решта програми належить до роботи транслятора.
.686P - дозволені команди захищеного режиму Pentium 6 (Pentium II). Ця директива вибирає підтримуваний набір команд асемблера, вказуючи модель процесора. Літера P, зазначена в кінці директиви, повідомляє транслятор про роботу процесора в захищеному режимі.
.MODEL FLAT, stdcall - Плоска модель пам'яті. Ця модель пам'яті використовується в операційній системі Windows. stdcall
.DATA - сегмент програми, що містить дані.
.CODE - блок програми, що містить код.
START - мітка. В асемблері мітки відіграють велику роль, що не скажеш про сучасні мови високого рівня.
END START — кінець програми та повідомлення транслятору, що розпочинати виконання програми треба з мітки START .
Кожен модуль повинен містити директиву END, що позначає кінець вихідного кодупрограми. Всі рядки, які слідують за директивою END, ігноруються. Якщо опустити директиву END, то генерується помилка.
Мітка, вказана після директиви END повідомляє транслятору ім'я головного модуля, з якого починається виконання програми. Якщо програма містить один модуль, мітку після директиви END можна не вказувати.

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

ПЛАН ЛЕКЦІЇ

1. Основні групи операцій.

Pentium.

1. Основні групи операцій

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

Операціїпересилання,

Арифметичні операції,

Логічні операції,

Операції зсуву,

Операції порівняння тестування,

Бітові операції,

Операції управління програмою;

Операції управління процесором.

2. Мнемокоди команд процесора Pentium

При описі команд зазвичай використовуються їх мнемонічні позначення (мнемокоди), які служать завдання команди при програмуванні мовою Асемблера. Для різних версійАссемблера мнемокоды деяких команд можуть відрізнятися. Наприклад, для команди виклику підпрограми використовується мнемокодCALL або JSR (“ Jump to SubRoutine”). Проте мнемокоды більшості команд основних типів мікропроцесорів збігаються чи відрізняються незначно, оскільки є скороченнями відповідних англійських слів, визначальних виконувану операцію. Розглянемо мнемокоди команд, прийняті для процесорів Pentium.

Команди пересилання. Основною командою цієї групи є командаMOV яка забезпечує пересилання даних між двома регістрами або між регістром і осередком пам'яті. У деяких мікропроцесорах реалізується пересилання між двома осередками пам'яті, а також групове пересилання вмісту кількох регістров з пам'яті. Наприклад, мікропроцесори сімейства 68 xxx компанії Motorola виконують командуMOVE , що забезпечує пересилання з одного осередку пам'яті до іншого, і командуMOVEM , яка здійснює запис у пам'ять або завантаження з пам'яті вмісту заданого набору регістрів (до 16 регістрів). КомандаXCHG виробляє взаємний обмін вмістом двох регістрів процесора або регістру та комірки пам'яті.

Команди введення IN та висновку OUT реалізують пересилання даних з регістру процесора у зовнішній пристрій або прийом даних із зовнішнього пристрою регістр. У цих командах визначається номер інтерфейсного пристрою (порту вводу-виводу), через яке проводиться передача даних. Зазначимо, що багато мікропроцесорів не мають спеціальних команд для звернення до зовнішнім пристроям. В цьому випадку введення та виведення даних у системі виконується за допомогою командиMOV , де задається адреса необхідного інтерфейсного пристрою. Таким чином, зовнішній пристрій адресується як осередок пам'яті, а в адресному просторі виділяється певний розділ, в якому розташовуються адреси підключених до системи інтерфейсних пристроїв (портів).

Команди арифметичних операцій. Основними в цій групі є команди додавання, віднімання, множення і поділу, які мають ряд варіантів. Команди складання ADD та віднімання SUB виконують відповідні операції зcодержимих двох регістрів, регістру та осередку пам'яті або з використанням безпосереднього операнда. Команди AD C , SB B виробляють додавання та віднімання з урахуванням значення ознакиC, що встановлюється при формуванні перенесення у процесі виконання попередньої операції З допомогою цих команд реалізується послідовне додавання операндів, число розрядів яких перевищує розрядність процесора. Команда NEG змінює знак операнда, переводячи його на додатковий код.

Операції множення та поділу можуть виконуватися над числами зі знаком (командиI MUL, I DIV ) або беззнака (команди MUL, DIV ). Один з операцій завжди розміщується в регістрі, другий може перебувати в регістрі, осередку пам'яті або бути безпосереднім операндом. Результат операції розміщується у регістрі. При множенні (командиMUL , IMUL ) Виходить результат подвоєної розрядності, для розміщення якого використовується два регістри. При розподілі (командиDIV , IDIV ) як ділимого використовується операнд подвоєної розрядності, що розміщується у двох регістрах, а як результат у два регістри записується приватне та залишок.

Команди логічних операцій . Практично всі мікропроцесори виробляють логічні операції І , АБО, що виключає АБО, які виконуються над однойменними розрядами операндів за допомогою команд AND, OR, X OR . Операції виконуються над вмістом двох регістрів, регістру та осередку пам'яті або з використанням безпосереднього операнда. Команда NOT інвертує значення кожного розряду операнда.

Команди зсуву. Мікропроцесори здійснюють арифметичні, логічні та циклічні зрушення адресованих операндів на один або кілька розрядів. Операнд, що зсувається, може знаходитися в регістрі або осередку пам'яті, а число розрядів зсуву задається за допомогою безпосереднього операнда, що міститься в команді, або визначається вмістом заданого регістру. У реалізації зсуву зазвичай бере участь ознака перенесенняCу регістрі станів (SRабо EFLAGS), в якому розташовується останній розряд операнда, що висувається з регістру або осередку пам'яті.

Команди порівняння та тестування . Порівняння операндів зазвичай проводиться за допомогою командиCMP , яка виробляє віднімання операндів із встановленням значень ознак N, Z, V, Cу регістрі стану відповідно до отриманого результату. При цьому результат віднімання не зберігається і значення операндів не змінюються. Подальший аналіз отриманих значень ознак дозволяє визначити відносне значення (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Деякі мікропроцесори виконують команду тестування TST яка є однооперандним варіантом команди порівняння. При виконанні цієї команди встановлюються ознаки N, Zвідповідно до знака і значення (рівно або не дорівнює нулю) адресованого операнда.

Команди бітових операцій . Ці команди роблять установку значення ознакиCу регістрі станів відповідно до значення тестованого бітаbn в адресованому операнді. У деяких мікропроцесорах за результатом тестування біта проводиться установка ознакиZ. Номер тестованого бітаnвизначається або вмістом зазначеного в команді регістру, або безпосереднім операндом.

Команди цієї групи реалізують різні варіанти зміни тестованого біта. BT зберігає значення цього біта незмінним. B T S післятестування встановлює значення bn=1, а команда B T C - значення bn=0.Команда B T C інвертує значення біта bn після тестування.

Операції керування програмою. Для управління програмою використовується велика кількість команд, серед яких можна виділити:

- команди безумовної передачі керування;

- команди умовних переходів;

- команди організації програмних циклів;

- команди переривання;

- команди зміни ознак.

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

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

Команди управління ознаками забезпечують запис - читання вмісту регістру стану, у якому зберігаються ознаки, і навіть зміна значень окремих ознак. Наприклад, у процесорах Pentium реалізуються команди LAHF і SAHF , які виконують завантаження молодшого байта, де містяться ознаки, з регістру стану EFLAGу молодший байт регістру EAXта заповнення молодшого байта EFLAGSз регістру E AX.. Команди CLC, STCздійснюють встановлення значень ознаки перенесення CF=0, CF=1, а команда CMCвикликає інвертування значення цієї ознаки.Так як ознаки визначають хід виконання програми при умовних переходах, команди зміни ознак зазвичай використовуються для управління програмою.

Команди управління процесором . До цієї групи належать команди зупинки, відсутності операції та ряд команд, що визначають режим роботи процесора або його окремих блоків. КомандаHLT припиняє виконання програми та переводить процесор у стан зупинки, вихід з якого відбувається при надходженні сигналів переривання або перезапуску ( Reset). Команда NOP ("порожня" команда), яка не викликає виконання будь-яких операцій, служить для реалізації програмних затримок або заповнення перепусток, що утворилися в програмі.

Спеціальні команди CLI, STI забороняють та дозволяють обслуговування запитів переривання. У процесорах Pentium для цього використовується біт управління (прапор)IFу регістрі EFLAGS.

Багато сучасних процесорів виконують команду ідентифікації, яка дозволяє користувачеві або іншим пристроям отримати інформацію про тип процесора, який використовується в даній системі. У процесорах Pentuimдля цього служить команда CPUID , при виконанні якої необхідні дані про процесор надходять до регістру EAX,EBX ,ECX,EDXі потім можуть зчитуватися користувачем або операційною системою.

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

Деякі процесори роблять арифметичні операції з двійково-десятковими числами або виконують спеціальні команди корекції результату при обробці таких чисел. До складу багатьох високопродуктивних процесорів входить FPU - блок обробки чисел c "плаваючою точкою".

У ряді сучасних процесорів реалізовано групову обробку кількох цілих чисел чи чисел c "плаваючою точкою" за допомогою однієї команди за принципом SIMD (“Single Instruction – Multiple Data ”) - «Одна команда – Безліч даних». Одночасне виконання операцій над кількома операндами суттєво підвищує продуктивність процесора під час роботи з відео- та аудіоданими. Такі операції широко використовуються для обробки зображень, звукових сигналів та інших програм. Для виконання цих операцій до складу процесорів введені спеціальні блоки, що реалізують відповідні набори команд, які у різних типах процесорів ( Pentium Athlon) отримали назвуMMX (“ Milti- Media Extension ”) – Мультимедійне Розширення,SSE(“ Streaming SIMD Extension ”) – Потокове SIMD - Розширення, “3 DExtension- Тривимірне розширення.

Характерною особливістю процесорів компанії Intel , починаючи з моделі 80286, є пріоритетний контроль при зверненні до пам'яті, який забезпечується під час роботи процесора як захищених віртуальних адрес – – “ Protected Mode ” (захищений режим). Для реалізації цього режиму використовують спеціальні групи команд, які служать для організації захисту пам'яті відповідно до прийнятого алгоритму пріоритетного звернення.

1. Архітектура ПК……………………………………………………………5

    1.1. реєстри.

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

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

1.1.3 Реєстр прапорів

1.2. Організація пам'яті.

1.3. Подання даних.

1.3.1 Типи даних

1.3.2 Подання символів та рядків

2. Оператори програми на асемблері ……………………………………

    1. Команди мови асемблера

2.2. Режими адресації та формати машинних команд

3. Псевдооператори ………………………………………………………….

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

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

3.2.1. Програмні сегменти. Директива assume

3.2.3 Спрощена директива сегментації

4. Асемблювання та компонування програми ………………………….

5. Команди пересилання данных…………………………………………….

    5.1 Команди загального призначення

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

5.3 Команди введення-виводу

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

5.5 Команди пересилання прапорів

6. Арифметичні команди ……………………………………………….

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

6.1.1 Додавання та віднімання

6.1.2 Команди збільшення та зменшення приймача на одиницю

6.2 Множення та розподіл

6.3 Зміна знаку

7. Логічні операції ………………………………………………….

8. Зрушення та циклічні зрушення …………………………………………

9. Строкові операції …………………………………………………….

10. Логіка та організація програм ………………………………………

10.1 Безумовні переходи

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

10.4 Процедури у мові асемблера

10.5 Переривання INT

10.6 Системне програмне забезпечення

10.6.1.1 Читання клавіатури.

10.6.1.2 Виведення символів на екран

10.6.1.3 Завершення програм.

10.6.2.1 Вибір режимів дисплея

11. Дискова пам'ять ……………………………………………………………..

11.2 Таблиця розподілу файлів

11.3 Операції введення-виводу на диск

11.3.1 Записування файлу на диск

11.3.1.1 Дані у форматі ASCIIZ

11.3.1.2 Файловий номер

11.3.1.3 Створення дискового файлу

11.3.2 Читання дискового файлу

Вступ

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

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

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

У посібнику розглядаються питання програмування мовою асемблера для комп'ютерів з урахуванням мікропроцесорів фірми Intel.

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

    Архітектура ПК.

Архітектура ЕОМ - це абстрактне уявлення ЕОМ, яке відображає її структурну, схемотехнічну та логічну організацію.

Всі сучасні ЕОМ мають деякі загальними та індивідуальними властивостями архітектури. Індивідуальні характеристики притаманні лише конкретної моделі комп'ютера.

Поняття архітектури ЕОМ включає:

    структурну схему ЕОМ;

    засоби та способи доступу до елементів структурної схеми ЕОМ;

    набір та доступність регістрів;

    організацію та способи адресації;

    спосіб представлення та формат даних ЕОМ;

    набір машинних команд ЕОМ;

    формати машинних команд;

    обробка переривань.

Основні елементи апаратних засобів комп'ютера: системний блок, клавіатура, пристрої відображення, дисководи, пристрої друку (принтер) і різні засоби зв'язку. Системний блок складається із системної плати, блоку живлення та осередків розширення для додаткових плат. На системній платі розміщені мікропроцесор, постійна пам'ять (ROM), оперативна пам'ять (RAM) та співпроцесор.

      реєстри.

Усередині мікропроцесора інформація міститься у групі з 32 регістрів (16 користувацьких, 16 системних), тією чи іншою мірою доступних для використання програмістом. Оскільки посібник присвячено програмуванню для мікропроцесора 8088-i486, то найлогічніше розпочати цю тему з обговорення внутрішніх регістрів мікропроцесора, доступних для користувача.

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

    вісім 32-бітних регістрів (реєстри загального призначення) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    шість 16 -, бітових регістрів сегментів: CS, DS, SS, ES, FS, GS;

    регістри стану та управління: регістр прапорів EFLAGS/FLAGS, та регістр покажчика команди EIP/IP.

Через похилу межу наведено частини одного 32-розрядного регістру. Приставка E (Extended) означає використання 32-розрядного регістру. p align="justify"> Для роботи з байтами використовуються регістри з приставками L (low) і H(high), наприклад, AL,CH - що позначають молодший і старший байти 16-розрядних частин регістрів.

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

EAX/AX/AH/AL(Accumulator register) – акумулятор. Використовуються при множенні та розподілі, в операціях введення-виводу та в деяких операціях над рядками.

EBX/BX/BH/BL – базовий регістр(Base register), часто використовується при адресації даних у пам'яті.

ECX/CX/CH/CL – лічильник(count register), використовується як лічильник числа повторень циклу.

EDX/DX/DH/DL – регістр даних(Data Register), використовується для зберігання проміжних даних. У деяких командах його використання обов'язково.

Усі регістри цієї групи дозволяють звертатися до своїх «молодших» частин. Використання для самостійної адресації можна лише молодші 16- та 8-бітові частини цих регістрів. Старші 16 біт цих регістрів як самостійні об'єкти недоступні.

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

ESI/SI (source index register) - індекс джерела. Містить адресу поточного джерела.

EDI/DI (distination index register) – індекс приймача(одержувача). Містить поточну адресу в рядку приймача.

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

ESP/SP (stack poINTer register) – регістр вказівника стеку. Містить вказівник вершини стека у поточному сегменті стека.

EBP/BP (base poINTer register) – регістр покажчика бази стека. Призначений для організації довільного доступу до даних усередині стека.

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

У програмній моделі мікропроцесора є шість сегментних регістрів: CS, SS, DS, ES, GS, FS. Їх існування зумовлено специфікою організації та використання оперативної пам'яті мікропроцесорами Intel. Мікропроцесор апаратно підтримує структурну організацію програми, що складається з сегментів.Для вказівки сегментів, доступних в даний момент, призначені сегментні регістри. Мікропроцесор підтримує такі типи сегментів:

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

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

    Сегмент стеку.Цей сегмент є область пам'яті, звану стеком. Мікропроцесор організує стек за принципом - перший "прийшов", перший "пішов". Для доступу до стеку є регістр SS (stack segment register) – сегментний регістр стека, Що містить адресу сегмента стека

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

        Реєстри управління та стану

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

Реєстр покажчика команд EIP/IP;

    регістр прапорів EFLAGS/FLAGS.

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

EIP/IP (instruction poINTer register) – покажчик команд. Регістр EIP/IP має розрядність 32 або 16 біт і містить зміщення наступної команди щодо вмісту сегментного регістру CS в поточному сегменті команд. Цей регістр безпосередньо недоступний, але його зміна проводиться командами переходу.

EFLAGS/FLAGS (Flag register) – регістр прапорів. Розрядність 32/16 біт. Окремі біти даного регістру мають певне функціональне призначення та називаються прапорами. Прапор - це біт, що приймає значення 1 ("прапор встановлений"), якщо виконано деяку умову, і значення 0 ("прапор скинутий") інакше. Молодша частина цього регістру повністю аналогічна регістру FLAGS для i8086.

1.1.3 Реєстр прапорів

Регістр прапорів є 32-розрядним, має ім'я EFLAGS (рис.1). Окремі біти регістру мають певне функціональне призначення та називаються прапорами. Кожному з них надано певне ім'я (ZF, CF тощо). Молодші 16 біт EFLAGS представляють 16-розрядний регістр прапорів FLAGS, що використовується під час виконання програм, написаних для мікропроцесора i086 та i286.

Рис.1 Реєстр прапорів

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

Прапори умов:

CF (carry flag) - прапор перенесення. Приймає значення 1, якщо при додаванні цілих чисел з'явилася одиниця переносу, що не "влазить" у розрядну сітку, або якщо при відніманні чисел без знака перше з них було менше другого. У командах зсуву CF заноситься біт, який вийшов за розрядну сітку. CF також фіксує особливості команди множення.

OF (overflow flag) - прапор переповнення. Встановлюється в 1, якщо при додаванні або відніманні цілих чисел зі знаком вийшов результат, по модулю перевищує допустиму величину (відбулося переповнення мантиси і вона "залізла" у знаковий розряд).

ZF (zero flag) - прапор нуля. Встановлюється в 1 якщо результат команди виявився рівним 0.

SF (SIgn flag) - прапор знаку. Встановлюється в 1, якщо операції над знаковими числами вийшов негативний результат.

PF (parity flag) - прапор парності. дорівнює 1, якщо результат чергової команди містить парну кількість двійкових одиниць. Враховується зазвичай лише за операціях введення-виводу.

AF (auxiliary carry flag) - прапор додаткового перенесення. Фіксує особливості виконання операцій над двійково-десятковими числами.

Прапори станів:

DF (direction flag) - прапор напряму. Встановлює напрямок перегляду рядків у рядкових командах: при DF=0 рядки переглядаються "наперед" (від початку до кінця), при DF=1 - у зворотному напрямку.

IOPL (input/output privilege level) – рівень привілеїв введення-виводу.Використовується в захищеному режимі роботи мікропроцесора, контролю доступу до команд вводу-виводу, залежно від привілейованості завдання.

NT (nested task) - прапор вкладеності завдання.Використовується у захищеному режимі роботи мікропроцесора для фіксації того факту, що одне завдання вкладено в інше.

Системний прапор:

IF (INTerrupt flag) - прапор переривань. При IF=0 процесор перестає реагувати на переривання, що надходять до нього, при IF=1 блокування переривань знімається.

TF (trap flag) - прапор трасування. При TF=1 після виконання кожної команди процесор робить переривання (з номером 1), чим можна скористатися при налагодженні програми для трасування.

RF (resume flag) - прапор відновлення. Використовується для обробки переривань від регістрів налагодження.

VM (virtuAL 8086 mode) - прапор віртуальний 8086. 1-процесор працює у режимі віртуального 8086. 0-процесор працює у реальному чи захищеному режимі.

AC (ALignment check) - прапор контролю вирівнювання.Призначений для дозволу контролю вирівнювання під час звернення до пам'яті.

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

Фізична пам'ять, до якої процесор має доступ, називається оперативною пам'яттю (або оперативним запам'ятовуючим пристроєм - ОЗП).ОЗУ є ланцюжком байтів, що мають свою унікальну адресу (його номер), званий фізичним.Діапазон значень фізичних адрес від 0 до 4 Гбайт. Механізм керування пам'яттю повністю апаратний.

Мікропроцесор апаратно підтримує кілька моделей використання оперативної пам'яті:

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

    сторінкову модель. І тут оперативна пам'ять сприймається як сукупність блоків фіксованого розміру 4 Кбайта. Основне застосування цієї моделі пов'язані з організацією віртуальної пам'яті, що дозволяє використовувати роботи програм простір пам'яті більше, ніж обсяг фізичної пам'яті. Для мікропроцесора Pentium розмір можливої ​​віртуальної пам'яті може сягати 4 Тбайта.

Використання та реалізація цих моделей залежить від режиму роботи мікропроцесора:

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

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

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

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

Кожна програма може складатися з будь-якої кількості сегментів, але безпосередній доступ вона має до трьох основних: коду, даних і стека – і від одного до трьох додаткових сегментів даних. Операційна система розміщує сегменти програми в оперативній пам'яті за певними фізичними адресами, після чого поміщає значення цих адрес у відповідні регістри. Усередині сегмента програма звертається до адрес щодо початку сегмента лінійно, тобто починаючи з адреси 0 і закінчуючи адресою, рівним розміру сегмента. Відносна адреса або зміщення,який мікропроцесор використовує для доступу до даних усередині сегмента, називається ефективним.

Формування фізичної адреси у реальному режимі

У реальному режимі діапазон зміни фізичної адреси становить від 0 до 1 Мбайт. Максимальний розмір сегмента – 64 Кбайт. При зверненні до конкретного фізичною адресоюОперативна пам'ять визначається адресою початку сегмента і зміщення всередині сегмента. Адреса початку сегмента береться із відповідного сегментного регістру. При цьому сегментний регістр містить тільки старші 16 біт фізичної адреси початку сегмента. Молодші чотири біти 20-бітного адреси, що бракують, виходять зсувом значення сегментного регістру вліво на 4 розряди. Операція зсуву виконується апаратно. Отримане 20-бітове значення є справжньою фізичною адресою, що відповідає початку сегмента. Тобто фізична адресазадається як пара "сегмент: зміщення", де "сегмент" (segment) - це перші 16 бітів початкової адреси сегмента пам'яті, якому належить осередок, а "зміщення" - 16-бітова адреса цього осередку, відрахована від початку даного сегмента пам'яті (величина 16 * сегмент +Зміщення дає абсолютну адресу осередку). Якщо, наприклад, у регістрі CS зберігається величина 1234h, тоді адресна пара 1234h:507h визначає абсолютну адресу, що дорівнює 16 * 1234h + 507h = 12340h + 507h = 12847h. Така пара записується у вигляді подвійного слова, причому (як і для чисел) в "перевернутому" вигляді: у першому слові розміщується зміщення, а в другому - сегмент, причому кожне з цих слів у свою чергу представлено в "перевернутому" вигляді. Наприклад, пара 1234h:5678h буде записано так:| 78 | 56 | 34 | 12 |.

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

Тема 2.5 Основи програмування процесора

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

Мова символічного кодування команд називається асемблером.

Мова асемблер- це мова, в якій кожне висловлювання відповідає рівно одній машинній команді.

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

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

1. Це взаємно однозначна відповідність між висловлюваннями мови асемблера та машинними командами.

2. Програміст мовою асемблера має доступ всім об'єктам і командам, присутнім на цільової машині.

Уявлення про основи програмування машинно-орієнтованими мовами корисно для:



Кращого розуміння архітектури ПК та грамотнішого використання комп'ютерів;

Для розробки раціональніших структур алгоритмів програм вирішення прикладних завдань;

Можливості перегляду та коригування виконуваних програм з розширенням.exe і.com, компільованих з будь-яких мов високого рівня, у разі втрати вихідних програм (викликавши вказані програми в налагоджувач програми DEBUG та декомпілювавши їх відображення мовою асемблера);

Складання програм вирішення найбільш відповідальних завдань (програма, складена машинно-орієнтованою мовою, зазвичай ефективніше – коротше і швидше відсотків на 30-60 програм, отриманих в результаті трансляції з мов високого рівня)

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

Програма мовою асемблера може працювати тільки ЕОМ одного сімейства, а програма, написана мовою високого рівня, потенційно може працювати різними машинах.

Алфавіту мови асемблера складають символи ASCII.

Числа лише цілі. Розрізняють:

Двійкові числа, що закінчуються буквою В;

Десяткові числа, що закінчуються буквою D;

Шістнадцяткові числа, що закінчуються літерою Н.

Оперативна пам'ять, регістри, подання даних

Для певної серії МП використається індивідуальна мова складання програм – мова асемблер.

Мова асемблер займає проміжне положення між машинними кодами та мовами високого рівня. Програмувати цією мовою простіше. Програма мовою асемблер більш раціонально використовує можливості конкретної машини (точніше МП), ніж програма мовою високого рівня (який більш простий для програміста, ніж асемблер). Основні принципи програмування машинно-орієнтованими мовами розглянемо на прикладі мови асемблер для МП КР580ВМ80. Для програмування мовою використовується загальна методика. Конкретні технічні прийоми запису програм пов'язані з особливостями архітектури та системи команд цільового МП.

Програмна модель мікропроцесорної системи на основі МП КР580ВМ80

Програмна модель МПС відповідно до рисунка 1

МП Порти Пам'ять

S Z AC P C

Малюнок 1

З погляду програміста МП КР580ВМ80 має такі програмно-доступні регістри.

А– 8-бітовий регістр акумулятора. Є основним регістром МП. Будь-яка операція, що виконується в АЛУ, передбачає розміщення одного з операндів, що підлягають обробці в акумуляторі. Результат операції в АЛУ також зазвичай зберігається в А.

B, C, D, E, H, L- 8-бітові регістри загального призначення (РН). Внутрішня пам'ять МП. Призначені для зберігання інформації, що обробляється, а також результатів операції. При обробці 16-розрядних слів з регістрів утворюють пари BC, DE, HL, причому здвоєний регістр називається першою літерою – B, D, H. У регістровій парі старшим є перший регістр. Особливу властивість мають регістри H, L, які використовуються як для зберігання даних, так і для зберігання 16-розрядних адрес осередків ОЗУ.

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

Розряд С (CY - carry) - перенесення, встановлюється в 1, якщо було перенесення зі старшого розряду байта і під час арифметичних операцій.

Розряд Р (parity) – парність, встановлюється 1, якщо число одиниць у розрядах результату парно.

Розряд АС – додаткове перенесення, призначене для зберігання значення перенесення з молодшого зошита результату.

Розряд Z (нуль) – встановлюється 1, якщо результат операції дорівнює 0.

Розряд S (знак) – встановлюється 1, якщо результат негативний, і 0, якщо результат позитивний.

SP- Покажчик стека, 16-розрядний регістр, призначений для зберігання адреси осередку пам'яті, куди був записаний останній введений в стек байт.

РС– програмний лічильник (лічильник команд), 16-розрядний регістр, призначений для зберігання адреси наступної команди. Вміст лічильника команд автоматично збільшується на 1 відразу після вибірки чергового байта команди.

У початковій області пам'яті адреси 0000Н - 07FF розташовується програма управління і демонстраційні програми. Це область ПЗП.

0800 – 0АFF – область адрес для запису досліджуваних програм. (ОЗП).

0В00 – 0ВВ0 – область адрес для запису даних. (ОЗП).

0ВВ0 - початкова адреса стека. (ОЗП).

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

Формат даних та структура команд мови асемблер

Пам'ять МП КР580ВМ80 є масив 8-ьитных слів, званих байтами, Кожен байт має власний 16-разрядный адресу, визначальний його становище у послідовності осередків пам'яті. МП може адресувати 65536 байт пам'яті, яка може містити як ПЗУ, так і в ОЗУ.

Формат даних

Дані зберігаються у пам'яті у вигляді 8-бітних слів:

D7 D6 D5 D4 D3 D2 D1 D0

Молодшим бітом є біт 0 старшим - біт 7.

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

Формат команд

Команди МП КР580ВМ80 мають один, двох або трибайтний формат. Багатобайтні команди мають бути розміщені у сусідніх ЯП. Формат команди залежить від особливостей операції, що виконується.

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

Він визначає формат команди і ті дії, які повинні бути виконані МП над даними у процесі її виконання, та спосіб адресації, а також може містити інформацію про знаходження даних.

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

Формат однобайтової команди відповідно до рисунка 2

Малюнок 4

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

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


Методи адресації

Усі коди операндів (вхідні та вихідні) повинні десь розташовуватися. Вони можуть бути у внутрішніх регістрах МП (найзручніший і швидкий варіант). Вони можуть розміщуватися в системній пам'яті (найпоширеніший варіант). Нарешті, вони можуть бути у пристроях вводу-виводу (найрідкісний випадок). Визначення місця розташування операндів виконується кодом команди. Існують різні методи, за допомогою яких код команди може визначити, звідки брати вхідний операнд і куди поміщати вихідний операнд. Ці методи називаються методами адресації.

Для МП КР580ВМ80 є такі методи адресації:

Безпосередня;

Реєстрова;

Непряма;

Стекове.

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

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

Реєстрова адресація передбачає, що операнд (вхідний чи вихідний) перебуває у внутрішньому регістрі МП. Використовується в однобайтових командах

Непряма (Неявна) адресація передбачає, що у внутрішньому регістрі МП знаходиться не сам операнд, а його адреса в пам'яті.

Стьова адресація передбачає, що команда містить адресу. Адресація до осередків пам'яті за вмістом 16-розрядного регістру SP (покажчика стека).

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

Система команд МП – це повний перелік елементарних процесів, які здатний виробляти МП. Керований цими командами МП виконує прості дії, такі як елементарні арифметичні та логічні операції, пересилання даних, порівняння двох величин та ін. Число команд МП КР580ВМ80 - 78 (з урахуванням модифікацій 244).

Розрізняють такі групи команд:

Передача даних;

Арифметичні;

Логічні;

Команди переходу;

Команди введення-виводу, управління та роботи зі стеком.


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

Символ Скорочення
ADDR 16-бітова адреса
DATA 8-бітові дані
DATA 16 16-бітові дані
PORT 8-бітова адреса УВВ (пристрої введення-виводу)
BYTE 2 Другий байт команди
BYTE 3 Третій байт команди
R, R1, R2 Один із регістрів: A, B, C, D, E, H, L
RP Одна з реєстрових пар: - задає пару ВС; D - задає пару DE; H – задає пару HL
RH Перший регістр пари
RL Другий регістр пари
Λ Логічне множення
V Логічне складання
Додавання за модулем два
М Осередок пам'яті, адреса якої задає вміст регістрової пари HL, тобто М = (HL)
Поділитися