Міністерство транспорту та зв’язку україни львівський коледж державного університету інформаційно-комунікаційних технологій
Навчальна дисципліна: Обчислювальна техніка та мікропроцесори
Лабораторія: обчислювальної техніки, мікропроцесорних систем і мереж
Спеціальність 5.05090308 Монтаж, обслуговування
та експлуатація апаратних засобів інформатизації
РОЗГЛЯНУТО на засіданні циклової комісії фундаментальних дисциплін Протокол № від ”___”______2009 р. Голова комісії_________О.Лабаз |
|
ЗАТВЕРДЖУЮ Заступник директора з НВР ____________Я.Плешівський „___”________2009 р. |
Інструкція до практичної роботи № 5 складання циклічної програми
Склав викладач: Гамаль М.І. |
Львів – 2010
1.МЕТА РОБОТИ: вивчити прийоми та здобути практичні навики складання циклічних програм з використанням системи команд МП КР580ВМ80.
2.Література:
2.1. Ю.І. Якименко, Т.О.Терещенко, Є.І. Сокол та ін. Мікропроцесорна техніка: Підручник. – Київ. – ІВЦ «Видавництво «Політехніка». – 2004. – 439 с.
2.2. В.І. Бойко, А.М. Гурій, В.Я. Жуйков та ін. Схемотехніка електронних систем: У 3 кн. Кн.2. Цифрова схемотехніка: Підручник. – Київ. – «Вища школа». 2004. – 423 с.
2.3. В.І. Бойко, А.М. Гурій, В.Я. Жуйков та ін. Схемотехніка електронних систем: У 3 кн. Кн.3. Мікропроцесори та мікроконтролери: Підручник. – Київ. – «Вища школа». 2004. – 42
2.4. Б.А. Калабеков, И.А. Мамзелев. Цифровые устройства и микропроцессорные системы.- Москва –Горячая линия – Телеком. – 2003. – 336с.
2.5. Інструкція до даної практичної роботи.
3.Завдання:
3.1.Використовуючи блок-схему алгоритму, команди i8086 умовних та безумовних Переходів скласти програму обрахунку «N - ого» члена арифметичної прогресії:
Де:
- a0-значення першого доданка;
- d - фіксована різниця між попереднім та наступним членами арифметичної прогресії.
Для 1-го варіанта |
Для 2-го варіанта |
Знайти значення 5-го члена прогресії |
Знайти значення 4-го члена прогресії |
a0 = 2 |
a0 = 5 |
d = 6 |
d = 10 |
3.2.В коментарях детально пояснити хід виконання програми.
Рис.1.Блок-схема алгоритму
4. Методичні вказівки.
Циклічному обчислювальному процесу відповідає алгоритм, в якому частина операцій повторюється певне число разів. Блок - схема алгоритму в цьому випадку може мати вид, показаний на рис.1, де у вигляді ромба зображений так званий умовний блок.
Як умови використовуються ознаки, які заносяться у відповідні тригери регістра ознак мікропроцесора. Перевірка ознак полягає в перевірці вмісту цих тригерів і забезпечується перерахованими командами. Ці команди використовуються для організації розгалужень в алгоритмах.
Більшість арифметичних і логічних команд впливають на регістр стану процесора (або прапорці - flags). У цьому регістрі 16 біт. Кожен біт називається прапорцем і може приймати значення 1 або 0.
Carry Flag (CF) - перенос - цей прапор установлюється в 1, коли є беззнакове переповнення. Наприклад, якщо ви збільшили байт 255 + 1 (результат не міститься в діапазоні 0...255). Якщо переповнення не відбувається, цей прапор установлений в 0.
Zero Flag (ZF) - нуль - установлюється в 1, якщо результат дорівнює нулю. Якщо результат не нульовий, то цей прапор установлюється в 0.
Sіgn Flag (SF) - знак - установлений в 1, якщо результат - негативне число. Якщо результат позитивний, то цей прапор установлюється в 0. Звичайно цей прапор приймає значення старшого значущого біта.
Overflow Flag (OF) - переповнення - установлюється в 1, якщо трапляється переповнення при арифметичних операціях зі знаком. Наприклад, якщо ви збільшили байт 100 + 50 (результат не міститься в діапазоні -128...127).
Parіty Flag (PF) - контроль із - цей прапор установлюється в 1, якщо в молодших 8-бітових даних парне число. Якщо число непарне, то цей біт установлений в 0. Навіть якщо результат - це слово, то з тільки 8 молодших біт!
Auxіlіary Flag (AF) - зовнішній перенос - установлений в 1, якщо трапилося переповнення без знака молодших 4-х битов (тобто перенос із 3-го біта).
Іnterrupt enable Flag (ІF) - переривання - якщо цей прапор установлений в 1, то процесор реагує на переривання від зовнішніх пристроїв.
Dіrectіon Flag (DF) - напрямок - цей прапор використається деякими командами для обробки ланцюжка даних. Якщо прапор установлений в 0 - обробка відбувається в прямому напрямку, якщо 1 - у зворотному.
Команди CMP й TEST впливають тільки на прапорці й не записують результат (ця команда використовується для ухвалення рішення під час виконання програми).
Ці команди впливають тільки на прапорці: CF, ZF, SF, OF, PF, AF.
Якщо потрібно порівняти два числових значення, то використовують команду CMP (вона робить те ж саме, що й команда SUB (вирахування), але не зберігає результат, а впливає тільки на прапорці.
наприклад: потрібно порівняти числа 5 й 2,
5 - 2 = 3
результат - НЕ НУЛЬ (Прапор Нуля - Zero Flag (ZF) установлений в 0).
Інший приклад: потрібно порівняти 7 й 7,
7 - 7 = 0
результат - НУЛЬ! (Прапорець Нуля - Zero Flag (ZF) встановлений в 1 і команди JZ або JE виконають перехід).
Керування ходом програми - дуже важлива річ. Це те, що змушує програму приймати рішення, залежно від деяких умов.
Безумовні Переходи Основна команда, що передає керування в іншу крапку програми - це JMP.
Основний синтаксис команди JMP:
JMP мітка
Щоб оголосити мітку у вашій програмі, просто надрукуйте її ім'я й наприкінці додайте двокрапку ":". Мітка може бути будь-якою комбінацією символів, але не повинна починатися із цифри. Наприклад, нижче представлені три правильних оголошення міток:
label1:
label2:
a:
Мітка може бути оголошена на окремому рядку або перед будь-якою іншою командою, наприклад: x1:
MOV AX, 1 x2: MOV AX, 2
Приклад команды JMP:
ORG 100h
MOV AX, 5 ; записати в AX число 5.
MOV BX, 2 ; записати у ВX число 5.
JMP calc ; перейти до 'calc'.
back: JMP stop ; перейти до 'stop'.
calc:
ADD AX, BX ; додати BX до AX.
JMP back ; перейти до 'back'.
stop:
RET ; повернутися в операційну систему.
END ; директива для припинення компіляції.
Команда JMP може передавати керування іншій ділянці програми, що може перебувати як після цієї команди, так і перед нею. Цей перехід може бути здійснений у межах поточного сегмента коду (65,535 байтів).
Короткі умовні переходи
Подібно до команди JMP, що виконує безумовний перехід, існують команди, які здійснюють умовний перехід (перехід, що здійснюється тільки в тому випадку, якщо виконується певна умова). Ці команди розділяються на три групи. Перша група тільки перевіряє окремий прапорець, друга - порівнює числа зі знаком, третя - порівнює числа без знака.
Для того щоб прийняти рішення про те, куди буде передане керування командою умовного переходу, попередньо повинна бути сформована умова, на основі якої і буде прийматися рішення про передачу керування. Джерелами такого типу умов можуть бути:
будь-яка команда, яка змінює стан арифметичних прапорців;
команда порівняння cmp, яка порівнює значення двох операндів;
Команда cmp має наступний синтаксис:
cmp операнд_1, операнд_2
(compare) – порівнює два операнди і за результатами порівняння встановлює прапорці.
Команди Переходу, що перевіряють одиночний прапор
Команда |
Опис |
Умова |
Обернена команда |
JZ , JE |
Перехід, якщо " = 0 " ("нуль"). Якщо порівнювані значення однакові, то ZF = 1 і перехід виконається |
ZF = 1 |
JNZ, JNE |
JC , JB, JNAE |
Перехід, якщо є перенесення |
CF = 1 |
JNC, JNB, JAE |
JS |
Перехід по знаку. |
SF = 1 |
JNS |
JO |
Перехід по переповненні |
OF = 1 |
JNO |
JPE, JP |
Перехід, якщопаритет. |
PF = 1 |
JPO |
JNZ , JNE |
Перехід якщо р-тат " не = 0" |
ZF = 0 |
JZ, JE |
JNC , JNB, JAE |
Перехід, якщо немає перенесення |
CF = 0 |
JC, JB, JNAE |
JNS |
Перехід, яекщо немає знака. |
SF = 0 |
JS |
JNO |
Перехід, якщо немає переповнення. |
OF = 0 |
JO |
JPO, JNP |
Перехід, якщо результат непарний |
PF = 0 |
JPE, JP |
Існують команди, які виконують однакові дії. Це нормально. Вони навіть асемблюються в однаковий машинний код, тому буде непогано, якщо ви запам'ятаєте, що при компіляції команди JE, після дизасемблювання ви одержите її як: JZ.
Різні імена використовуються для того, щоб робити програми більш легкими для розуміння й кодування.
Команди Переходу для чисел зі знаками
Команда |
Опис |
Умова |
Обернена команда |
JE , JZ |
Перехід, якщо "нуль". |
ZF = 1 |
JNE, JNZ |
JNE , JNZ |
Перехід, якщо "не нуль". |
ZF = 0 |
JE, JZ |
JG , JNLE |
Перехід, якщо "більше" (>). Перехід, якщо "не меньше чи однаково" (not <=). |
ZF = 0 SF = OF |
JNG, JLE |
JL , JNGE |
Перехід, якщо "меньше" (<). Перехід, якщо "не більше чи однаково" (not >=). |
SF <> OF |
JNL, JGE |
JGE , JNL |
Перехід, якщо "більше чи однаково" (>=). Перехід, якщо "не меньше" (not <). |
SF = OF |
JNGE, JL |
JLE , JNG |
Перехід, якщо "меньше чи однаково" (<=). Перехід, якщо "не більше" (not >). |
ZF = 1 SF <> OF |
JNLE, JG |
<> - цей знак означає "не дорівнює".
Команди Переходу для чисел без знаків
Команда |
Опис |
Умова |
Обернена команда |
JE , JZ |
Перехід, якщо "нуль". |
ZF = 1 |
JNE, JNZ |
JNE , JNZ |
Перехід, якщо "не нуль". |
ZF = 0 |
JE, JZ |
JA , JNBE |
Перехід, якщо "більше" (>). Перехід, якщо "не меньше чи однаково" (not <=). |
CF = 0 and ZF = 0 |
JNA, JBE |
JB , JNAE, JC |
Перехід, якщо "нижче" (<). Перехід, якщо "не більше чи однаково" (not >=). Перехід по переносу. |
CF = 1 |
JNB, JAE, JNC |
JAE , JNB, JNC |
Перехід, якщо "більше чи однаково" (>=). Перехід, якщо "не меньше" (not <). Перехід, якщо "немає перенесення". |
CF = 0 |
JNAE, JB |
JBE , JNA |
Перехід, якщо "меньше чи однаково" (<=). Перехід, якщо "не більше" (not >). |
CF = 1 or ZF = 1 |
JNBE, JA |
Приклад використання команди CMP й умовного перехіду:
іnclude emu8086.іnc
ORG 100h
MOV AL, 25 ; записати в AL число 25.
MOV BL, 10 ; записати в BL число 10.
CMP AL, BL ; зрівняти AL з BL.
JE equal ; якщо AL = BL (ZF = 1), те перейти до мітки equal.
PUTC 'N' ; інакше, якщо AL <> BL, те продовжити виконання
JMP stop ; програми - надрукувати 'N' і перейти до мітки stop.
equal: ; якщо програма на цій мітці,
PUTC 'Y' ; те AL = BL, тому виводимо на екран 'Y'.
stop:
RET ; сюди приходимо в кожному разі
END
Всі умовні Переходи мають одне серйозне обмеження - на відміну від команди JMP, вони можуть виконувати перехід тільки на 127 байтів уперед або на 128 байтів назад (врахуйте, що більші команди асемблюються в 3 і більше байтів).
Можна легко перебороти це обмеження, використовуючи наступний метод:
Взяти зворотну команду з наведеної вище таблиці й виконати перехід до мітки label_x.
Використати команду JMP для Переходу до потрібної ділянки програми.
Визначити мітку label_x: тільки після команди JMP.
label_x: - може бути будь-яким ім'ям.
Інакший метод, являє собою застосування безпосереднього значення (адреси) замість мітки. Якщо безпосереднє значення починається із символу '$', то виконується відносний перехід - перехід щодо поточної адреси. Компілятор обчислює команду, що перебуває по заданому зсуві, і виконує перехід безпосередньо до неї.
Наприклад:
ORG 100h
; безумовний перехід уперед:
; пропускаємо наступні два байти,
JMP $2
a DB 3 ; 1 байт.
b DB 4 ; 1 байт.
; перехід назад на 7 байтів, якщо BL <> 0:
; (Команда JMP займає 2 байти)
MOV BL,9
DEC BL ; 2 байти.
CMP BL, 0 ; 3 байти.
JNE $-7
RET
END