- •Архітектура і система команд мікропроцесорів
- •1. Архітектура еом
- •1. 1. Поняття про архітектуру еом
- •1.2. Програмна модель мікропроцесора Intel Pentium III
- •Сегментні регістри
- •Регістри стану і керування
- •1.4. Організація пам’яті
- •Сегментована модель пам’яті
- •Формування фізичного адреса в реальному режимі
- •Типи даних
- •Формат команд
- •Типи переривань
- •Структура програми на асемблері
- •Синтаксис асемблера
- •Директиви сегментації
- •Прості типи даних
- •Системи числення
- •Двійкова система числення
- •Шістнадцяткова система числення
- •Перевод із десяткової і шістнадцяткової системи у двійкову
- •Перевод із десяткової і двійкової у шістнадцяткову систему
- •Числа із знаком
- •Структура машинної команди
- •Способи задання операндів
- •Адресація пам’яті
- •Функціональна класифікація машинних команд
- •Команди обміну даними
- •Команди пересилання даних
- •Ввід-вивід в порт
- •Робота з адресами і вказівниками
- •Перетворення даних
- •Робота із стеком
- •Арифметичні цілочисельні команди
- •Цілі двійкові числа
- •Додавання двійкових чисел без знаку
- •Додавання двійкових чисел із знаком
- •Віднімання двійкових чисел без знаку
- •Віднімання двійкових чисел із знаком
- •Множення двійкових чисел без знаку
- •Множення двійкових чисел із знаком
- •Ділення двійкових чисел без знаку
- •Ділення двійкових чисел із знаком
- •Команди перетворення типів
- •4.2. Десяткові числа
- •Неупаковані bcd-числа
- •Упаковані bcd-числа
- •Логічні команди
- •Логічні команди
- •Команди зсуву
- •Лінійний зсув
- •Циклічний зсув
- •Додаткові команди зсуву
- •Команди передачі керування
- •Команди безумовного переходу;
- •Команди безумовного переходу
- •Процедури
- •Умовні переходи
- •Команда порівняння cmp
- •Команди умовного переходу і прапори
- •Команди умовного переходу і регістр ecxlcx
- •6.4. Організація циклів
- •Ланцюжкові команди
- •Пересилання ланцюжків
- •Порівняння ланцюжків
- •Сканування ланцюжків
- •Завантаження ланцюжків
- •Формування ланцюжків
- •Ввід-вивід елементів у порт
- •Складні структури даних
- •Доступ до елементів масиву
- •Двомірні масиви
- •8.2. Структури
- •Описання шаблона структури
- •Визначення даних з типом структури
- •Методи роботи із структурою
- •Об’єднання
- •Визначення екземпляру запису
- •Робота з записами
- •Макрозасоби мови асемблера
- •Макрокоманди
- •Макродирективи
- •Директиви while і rept
- •Директиви irp і irpc
- •Директиви умовної компіляції
- •Директиви компіляції по умові
- •Директиви if і ife
- •Директиви ifdef і ifndef
- •Директиви ifb і ifnb
- •Директиви ifidn, ifidni, ifdif і ifdifi
- •9.4. Директиви генерації помилок
- •%Out недопустиме ім’я регістра
Процедури
Процедура (підпрограма) – це основна одиниця декомпозиції деякої задачі. Синтаксис описання процедури:
Ім’я_процедури PROC [ [модифікатор_мови] мова] [віддаль] ] [ARG список_параметрів]
[RETURNS список_параметрів] [LOCAL список_аргументів] [USES список_регістрів]
…
тіло процедури (команди, директиви)
…
[ім’я_процедури] ENDP
Як видно, обов’язковим є тільки задання директив PROC і ENDP. У директиві PROC є операнд [віддаль], який може мати значення near, far і характеризує можливість звернення із другого сегмента. Процедура може знаходитися:
o на початку програми; o в кінці програми;
o в середині другої процедури або основної програми. У цьому випадку необхідно передбачити обхід процедури з допомогою команди jmp;
o у другому модулі.
Ім’я процедури має ті ж атрибути, що і звичайна мітка, тому до неї можна звернутися з допомогою любої команди переходу. Проте є спеціальний механізм виклику процедури, який зберігає контекст (інформація про стан програми у точці виклику процедури). Є дві команди, що здійснюють роботу із контекстом: call і ret:
call [модифікатор] ім’я_процедури – виклик процедури. Команда call передає керування по адресу з символічним іменем ім’я_процедури і при в стекові зберігається адрес повернення. Адрес повернення – це адрес команди, наступної після call.
ret [число] – повернути керування викликаючій програмі. Команда ret зчитує адрес повернення із стека і завантажує його в регістри cs і ip/eip. [число] – необов’язковий параметр, який вказує скільки елементів видалити із стека при поверненні.
Виклик процедури може бути:
o внутрішньосегментним – процедура знаходиться у поточному сегменті коду (має тип near) і в якості адреса повернення зберігається вміст регістра ip/eip;
o міжсегментним – процедура знаходиться у другому сегменті коду (має тип far) і в якості адреса повернення зберігається вміст регістрів cs і ip/eip.
Умовні переходи
Є 18 команд умовного переходу, які дозволяють перевірити: o відношення між операндами із знаком (більше-менше); o відношення між операндами без знака (вище-нище); o стан арифметичних прапорів (zf, sf, cf, of, pf).
Синтаксис команд умовного переходу:
jcc мітка_перехода
Значення абревіатури в назві команді jcc наведено в табл. 1. Мітка переходу може знаходитися тільки в межах поточного сегменту. Для того, щоб прийняти рішення, куди буде передано керування, необхідно сформувати умову. Джерелом такої умови можуть бути:
o люба команда, що міняє стан арифметичних прапорів; o команда порівняння cmp, що порівнює значення двох операндів; o стан регістру ecx/cx.
Команда порівняння cmp
Команда cmp віднімає операнди і порівнює прапори:
cmp операнд_1, операнд_2
Прапори, які встановлює команда команда cmp, можна аналізувати спеціальними командами умовного переходу із табл. 6.1. Так як команди умовного переходу не змінюють прапорів, то то після однієї команди cmp може слідувати декілька команд умовного перехода.
Табл. 6.1
Перелік команд умовного переходу для команди cmp
Типи операндів |
Мнемокод |
Критерій умовного переходу |
Значення прапорів для перехода |
Любі |
je |
операнд_1 = операнд_2 |
zf=1 |
Любі |
jne |
операнд_1 <> операнд_2 |
zf=0 |
Із знаком |
jl/jnge |
операнд_1 < операнд_2 |
sf<>of |
Із знаком |
jle/jng |
операнд_1 <= операнд_2 |
sf<>of або zf=1 |
Із знаком |
jg/jnle |
операнд_1 > операнд_2 |
sf=of і zf=0 |
Із знаком |
jge/jnl |
операнд_1 => операнд_2 |
sf=of |
Без знаку |
jb/jnae |
операнд_1 < операнд_2 |
cf=1 |
Без знаку |
jbe/jna |
операнд_1 <= операнд_2 |
cf=1 або zf=1 |
Без знаку |
ja/jnbe |
операнд_1 > операнд_2 |
cf=0 і zf=0 |
Без знаку |
jae/jnb |
операнд_1 => операнд_2 |
cf=0 |
* Примітка. g-більше, l-менше, а-вище, b-нище
