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

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

ПЛАН ЛЕКЦІЇ

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

Pentium.

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

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

Операцііпересилкі,

Аріфметіческіеопераціі,

Логіческіеопераціі,

Операціісдвіга,

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

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

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

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

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

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

Команди пересилання. Основний командою цієї групи є командаMOV , Яка забезпечує пересилку даних між двома регістрами або між регістром і осередком пам'яті. У деяких процесорах реалізується пересилка між двома осередками пам'яті, а також групове пересилання вмісту декількох регістровіз пам'яті. Наприклад, мікропроцесори сімейства 68xxx компанії 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 в регістрі стану відповідно до отриманим результатом. При цьому результат віднімання не зберігається, і значення операндів не змінюються. Подальший аналіз отриманих значень ознак дозволяє визначити відносне значення (\u003e,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

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

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

Команди цієї групи реалізують різні варіанти ізмененіятестіруемогобіта.Команда BT зберігає значення цього біта незмінним .Команда B T S послетестірованія встановлює значення bn\u003d 1, а команда B T C - значення bn\u003d 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 \u003d 0, CF \u003d 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 "(Захищений режим). Для реалізації цього режиму використовується спеціальні групи команд, які служать для організації захисту пам'яті відповідно до прийнятого алгоритмом пріоритетного звернення.

За призначенням можна виділити команди (в дужках наводяться приклади мнемонічних кодів операцій команд асемблера ПК типу IBM PC):

l виконання арифметичних операцій (ADD і ADC - складання та складання з перенесенням, SUB і SBB - віднімання і віднімання з позичкою, MUL і IMUL - множення без знака і зі знаком, DIV і IDIV - ділення без знака і зі знаком, CMP - порівняння і т.д.);

l виконання логічних операцій (OR, AND, NOT, XOR, TEST і т. д.);

l пересилання даних (MOV - переслати, XCHG - обміняти, IN - ввести в мікропроцесор, OUT - вивести з мікропроцесора і т. д.);

l передачі управління (розгалуження програми: JMP - безумовного переходу, CALL - виклику процедури, RET - повернення з процедури, J * - умовного переходу, LOOP - управління циклом і т. д.);

l обробки рядків символів (MOVS - пересилання, CMPS - порівняння, LODS - завантаження, SCAS - сканування. Ці команди зазвичай використовуються з префіксом (модифікатором повторення) REP;

l переривання роботи програми (INT - програмні переривання, INTO - умовного переривання при переповненні, IRET - повернення з переривання);

l управління мікропроцесором (ST * і CL * - установки і скидання прапорів, HLT - зупинки, WAIT - очікування, NOP - холостого ходу і т. д.).

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

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

l MOV dst, src - пересилання даних (move - переслати з src в dst).

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

Операнди dst і src повинні мати однаковий формат - байт або слово.

Src можуть мати тип: r (register) - регістр, m (memory) - пам'ять, i (impedance) - безпосереднє значення. Dst можуть бути типу r, m. Не можна в одній команді використовувати операнди: rsegm спільно з i; два операнда типу m і два операнда типу rsegm). Операнд i може бути і простим виразом:

mov AX, (152 + 101B) / 15

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

l PUSH src - занесення слова в стек (push - проштовхнути; записати в стек ізsrc). Поміщає в вершину стека вміст src - будь-якого 16-бітового регістра (в тому числі і сегментного) або двох елементів пам'яті, що містять 16-бітове слово. Прапори не міняються;

l POP dst - витяг слова з стека (pop - виштовхнути; вважати з стека в dst). Знімає слово з вершини стека і поміщає його в dst - будь-який 16-бітовий регістр (в тому числі і сегментний) або в два відділення пам'яті. Прапори не міняються.

Для того щоб машина могла виконати команди людини на апаратному рівні, необхідно задати певну послідовність дій на мові «нуликів і одиниць». Помічником у цій справі стане Асемблер. Це утиліта, яка працює з перекладом команд на машинну мову. Проте написання програми - досить трудомісткий і складний процес. Дана мова не призначений для створення легких і простих дій. На даний момент будь-який використовується мова програмування (Асемблер працює прекрасно) дозволяє написати спеціальні ефективні завдання, які сильно впливають на роботу апаратної частини. Основним призначенням є створення мікрокоманд і невеликих кодів. Дана мова дає більше можливостей, ніж, наприклад, Паскаль або С.

Короткий опис мов Асемблера

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

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

Коротко про структуру мови

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

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

Для кожної лінійки процесора існує своя При такому розкладі правильним буде будь-який процес, в тому числі і перекладений

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

плюси мови

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

Драйвера, операційні системи, BIOS, компілятори, інтерпретатори і т. Д. - це все програма на мові Асемблера.

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

мінуси мови

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

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

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

команди мови

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


Використання директив

Програмування мікроконтролерів на мові (Асемблер це дозволяє і прекрасно справляється з функціонуванням) найнижчого рівня в більшості випадків закінчується вдало. Найкраще використовувати процесори з обмеженим ресурсом. Для 32-розрядної техніки дана мова підходить відмінно. Часто в кодах можна помітити директиви. Що ж це? І для чого використовується?

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


походження назви

Завдяки чому отримав назву мову - "Асемблер"? Йдеться про транслятор і компілятор, які і виробляють зашифрування даних. З англійської Assembler означає не що інше, як збирач. Програма не була зібрана вручну, була використана автоматична структура. Більш того, на даний момент вже у користувачів і фахівців стерлася різниця між термінами. Часто Ассемблером називають мови програмування, хоча це всього лише утиліта.

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

макрозасоби

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

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

Курсова робота

З дисципліни «Системне програмування»

Тема №4: «Рішення задач на процедури»

Варіант 2

СХІДНО-Сибірський державний університет

ТЕХНОЛОГІЙ І УПРАВЛІННЯ

____________________________________________________________________

ТЕХНОЛОГІЧНИЙ КОЛЕДЖ

ЗАВДАННЯ

на курсову роботу

дисципліна:
Тема: Рішення задач на процедури
Виконавець (і): Главінская Аріна Олександрівна
Керівник: ДамбаеваСесегма Вікторівна
Короткий зміст роботи: вивчення підпрограм на мові Асемблера,
рішення задач з використанням підпрограм
1. Теоретична частина: Основні відомості про мову Асемблер (набір
команд і т.д.), Організація підпрограм, Способи передачі впараметров
в підпрограма
2. Практична частина: Розробити дві підпрограми, одна з яких перетворює будь-яку задану букву в заголовну (в тому числі для російських букв), а інша перетворює букву в малу.
перетворює будь-яку задану букву в заголовну, а інша перетворює букву в малу.
перетворює букву в малу.
Терміни виконання проекту за графіком:
1. Теоретична частина - 30% до 7 тижня.
2. Практична частина - 70% до 11 тижня.
3. Захист - 100% до 14 тижня.
Вимоги до оформлення:
1. Розрахунково-пояснювальна записка курсового проекту повинна бути представлена \u200b\u200bв
електронної та твердої копіях.
2. Обсяг звіту повинен бути не менше 20 машинописних сторінок без урахування додатків.
3. РПЗ оформлюється за ГОСТом 7.32-91 і підписується у керівника.

Керівник роботи __________________

виконавець __________________

Дата видачі " 26 " вересня 2017 м


Вступ. 2

1.1 Основні відомості про мову Асемблер. 3

1.1.1 Набір команд. 4

1.2 Організація підпрограм в мові Асемблер. 4

1.3 Способи передачі параметрів в підпрограма. 6

1.3.1 Передача параметрів через регістри .. 6

1.3.2 Передача параметрів через стек. 7

2 ПРАКТИЧНИЙ РОЗДІЛ .. 9

2.1 Постановка завдання. 9

2.2 Опис рішення задачі. 9

2.3 Тестування програми .. 7

Висновок. 8

Список літератури .. 9


Вступ

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

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

Друга область застосування Ассемблера пов'язана з оптимізацією виконання програм. Дуже часто програми-перекладачі (компілятори) з мов високого рівня дають вельми неефективну програму на машинній мові. Зазвичай це стосується програм обчислювального характеру, в яких більшу частину часу виконується дуже невеликий (близько 3-5%) ділянку програми (головний цикл). Для вирішення цієї проблеми можуть використовуватися так звані багатомовні системи програмування, які дозволяють записувати частини програми на різних мовах. Зазвичай основна частина програми записується на мові програмування високого рівня (Фортране, Паскалі, С і т.д.), а критичні за часом виконання ділянки програми - на Асемблері. Швидкість роботи всієї програми при цьому може значно збільшитися. Часто це єдиний спосіб змусити програму дати результат за прийнятний час.

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

Завдання роботи:

1. Вивчити основні відомості про мову Асемблер (структура і компоненти програми на Асемблері, формат команд, організація підпрограм і ін.);

2. Вивчити види бітових операцій, формат і логіку роботи логічних команд Асемблера;

3. Вирішити індивідуальну завдання на застосування підпрограм в Асемблері;

4 .. Сформулювати висновок про виконану роботу.

1 ТЕОРЕТИЧНИЙ РОЗДІЛ

Основні відомості про мову Асемблер

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

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

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

Гідності й недоліки

· Мінімальна кількість надлишкового коду (використання меншої кількості команд і звернень в пам'ять). Як наслідок - велика швидкість і менший розмір програми;

· Великі обсяги коду, велике число додаткових дрібних завдань;

· Погана читабельність коду, труднощі підтримки (налагодження, додавання можливостей);

· Труднощі реалізації парадигм програмування та будь-яких інших скільки-небудь складних конвенцій, складність спільної розробки;

· Меншу кількість доступних бібліотек, їх мала сумісність;

· Безпосередній доступ до апаратури: портам вводу-виводу, особливим регістрів процесора;

· Максимальна «підгонка» для потрібної платформи (використання спеціальних інструкцій, технічних особливостей «заліза»);

· Непереносимість на інші платформи (крім двійковій сумісних).

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

· Визначення даних (констант і змінних);

· Управління організацією програми в пам'яті і параметрами вихідного файлу;

· Завдання режиму роботи компілятора;

· Всілякі абстракції (тобто елементи мов високого рівня) - від оформлення процедур і функцій (для спрощення реалізації парадигми процедурного програмування) до умовних конструкцій і циклів (для парадигми структурного програмування);

· Макроси.

набір команд

Типовими командами мови асемблера є:

· Команди пересилання даних (mov і ін.)

· Арифметичні команди (add, sub, imul і ін.)

· Логічні та побітові операції (or, and, xor, shr і ін.)

· Команди управління ходом виконання програми (jmp, loop, ret і ін.)

· Команди виклику переривань (іноді відносять до команд управління): int

· Команди вводу-виводу в порти (in, out)

Для мікроконтролерів і мікрокомп'ютерів характерні також команди, що виконують перевірку і перехід по умові, наприклад:

· Jne - перейти, якщо не дорівнює;

· Jge - перейти, якщо більше або равнo.

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-разраядного регістра. Для роботи з байтами використовуються регістри з приставками 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) - індекс приймача (Одержувача). Містить поточну адресу в рядку приймачі.

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

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 \u003d 0 рядки проглядаються "вперед" (від початку до кінця), при DF \u003d 1 - в зворотному напрямку.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Поділитися