Основні команди мови асемблер. Загальна характеристика системи команд мови Assembler для IBM-PC (базовий набір команд, основні способи адресації операндів). Структура програми мовою Assembler Основні компоненти мови асемблер та структура команд

Загальні відомостіпро мову асемблера

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

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

Символічні імена, введені під час програмування мовою асемблера, зазвичай відбивають семантику програми, а абревіатура команд - їх основну функцію. Наприклад: PARAM – параметр, TABLE – таблиця, MASK – маска, ADD – додавання, SUB – віднімання і т.д. п. Такі імена легко запам'ятовуються програмістом.

Для програмування мовою асемблера необхідно мати складні інструментальні засоби, ніж при програмуванні машинною мовою: потрібні обчислювальні комплекси на базі мікро - ЕОМ або ПЕОМ з комплектом периферійних пристроїв(Алфавітно-цифрова клавіатура, символьний дисплей, НГМД і друкувальний пристрій), а також резидентні або крос-системи програмування для необхідних типів мікропроцесорів. Мова асемблера дозволяє ефективно писати та налагоджувати значно більше складні програми, ніж машинна мова (до 1 – 4 Кбайт).

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

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

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

За допомогою мови асемблера програміст може задати такі параметри:

мнемоніку (символічне ім'я) кожної команди машинної мови мікропроцесора;

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

формат для вказівки різних способівадресації та варіантів команд;

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

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

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

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

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

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

· Операційної - визначальною, "що робити";

· Операндний - визначальною об'єкти обробки, "з чим робити".

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

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

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

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

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

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

Пряма адресація: ефективна адреса визначається безпосередньо полем усунення машинної команди, яке може мати розмір 8, 16 або 32 біти.

mov eax, sum; eax = sum

Асемблер замінює sum на відповідну адресу, що зберігається в сегменті даних (за замовчуванням адресується регістром ds) і значення, що зберігається за адресою sum, поміщає регістр eax.

Непряма адресаціяу свою чергу має такі види:

· Непряма базова (реєстрова) адресація;

· Непряма базова (реєстрова) адресація зі зміщенням;

· Непряма індексна адресація;

· Непряма базова індексна адресація.

Непряма базова (реєстрова) адресація.За такої адресації ефективна адреса операнда може перебувати в будь-якому з регістрів загального призначеннякрім sp/esp і bp/ebp (це специфічні регістри для роботи з сегментом стека). Синтаксично у команді цей режим адресації виражається укладанням імені регістру в квадратні дужки.

mov eax, ; eax = * esi; *esi значення за адресою esi

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

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

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

Варіант 2

СХІДНО-СИБІРСЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ

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

____________________________________________________________________

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

ЗАВДАННЯ

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

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

Висновок. 8

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


Вступ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

· Макроси.

Набір команд

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

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

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

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

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

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

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

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

· jne - перейти, якщо не одно;

· jge - перейти, якщо більше або дорівнює.

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

ПЛАН ЛЕКЦІЇ

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

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

Структури в мові асемблер

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

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

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

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

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

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

    Задати шаблон структури .

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

    Визначити екземпляр структури .

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

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

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

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

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

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

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

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

Опис шаблону структури має наступний синтаксис:

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

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

Тут є послідовністю директив опису даних db, dw, dd, dqі dt.

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

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

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

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

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

Визначимо структуру запису цієї бази даних наступним шаблоном:

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

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

[ім'я змінної] ім'я_структури

    ім'я змінної- Ідентифікатор змінної цього структурного типу.

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

    список значень- Укладений у кутові дужки список початкових значень елементів структури, розділених комами.

    Його завдання також необов'язкове.

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

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

    Наприклад: victor worker.

Наприклад визначимо кілька змінних із типом описаної вище структури.

Методи роботи із структурою

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

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

    адресний_вираз- ідентифікатор змінної деякого структурного типу або вираз у дужках відповідно до наведених нижче синтаксичними правилами (рис. 1);

    ім'я_поля_структури- ім'я поля шаблон структури.

    Це, насправді, теж адреса, а точніше, усунення поля від початку структури.

Таким чином оператор " . (точка) обчислює вираз

Мал. 5. Синтаксис адресного виразу оператора звернення до поля структури

Продемонструємо з прикладу певної нами структури worker деякі прийоми роботи із структурами.

Наприклад, отримати в axзначення поля із віком. Так як навряд чи вік працездатної людини буде більшим за величину 99 років, то після приміщення вмісту цього символьного поля в регістр axйого буде зручно перетворити на двійкове представлення командою aad.

Будьте уважні, оскільки через принцип зберігання даних "молодший байт за молодшою ​​адресою"старша цифра віку буде поміщена в al, а молодша - у ah.

Для коригування достатньо використати команду xchg al, ah:

mov ax,word ptr sotr1.age; al вік sotr1

а можна й так:

Подальша робота з масивом структур проводиться так само, як і з одновимірним масивом. Тут виникає кілька запитань:

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

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

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

Наприклад:

Як виконати копіювання поля з однієї структури до відповідного поля іншої структури? Або як виконати копіювання всієї структури? Давайте виконаємо копіювання поля namтретього співробітника у полі namп'ятого співробітника:

mas_sotr worker 10 dup ()

mov bx,offset mas_sotr

mov si, (type worker) * 2; si = 77 * 2

mov di, (type worker) * 4; si = 77 * 4

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

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

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