- •Теоретичні відомості
- •1. Структура простої програми мовою асемблера. Формат кодування програми.
- •2. Основні директиви : segment , end, ends, proc, endp, assume.
- •3. Основні вимоги при створенні програми. Приклади простих програм мовою асемблера.
- •4. Трансляція програми. Опції компіляції та загальна характеристика.
- •6. Застосування програми налагодження для пошуку помилок.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •Теоретичні відомості
- •1. Директиви визначення даних.
- •2. Директива повторення dup.
- •3. Сталі.
- •5. Представлення в пам’яті цілих чисел.
- •6. Команда пересилки даних mov.
- •7. Команди двійкового додавання та віднімання.
- •Команда зміни знаку операнда neg
- •8. Обчислення цілих арифметичних виразів.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •1. Команда безумовного переходу jmp. Типи адресів переходу short,near та far.
- •2. Команди організації циклів ( loop,loopn,loopnz). Команда loop. Керування циклом за ecx/cx.
- •Керування циклом за ecx/cx із врахуванням ознаки zf
- •3. Команди умовних переходів.
- •5. Команда lea
- •Команда роботи зі стеком push та pop
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Логічні операції та операції зсувів.
- •2. Команди логічних операцій (and, test, or, xor, not).
- •3. Команди зсувів та циклічних зсувів.
- •Команди зсувів (sal, sar, shl,shr)
- •Команда зсуву логічного операнда вправо – shr
- •3.2 Команди циклічних зсувів (rol, ror ,rcl, rcr). Циклічний зсув операнда вліво - rol
- •Циклічний зсув операнда вправо ror
- •Циклічний зсув операнда вліво через ознаку переносу - rcl
- •Циклічний зсув операнда вправо через ознаку переносу – rcr
- •Бітові маски.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •1. Множення цілих чисел
- •2. Ділення цілих чисел
- •3. Перетворення в регістрах
- •Алгоритм введення–виведення цілих чисел
- •Виведення цілих чисел.
- •Введення цілих чисел.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •Особливості команд обробки рядків.
- •Ознака df. Команди зміни ознаки ( cld, std ).
- •Префікси повторення( rep, repe, repz, repne, repze ).
- •Команди обробки символьних рядків
Керування циклом за ecx/cx із врахуванням ознаки zf
Синтаксис LOOPE/LOOPZ мітка
LOOPNE/LOOPNZ мітка
Алгоритм роботи:
виконати декремент умісту регістра ECX/CX;
проаналізувати регістр ECX/CX:
якщо ECX/CX =0, передати керування наступної за LOOPXX команді;
якщо ECX/CX =1, передати керування команді, мітка який зазначена в якості операнда LOOPXX;
аналіз прапора ZF:
якщо ZF=0, для команд LOOPE/LOOPZ це означає вихід з циклу, для команд LOOPNE/LOOPNZ — перехід до початку циклу;
якщо ZF=1, для команд LOOPE/LOOPZ це означає перехід до початку циклу, для команд LOOPNE/LOOPNZ — вихід з циклу.
Виконання команди не впливає на ознаки.
Команду LOOP застосовують для організації циклу з лічильником. Кількість повторень циклу задається значенням у регістрі ECX/CX перед входом у послідовність команд, що складають тіло циклу. Пам'ятайте про два важливі моменти:
для запобігання виконання циклу при нульовому ECX/CX використовуйте команду JECXZ/JCXZ. Якщо цього не зробити, то при початковому нульовому значенні вмістимого регістру ECX/CX цикл повториться 4 294 967 295/65 536 разів;
зсув мітки, що є операндом LOOP, не повинне виходити з діапазону -128...+127 байт.
3. Команди умовних переходів.
Призначення: перехід всередині поточного сегменту в залежності в умов.
Схема команди : Jcc мітка
JCXZ мітка
JECXZ мітка
Алгоритм роботи команд (крім JCXZ/JECXZ):
Перевірка стану ознак у залежності від коду операції (код операції відображає умову, яка перевіряється):
якщо умова істина, то перейти до осередку, позначеної операндом;
якщо умова хибна, то передати керування наступній команді.
Команди умовного переходу зручно застосовувати для перевірки умов, що виникають у процесі виконання програми. Багато команд мови асемблера за результатами своєї роботи формують ознаки, які записуються в регістрі ознак EFLAGS/FLAGS. Команди умовних переходів аналізують ці ознаки та здійснюють переходи в залежності від проведеного аналізу. Нижче приведені перелік команд умовного переходу та ознаки які ними аналізуються та відповідні їм логічні умови переходу.
Команда |
Стан ознак, які перевіряються |
Умова переходу |
JA |
CF = 0 і ZF = 0 |
якщо вище |
JAE |
CF = 0 |
якщо вище або дорівнює |
JB |
CF = 1 |
якщо нижче |
JBE |
CF = 1 або ZF = 1 |
якщо нижче або дорівнює |
JC |
CF = 1 |
якщо перенос |
JE |
ZF = 1 |
якщо дорівнює |
JZ |
ZF = 1 |
якщо 0 |
JG |
ZF = 0 і SF = OF |
якщо більше |
JGE |
SF = OF |
якщо більше або дорівнює |
JL |
SF <> OF |
якщо менше |
JLE |
ZF=1 або SF <> OF |
якщо менше або дорівнює |
JNA |
CF = 1 і ZF = 1 |
якщо не вище |
JNAE |
CF = 1 |
якщо не вище або дорівнює |
JNB |
CF = 0 |
якщо не нижче |
JNBE |
CF=0 і ZF=0 |
якщо не нижче або дорівнює |
JNC |
CF = 0 |
якщо немає переносу |
JNE |
ZF = 0 |
якщо не дорівнює |
JNG |
ZF = 1 або SF <> OF |
якщо не більше |
JNGE |
SF <> OF |
якщо не більше або дорівнює |
JNL |
SF = OF |
якщо не менше |
JNLE |
ZF=0 і SF=OF |
якщо не менше або дорівнює |
JNO |
OF=0 |
якщо немає переповнення |
JNP |
PF = 0 |
якщо кількість одиничних , бітів результату непарний (непарний паритет) |
JNS |
SF = 0 |
якщо знак плюс (знаковий (старший) біт результату дорівнює 0) |
JNZ |
ZF = 0 |
якщо немає нуля |
JO |
OF = 1 |
якщо переповнення |
JP/JPE |
PF = 1 |
якщо кількість одиничних бітів результату парний (парний паритет) |
JPO |
PF = 0 |
Те ж, що і JNP |
JS |
SF = 1 |
якщо знак мінус (знаковий (старший) біт результату дорівнює 1) |
JZ |
ZF = 1 |
якщо нуль |
Логічні умови "більше" і "менше" використовуються при порівняні цілочислових значень зі знаком, а "вище і "нижче" — при порівняні цілочислових значень без знака. Якщо уважно подивитися в таблицю, то в багатьох команд мови асемблера однакові значення ознак для переходу. Це пояснюється наявністю декількох ситуацій, що можуть викликати однаковий стан ознак. У цьому випадку з метою зручності асемблер допускає кілька різних мнемонічних позначень однієї і тієї ж машинної команди умовного переходу. Ці команди асемблера за дію абсолютно рівнозначні, тому що одна машинна команда. У мікропроцесорі і8086 команди умовного переходу могли здійснювати тільки короткі переходи(SHORT) в межах -128...+127 байт, починаючи від наступної команди. З мікропроцесора i386, ці команди можуть виконувати переходи в межах поточного сегмента команд. Для реалізації міжсегментних переходів необхідно комбінувати команди умовного переходу і команду безумовного переходу JMP. При цьому можна скористатися тим, що практично всі команди умовного переходу парні, тобто мають команди, що перевіряють зворотні умови.
Алгоритм роботи команди JCXZ/JECXZ:
Перевірка умови рівності нулю вмісту регістра ECX/CX:
якщо умова істинна, тобто вміст ECX/CX дорівнює 0, то перейти до осередку, позначеної операндом мітка;
якщо умова хибна, тобто вміст ECX/CX не дорівнює 0, то передати керування наступної за JCXZ/JECXZ команді програми.
Застосування JCXZ/JECXZ:
Команда |
Стан ознак у EFLAGS/FLAGS |
Умова переходу |
JCXZ |
Не впливає |
якщо регістр CX=0 |
JECXZ |
Не впливає |
якщо регістр ECX=0 |
Команду JCXZ/JECXZ зручно використовувати з усіма командами, що використовують регістр ECX/CX для своєї роботи. Це команди організації циклу і ланцюжкових команди. Важливо відзначити те, що команда JCXZ/JECXZ, на відміну від інших команд переходу, може виконувати тільки близькі переходи в межах -128...+127 байт, починаючи від наступної команди.