Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






ЛАБОРАТОРНА РОБОТА N 3. Визначення даних.




Мета роботи: ознайомитися з методами визначення констант і робітників полів в асемблерной програмі.

 

КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

 

У лабораторній роботі N 1_1 ми задавали необхідні нам дані безпосередньо в команді. Наприклад, ми писали

 

MOV AX,25

 

У цьому випадку число 25 стає частиною машинного об'єктного коду.

Такий спосіб представлення даних дометаний, якщо задане число (у нашому випадку 25) зустрічається у Вашій програмі один раз. Якщо ж задане число зустрічається в програмі багаторазово, то повторне завдання його в різних командах приведе до невиправданої витрати оперативної пам'яті. Пам'ять під Ваше число буде виділятися щораз, коли Ви його указывете. Більш дометаним є запис числа в осередок оперативної пам'яті, присвоєння цьому осередку мнемонічного імені, і потім звертання до заданого числа вже по імені. У цьому випадку пам'ять під число буде виділятися один раз.

У тій же лабораторній роботі N 1_1 ми використовували для збереження результатів обчислень (проміжних і остаточних) регістри загального призначення. Такий спосіб є найбільш швидкодіючим. Однак, у регістрах можна зберігати

дуже обмежений обсяг інформації.

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

 

В Асемблері для опису вихідних даних і робітників областей в оперативній пам'яті служать директиви ВИЗНАЧЕННЯ ДАНИХ.

За допомогою цих директив Ви можете задавати КОНСТАНТИ (числа, значення яких визначаються у вихідному тексті Вашої програми) і ПЕРЕМІННІ (робітники області визначеної довжини, значення яких може змінюватися в процесі роботи Вашої програми).

Основний формат визначення даних

[ім'я] Dn вираження

Ім'я елемента даних не обов'язково, однак, якщо Ви хочете в програмі звертатися до цього елемента, Ви повинні це ім'я вказати. Ім'я задаєте Ви самі за правилами відповідним правилам написання міток (див. лаб. раб. N1_1).

Директиви визначення даних (Dn) можуть використовуватися наступні: DB (байт), DW (слово), DD (подвійне слово), DQ (учетверенное слово) і DT (десять байт).

У поле 'вираження' може знаходитися:

1. Константа.

Наприклад:

ABC DB 25

2. Послідовність констант.

Наприклад:

BCD DB 1,2,3,4,5

Константи в послідовності повинні розділятися комами. Кількість констант у послідовності обмежується довжиною рядка. Ім'я (у нашому приклад BCD) указує на першу константу з послідовності (у нашому прикладі - 1). До другої константи (2) можна звертатися по імені BCD+1, до третин - BCD+2 і так далі.

3. Як вираження може стояти знак питання (?) для невизначеного значення перемееной:

 

CDE DB (?)

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

4. Вираження допускає повторення чи константи перемінної в наступному виді

 

[ім'я] Dn число_повторень DUP (вираження)

наприклад,

 

DEF DB 10 DUP(?)

Опертор повторення (DUP) може бути вкладеним, наприклад:

 

EFH DB 10 DUP(4 DUP(2))

У цьому випадку будуть сгенерированы спочатку 4 копії константи 2, а потім це значення повториться 10 разів. У результаті буде сформована послідовність із сорока двійок.

Константа, що задається в поле 'вираження' може являти собою символьний чи рядок числову константу.

СИМВОЛЬНИЙ РЯДОК використовується для представлення тексту. Вона полягає в чи апострофи лапк, наприклад 'Лабораторна робота N 5' чи "Лабораторна робота N 5'

Асемблер переводить кожен символ символьного рядка у відповідний ASCіі-код. Символьний рядок визначається директивою DB, у якій указується більш двох символів у нормальній послідовності ліворуч праворуч.

 

NAME1 DB 'Лаборатороная робота N 5'

 

ЧИСЛОВІ КОНСТАНТИ застосовуються для арифметичних значень і для адрес пам'яті. Числова константа вказується в директиві визначення даних безпосередньо, без чи лапк апострофів. Асемблер перетворить усі числові константи в двоичные і записує їх як послідовність байтів у зворотній послідовності - праворуч ліворуч.

Числові константи можуть задаватися в наступних форматах.

ДЕСЯТКОВИЙ ФОРМАТ приймається по допускає десяткові цифри від 0 до 9 і позначається останньою буквою D. Десятковий формат приймається за замовчуванням, тобто якщо ніяка буква після числа не зазначена, те це десятковий формат. Десятковий формат перетвориться Асемблером у двоичный, котрий у листинге записується в шістьнадцятковому форматі.

Наприклад,

NAME2 DB 12D

чи

NAME2 DB 12

ШІСТЬНАДЦЯТКОВИЙ ФОРМАТ допускає цифри від 0 до F і бозначается наприкінці буквою H. Тому що Асемблер думає, що з букви починаються імена, то першою цифрою шістьнадцяткової константи повинна бути цифра від 0 до 9. Якщо Вам потрібно, наприклад, задати константу A0C1H, то можна записати її у вигляді0A0C1H.

 

NAME3 DB 0CH

 

ДВІЙКОВИЙ ФОРМАТ допускає цифри 0 і 1 і позначається наприкінці буквою B.

 

NAME4 DB 11001010B

 

ВІСІМКОВИЙ ФОРМАТ допускає цифри від 0 до 7 і позначається останньою буквою Q чи O. В даний час вісімковий формат використовується рідко.

 

NAME5 DB 10Q

 

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

При завданні символьних рядків і числових констант варто пам'ятати, що, наприклад, '14' і 14 являють собою дві різні константи. Перша перетвориться в два байти ASCіі-кода, що відповідають символам 1 і 4. Друга перетвориться в двійкове число 1110, у шестнадцатиричном представленні 0E.

ДИРЕКТИВА ВИЗНАЧЕННЯ БАЙТА (DB) - визначити байт.Символьне вираження в диретиве DB може містити символьний рядок будь-якої довжини (обмежується тільки довжиною асемблерной рядка). Числова константа в диретиве DB може містити одну чи більш однобайтовых констант. Один байт у листинге представляється двома шістьнадцятковими цифрами. Найбільше позитивне шістьнадцяткове число в одному байті - 7F, усі великі числа від 80 до FF представляють негативні значення. У десятковому форматі ці межі виражаються числами +127 і -128.

Приклади використання директиви визначення байта:

NAME6 DB?

NAME7 DB 'Завдання N 5'

NAME8 DB 12H

NAME9 DB 112

NAME10 DB 01101100B

NAME11 DB 10,11,12,13,14

NAME12 DB 2 DUP(10)

ДИРЕКТИВА ВИЗНАЧЕННЯ СЛОВА (DW) визначає константи і переменыые имеющие довжину в одне слово - два байти. Символьне вираження в DW обмежено двома символами, що Асемблер переставляє в зворотному порядку. Числове вираження в DW може містити одну чи більш двухбайтовых констант. Два байти представляються чотирма шестнадцатиричными цифрами. Найбільше позитивне шестнадцатиричное число в двох байтах - 7FFF, числа від 8000 до FFFF представляють негативні значення. У десятковому коді ці межі виражаються числами +32767 і -32768. У поле 'вираження' директиви DW може бути підставлене ім'я чи константи перменной, визначеної раніше, наприклад

NAME13 DW NAME8

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

Для директив DW, DD, DQ Асемблер перетворить константи в шестнадцатиричный об'єктний код, але записує їх у зворотному порядку проходження байтів. Таким чином, десяткове значення 12345 перетвориться в 3039H, але записується в об'єктному коді як 3930.

Приклади використання директиви визначення слова:

NAME14 DW?

NAME15 DW 23,64

NAME16 DW '12'

NAME17 DW NAME15

NAME18 DW 0110111100001010B

NAME19 DW 1F0BH

ДИРЕКТИВА ВИЗНАЧЕННЯ ПОДВІЙНОГО СЛОВА (DD) визначає

елементи, що мають у довжину два слова - чотири байти. Розмір числових констант, використовуваних у вираженні не повинний перевищувати чотирьох байт (вісім шестнадцатиричных цифр). Найбільше позитивне шестнадцатиричное число, що може бути використане в директиві DD, - 7FFFFFFF. Діапазон негативних чисел - від 80000000 до FFFFFFFF. У десятковому коді діапазон припустимих чисел у цій директиві - від +2147483647 до -2147483648. Асемблер перетворить усі числові константи в шестнадцатиричное представлення, але записує об'єктний код у зворотній послідовності. Десяткове значення 12345 перетвориться в 00003039H, але записується в об'єктному коді як 39300000. Символьне вираження в директиві DD обмежено двома символами. Асемблер перетворить їх у ASCіі-код і вирівнює їх ліворуч як показано в приведеній нижче рядку листинга

0010 33 32 00 00 NAME20 DD '23'

Приклади використання директиви визначення подвійного слова:

NAME21 DD 1F00FFFFH

NAME22 DD 'AB'

NAME23 DD?

NAME24 DD 45,47,49

NAME25 DD NAME23-NAME21

ДИРЕКТИВА ВИЗНАЧЕННЯ УЧЕТВЕРЕННОГО СЛОВА (DQ) визначає елементи, що мають довжину чотири слова (вісім байт). Використовувані в директиві числові константи не повинні перевищувати розмір вісім байт. Асемблер перетворить усі числові константи в шестнадцатиричное вираження, але записує їх в об'єктний код у зворотній послідовності. Обробка Асемблером символьних рядків у директиві DQ аналогічна обробці в директивах DW і DD.

Приклади використання директиви визначення учетверен-

ного слова:

NAME26 DQ 245H

NAME27 DQ 100

ДИРЕКТИВА ВИЗНАЧЕННЯ ДЕСЯТИ БАЙТ (DT) визначає елементи даних, що мають довжину десять байт. Призначена в основному для визначення так званих "упакованих десяткових" числових значень. Генерируемый об'єктний код залежить

від версії Асемблера.

Приклади використання директиви визначення десяти байт:

NAME28 DT?

NAME29 DT '23'

БЕЗПОСЕРЕДНІ ОПЕРАНДЫ.

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

MOV AL, XX

безпосередній операнд, що ми позначили як ХХ, повинний мати довжину один байт, так регістр AL є однобайтовым регістром.

У команді

MOV AX, XX

безпосередній операнд може мати довжину слово (два байти).

При недотриманні цього правила транслятор згенерує повідомлення про помилку.

ДИРЕКТИВА EQU.

Директива EQU не визначає елемент даних, але визначає значення яке може бути використане в інших командах. Наприклад, якщо Ви задали

KOL EQU 10

те щораз, коли транслятор у тексті Вашої програми зустріне KOL, він замість нього підставить значення 10. Так транслятор перетворить директиву

NAME30 DW KOL DUP(?)

у директиву

NAME30 DW 10 DUP(?)

Ім'я, зв'язане з деяким значенням за допомогою директиви EQU, може використовуватися в якості операнда в команді. Наприклад,

MOV AX, KOL

Транслятор замінить ім'я KOL на значення 10, створюючи безпосередній операнд, як якби було задано

MOV AX, 10

 

ПІДГОТОВКА ДО РОБОТИ

1. Вивчити короткі теоретичні відомості і рекомендовану літературу.

2. Написати текст програми, що відповідає вашому варіанту.

 

РОБОЧЕ ЗАВДАННЯ

Набити підготовлену програму, странслировать неї. При трансляції створити листинг.

 

ВИМОГА ДО ЗВІТУ

У звіті зафіксувати листинг файлу з підготовленою

програмою.

 

КОНТРОЛЬНІ ПИТАННЯ

1. У чому відмінність представлення в пам'яті двох констант

NAMEA DB 42

NAMEB DB '42'

 

2. Яке значення подставится замість імені NAMED у вираженні

NAMEC DW 20

NAMED DW NAMEC

 

3. Як буде представлена в об'єктному коді константи

NAMEF DD '12'

NAMEE DD 2756

 

ВАРІАНТИ ЗАВДАНЬ

 

· Напишіть програму, що визначає перераховані в завданні поля даних і константи.

· Виконаєте трансляцію. Створіть листинг.

· exe-файл не створювати!! Програма не призначена для виконання.

· Модифікуйте програму з лабораторної роботи N 1_1 так, щоб опис констант був зроблений у сегмент даних.

 

Варіант 1

1. Визначення байта:

1.1. Неініціалізоване поле;

1.2. Символьний рядок, що містить Ваше прізвище, ім'я, по батькові;

1.3. Десяткова константа 54;

1.4. Число у символьній формі '54';

1.5. Двійкова константа, що відповідає десятковому числу 67;

1.6. Шістнадцятиткова константа, що відповідає десятковому числу 84;

1.7. 11 десяткових чисел 93;

 

2. Визначення слова:

2.1. Шістнадцятиткова константа, що відповідає десятковому числу 20389;

2.2. Двійкова константа, що відповідає десятковому числу 28256;

2.3. Адресна константа, що вказує на константу з п.1.3.;

2.4. 3 послідовних константи, що є числами натурального ряду;

2.5. 3 десяткових чисел 4273;

 

3. Визначення подвійного слова:

3.1. Неініціалізоване поле;

3.2. Шістнадцятиткова константа, що відповідає десятковому числу 1036117869;

3.3. Різниця констант і з п.п.2.1 і 1.5;

3.4. Дві десяткові константи:номер вашого варіанта і номер лабораторної роботи;

3.5. Десяткова константа 1904188434;

3.6. Дійсне число-номер варіанта(N.0)

 

Варіант2

1.Визначення байта:

1.1. Неініціалізоване поле;

1.2. Символьний рядок,що містить ваше прізвище, ім'я, побатькові;

1.3. Десяткова константа27;

1.4. Число в символьній формі'27';

1.5. Двійкова константа, що відповідає десятковому числу 168;

1.6. Шестнадцатиричная константа, що відповідає десятичному числу 39;

1.7.11 десяткових чисел 117;

 

2.Визначення слова:

2.1. Шістнадцятиткова константа, що відповідає десятковому числу 23384;

2.2. Двійкова константа,що відповідає десятковому числу 42500;

2.3. Адресна константа,що вказує на константу з п.1.3.;

2.4. 10 послідовних констант, що є числами натурального ряду;

2.5. 10 десяткових чисел 12679;

 

3.Визначення подвійногослова:

3.1. Неініціалізоване поле;

3.2. Шістнадцятиткова константа, що відповідає десятковому числу 143976745;

3.3.Різниця адрес констант з п.п.2.1 і 1.5;

 

3.4. Дві десяткові константи: номер вашого варіанта і номер лабораторної роботи;

3.5. Десяткова константа 2092352629;

3.6. Дійсне число-номер варіанта (N.0)

 

Варіант3

1. Визначення байта:

1.1. Неініціалізоване поле;

1.2. Символьний рядок, що містить Ваше прізвище, ім'я, побатькові;

1.3. Десяткова константа 82;

1.4. Число в символьній формі '82';

1.5. Двійкова константа, що відповідає десятковому числу 165;

1.6. Шістнадцятиткова константа, що відповідає десятковому числу 24;

1.7. 4 десяткових чисел 109;

 

2.Визначенняслова:

2.1. Шістнадцятиткова константа, що відповідає десятковому числу 61;

2.2. Двійкова константа,що відповідає десятковому числу 36222;

2.3.Адресна константа, що вказує на константу з п.1.3.;

2.4.11 послідовних констант, що представляють собою числа натурального ряду;

2.5.11 десяткових чисел 28795;

 

3.Визначенняподвійногослова:

3.1. Неініціалізоване поле;

3.2. Шістнадцятиткова константа,що відповідає десятковому числу 1098474874;

3.3.Різниця адрес констант з п.п.2.1 і 1.5;

3.4.Дві десяткові константи:номер вашого варіанта і номер лабораторної роботи;

3.5.Десяткова константа 1266133827;

3.6. Дійсне число-номер варіанта (N.0)

 

Варіант4

1.Визначеннябайта:

1.1. Неініціалізоване поле;

1.2.Символьний рядок, що містить ваше прізвище, ім'я, побатькові;

1.3.Десяткова константа 66;

1.4.Число в символьній формі '66';

1.5. Двійкова константа, що відповідає десятковому числу 118;

1.6. Шістнадцятиткова константа, що відповідає десятковому числу 23;

1.7.3 десяткових числа 118;

 

2.Визначення слова:

2.1. Шістнадцятиткова константа, що відповідає десятковомучислу 8362;

2.2. Двійкова константа,що відповідає десятковому числу 38184;

2.3.Адресна константа, що вказує на константу з п.1.3.;

2.4.9 послідовних констант, що представляють собою числа натурального ряду;

2.5.9 десяткових чисел 22566;

 

3.Визначення подвійного слова:

3.1. Неініціалізоване поле;

3.2. Шістнадцятиткова константа, що відповідає десятковому числу 1117888353;

3.3.Різниця адрес констант з п.п.2.1 і 1.5;

3.4.Дві десяткові константи:номер вашого варіанта і номер лабораторної роботи;

3.5.Десяткова константа 311108693;

3.6. Дійсне число-номер варіанта (N.0)

 

Варіант5

1.Визначення байта:

1.1. Неініціалізоване поле;

1.2. Символьний рядок, що містить ваше прізвище, ім'я, побатькові;

1.3. Десяткова константа 67;

1.4. Число у символьній формі '67';

1.5. Двійкова константа,що відповідає десятковому числу 9;

1.6. Шістнадцятиткова константа, що відповідає десятковому числу 41;

1.7. 9 десяткових чисел 61;

 

2.Визначенняслова:

2.1. Шістнадцятиткова константа, що відповідає десятковомучислу 349;

2.2. Двійкова константа, що відповідає десятковому числу 62059;

2.3.Адресна константа, що вказує на константу з п.1.3.;

2.4.11 послідовних констант, що представляють собою числа натурального ряду;

2.5.11 десяткових чисел 28237;

 

3.Визначенняподвійногослова:

3.1. Неініціалізоване поле;

3.2. Шістнадцятиткова константа,що відповідає десятковому числу 695959382;

3.3.Різниця адрес констант з п.п.2.1 і 1.5;

3.4.Дві десяткові константи:номер вашого варіанта і номер лабораторної роботи;

3.5.Десяткова константа 1059954500;

3.6. Дійсне число-номер варіанта (N.0)

 

Варіант6

1.Визначеннябайта:

1.1. Неініціалізоване поле;

1.2.Символьний рядок, що містить ваше прізвище, ім'я, побатькові;

1.3.Десяткова константа 24;

1.4.Число в символьній формі '24';

1.5. Двійкова константа, що відповідає десятковому числу 230;

1.6. Шістнадцятиткова константа,що відповідає десятковому числу 39;

1.7.7 десяткових чисел 94;

 

2.Визначенняслова:

2.1. Шістнадцятиткова константа, що відповідає десятковому числу 2287;

2.2. Двійкова константа, що відповідає десятковому числу 56710;

2.3.Адресна константа, що вказує на константу з п.1.3.;

2.4.4 послідовних констант, що є числами натурального ряду;

2.5.4 десяткових чисел 19498;

 

3.Визначення подвійного слова:

3.1. Неініціалізоване поле;

3.2. Шістнадцятиткова константа, що відповідає десятковому числу 111381706;

3.3.Різниця адрес констант з п.п.2.1 і 1.5;

3.4.Дві десяткові константи: номер вашого варіанта і номер лабораторної роботи;

3.5.Десяткова константа 1230190873;

3.6. Дійсне число-номер варіанта (N.0)


2.5. Лабораторна робота N4. Організація процесів, що розгалужуються

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

 

КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

У лабораторній роботі N 2 Ви написали програму, команды якої виконуються послідовно в тім порядку, у якому Ви їх записали. Така програма являє собою лінійний процес. У даній роботі ми розглянемо, як организовать процес що розгалужується - процес, порядок виконання якого залежить від результатів його виконання. Прикладом процесу, що розгалужується, може служити найпростіший алгоритм:

1. Задано два числа A і B.

2. Якщо A>B, обчислити C=A+B.

3. У противному випадку, тобто, якщо A<=B, обчислити

C=B-A.

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

Имеюся три типи переходів (передачі керування).

Перехід типу SHORT передає керування в межах изменения адреси на один байт (-128 - +127).

Перехід типу NEAR передає керування в межах одного сегмента.

Перехід типу FAR передає керування в інший сегмент.

При переходах SHORT і NEAR змінюється тільки вміст покажчика команд ІP. При FAR-переході змінюється вміст покажчика команд ІP і кодового сегментного регістра CS.

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

БЕЗУМОВНИЙ ПЕРЕХІД.

Безумовний перехід здійснює передачу керування при будь-яких обставинах.

Для виконання безумовного переходу в Ассемблере используется команда JMP.

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

MOV AX, 0;у AX накопичується сума

MOV BX, 1;у BX формуються числа натурального ряду

A20: ADD AX, BX

ADD BX, 1

JMP A20

Команда JMB A20 передає керування команді з міткою A20:. Двокрапка після мітки означає, що тип мітки NEAR, тобто мітка знаходиться усередині сегмента кодів. Звернете внимание: при вказівці мітки в команді JMB двокрапка після імені мітки не ставиться.

Мітку можна записувати в одному рядку з командою

A20: ADD AX, BX

чи в окремому рядку

A20:

ADD AX, BX

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

Розглянемо листинг даної програми.

Turbo Assembler Versіon 2.5 09/16/96 02:16:06 Page 1

exam6.asm

1 0000 CODESG SEGMENT PARA 'Code'

2 ASSUME CS:CODESG,DS:CODESG,SS:CODESG

3 ORG 100H

4 0100 MAІ PROC NEAR

5 0100 B8 0000 MOV AX, 0;у AX накопичується

сума

6 0103 BB 0001 MOV BX, 1;у BX формуються-числа натурального ряду

7 0106 03 C3 A20: ADD AX, BX

8 0108 83 C3 01 ADD BX, 1

9 010B EB F9 JMP A20

10 010D MAІ ENDP

11 010D CODESG ENDS

12 END MAІ

У нашому прикладі операнд команди JMB (мітка A20) соотвествует -7 байт від команди, що випливає за JMP, у чому можна переконатися по об'єктному коді команди EBF9. Тут EB - машинный код для короткого переходу JMP, а F9 – негативне значення зсуву (-7). Команда JMP додає F7 до командному покажчику (ІP), що містить адресу команди, випливающей за JMP (010D). У результаті додавання виходить адреса переходу (0106). Операнд у команді JMP для переходу вперед буде мати позитивне значення.

Команда JMB для переходу в межах від -128 до +127 байт має тип SHORT. Ассемблер генерує в цьому випадку однобайтовый операнд у межах від 00 до FF. Команда JMP превисхідна ці межі, одержує тип FAR, для якого генірируется інший машинний код і двухбайтовый операнд. Транслятор у першому перегляді вихідної програми визначає довжину кожної команди. Якщо до моменту перегляду команди JMP транслятор вже обчислив значення операнда (при переході назад)

A50:....

....

JMP A50

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

JMP A90

........

A90:

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

JMP SHORT A90

.....

A90:

УМОВНИЙ ПЕРЕХІД

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

КОМАНДИ УМОВНОГО ПЕРЕХОДУ здійснюють передачу управления в залежності від результату виконання попередньої команды.

Команди умовного переходу використовують єдиний операнд, що містить адреса (мітку), на який повинний бути суще

ствлен перехід. Відстань від команди переходу до заданої адреси повинне бути менше 128 байт (перехід типу SHORT).

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

ФЛАГОВЫЙ РЕГІСТР. Флаговый регістр зберігає у вигляді бітових полів результати виконання операцій (ознаки нульового, негативного результату, переповнення розрядної сітки й ін.). Прапори зберігають своє значення доти, поки інша команда не змінить їх.

Формат флагового регістра

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

----------------------------------------------------------------------

| X | X | X | X | O | D | І | T | S | Z | X | A | X | P | X | C |

| | | | | F | F | F | F | F | F | | F | | F | | F |

----------------------------------------------------------------------

Х відзначені біти, які не використовуються.

CF (Carry Flag) - прапор переносу. Містить значення переносов (0 чи 1) зі старшого розряду при арифметичних операціях і деяких операціях зсув і циклічного сдвига.

PF (Parіty Flag) - прапор парності. Перевіряє молодші 8 битов операцій на даними. Непарне число битов приводить до установки цього прапора в 0, парне - у 1. Не слід плутати цей прапор з бітом контролю на парність.

AF (Auxіlіary Carry Flag) - допоміжний прапор переносу. Встановлюється в 1, якщо арифметична операція приводить до переносу четвертого справ біта (біта номер 3) у регистровой однобайтовой команді. Даний прапор має відношення до арифметичних операція над символами коду ASCІІ і до десятичным упакованих полів.

ZF (Zero Flag) - прапор нуля. Установлюється як результат арифметичних команд і команд порівняння. При нульовому результаті - 1, при ненульовому - 0.

SF (Sіgn Flag) - прапор знака. Встановлюється в соответствии зі знаком результату (старшого біта) після арифметических операцій. При позитивному результаті - 0, при відємном - 1.

TF (Trap Flag) - прапор трасування. Якщо цей прапор встановлен в одиничний стан, то процесор переходить у режим покрокового виконання команд.

ІF (Іnterrupt Flag) - прапор переривання. При нульовому стані цього прапора переривання заборонені, при одиничному дозволені.

DF (Dіrectіon Flag) - використовується в строкових операциях для визначення напрравления передачі даних.

OF (Overflow Flag) - прапор переповнення. Фіксує арифметическое переповнення, тобто перенос у(з) старший (знаковый) розряд при знакових арифметичних операціях.

Наприклад, команда CMP порівнює два операнда. Операнды в процесі виконання команди не змінюються. Команда используется для перевірки співвідношень дорівнює, не дорівнює, більше, меньше, чи більше дорівнює, чи менше дорівнює. Впливає на прапори AF, CF, OF, PF, SF, ZF. По своїй суті команда CMP совпадає з командою SUB, за винятком того, що не змінюється операнд-приемник. Немає необхідності перевіряти всі прапори, установлювані командою CMP окремо. У наступному примері перевіряється, чи містить регістр BX нульове значення:

CMP BX, 00;порівняння BX з 0

JZ B50;перехід на B50, якщо 0

...;дії не при нулі

...

B50:...;крапка переходу при BX=0

 

Якщо BX містить нульове значення, команда CMP устанавливает прапор нуля ZF в одиничний стан і, можливо изменяет (чи ні) інші прапори. Команда JZ (перехід, якщо нуль) перевіряє тільки прапор ZF. При одиничному значенні ZF, обозначающем нульовий результат, команда передає керування на адрес, зазначений у її операнде, тобто на мітку B50.

Розглядаючи призначення команд умовного переходу, слід пояснити характер їх використання. Типи даних над которыми виконуються арифметичні операції й операції сравнения, визначають, якими командами користатися: беззнаковыми чи знаковими. Беззнакові дані використовують усі біти як біти даних. Характерним прикладом є символьні рядки і натуральні числа. У знакових даних самий лівий біт являє собою знак, причому, якщо його значення дорівнює нулю, то число позитивне, а якщо дорівнює одиниці – отрицательное.

Як приклад припустимо, що регістр AL містить 11000110, а BL - 00010110.

Команда

CMP AL, BL

порівнює вміст регистро AL і BL. Якщо дані рассматриваются як знакові, то значення в BL більше, якщо як беззнакові, то значення в AL більше.

 

КОМАНДИ ПЕРЕХОДУ ДЛЯ БЕЗЗНАКОВИХ ДАНИХ.

Мнемоніка Опис

прапори, що перевіряються

JE/JZ Перехід, якщо дорівнює/нуль ZF

JNE/JNZ Перехід, якщо не дорівнює/не нуль ZF

JA/JNBE Перехід, якщо вище/чи не нижче ZF, CF дорівнює

JAE/JNB Перехід, якщо чи вище дорівнює/ CF не нижче

JB/JNAE Перехід, якщо нижче/ чине вище CF дорівнює

JBE/JNA Перехід, якщо чи нижче дорівнює/ CF, AF не вище

Будь-яку перевірку можна кодувати одним із двох мнемонических кодів. Наприклад, JB і JNAE генерує той самий об'єктний код, хоча позитивну перевірку JB легше зрозуміти, чим негативну JNAE.

 

КОМАНДИ ПЕРЕХОДУ ДЛЯ ЗНАКОВИХ ДАНИХ.

Мнемоніка Опис

прапори, Що Перевіряються

JE/JZ Перехід, якщо дорівнює/нуль ZF

JNE/JNZ Перехід, якщо не дорівнює/не нуль ZF

JG/JNLE Перехід, якщо більше/не меньне ZF,SF,OF

чи дорівнює

JGE/JNL Перехід, якщо більше чи дорівнює/ SF,OF

не менше

JL/JNGE Перехід, якщо менше/не більше SF,OF

чи дорівнює

JLE/JNG Перехід, якщо чи менше дорівнює/ ZF,SF,OF

не більше

Команди переходу для умови дорівнює чи нуль (JE/JZ) і не дорівнює чи не нуль (JNE/JNZ) присутні в обох списках для знакових і беззнакових даних. Стан дорівнює/нуль виходить незалежно від наявності знака.

 

СПЕЦІАЛЬНІ АРИФМЕТИЧНІ ПЕРЕВІРКИ

Мнемоніка Опис Що Перевіряється

JS Перехід, якщо є знак SF (негативно)

JNS Перехід, якщо немає знака SF (позитивно)

JC Перехід, якщо є перенос CF (аналогічно JB)

JNC Перехід, якщо немає переносу CF

JO Перехід, якщо є переповнення OF

JNO Перехід, якщо немає переповнення OF

JP/JPE Перехід, якщо паритет парний PF

JNP/JPO Перехід, якщо паритет непарний PF

 

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

 

1 0000 codesg segment para 'code'

2 assume cs:codesg,ds:codesg,ss:codesg

3 org 100h

4 0100 EB 07 90 maіn: jmp begіn

5 0103 0006 a dw 6

6 0105 0005 b dw 5

7 0107???? c dw?

8;нехай змінні a,b і c знаходяться відпо-

9;відно у змінних A, B і C

10 0109 begіn proc near

11 0109 A1 0103r MOV AX,A; занесемо A у регістр AX

12 010C 3B 06 0105r CMP AX,B; порівняємо AX з B

13 0110 7F 09 JG L1; якщо AX більше B

14; перейдемо на L1

15 0112 29 06 0105r SUB B,AX; інакше віднімемо з B A

16 0116 A1 0105r MOV AX,B

17 0119 EB 04 JMP SHORT L2; перейдемо на мітку L2

18 011B 03 06 0105r L1: ADD AX,B; складемо A і B

19 0122 C3 RET

21 0123 begіn endp

22 0123 codesg ends

23 end maіn

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

 

ПІДГОТОВКА ДО РОБОТИ

1. Вивчити короткі теоретичні відомості і рекомендованну літературу.

2. Написати текст програми у відповідності зі своїм варіантом.

 

РОБОЧЕ ЗАВДАННЯ

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

 

ВИМОГА ДО ЗВІТУ

У звіті зафіксувати листинг файлу з налагодженої программой.

 

КОНТРОЛЬНІ ПИТАННЯ

1. На яку максимальну кількість байт можна виконати перехід командами JMP і командами умовного переходу.

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

3. На які прапорці впливають наступні події:

- відбувся перенос;

- результат негативний;

- відбулося переповнення;

- результат нульовий.

ВАРІАНТИ ЗАВДАНЬ

Обчислити вирази:

№ варіанту Вираз
  a-b, якщо a<>b x={c,якщо a=b a=10h;b=12h;c=0}
  a-b, якщо a<>b x={c,якщо a=b a=23h;b=05h;c=07h}
  a-b, якщо a<>b x={ c,якщо a=b a=14h;b=14h;c=0Ah}
  a-b, якщо a=b x={ c,якщо a<>b a=12h;b=12h;c=10h}
  a-b, якщо a=b x={ c,якщо a<>b a=7Fh;b=04h;c=17h}
  a-b, якщо a>b x={ c,якщо a<=b a=25h;b=17h;c=0Fh}
  a-b, якщо a>b x={c,якщо a<=b a=17h;b=25h;c=7Fh}
  a-b, якщо a>b x={ c,якщо a<=b a=4Ah;b=4Ah;c=0}
  a-b, якщо a>=b x={ c,якщо a<b a=14h;b=12h;c=32h}
  a-b, якщо a>=b x={ c,якщо a<b a=28h;b=39h;c=41h}
  a-b, якщо a>=b x={ c,якщо a<b a=05h;b=05h;c=27h}
  a-b, якщо a<b x={ c,якщо a>=b a=55h;b=08h;c=14h}
  a-b, якщо a<b x={ c,якщо a>=b a=23h;b=45h;c=88h}
  a-b, якщо a<b x={ c,якщо a>=b a=40h;b=40h;c=12h}
  a-b, якщо a<=b x={ c,якщо a>b a=77h;b=29h;c=41h}
  a-b, якщо a<=b x={ c,якщо a>b a=12h;b=47h;c=0}
  a-b, якщо a<=b x={ c,якщо a>b a=99h;b=99h;c=21h}
  a-b, якщо a-b>0 x={ -(a-b),якщо a-b<=0 a=99h;b=13h}
  a-b, якщо a-b>0 x={ -(a-b),якщо a-b<=0 a=14h;b=79h}
  a-b, якщо a-b>0 x={ -(a-b),якщо a-b<=0 a=63h;b=63h}
  a-b, якщо b>0 x={ a+b,якщо b<=0 a=23h; b=8777h}
  a-b, якщо b>0 x={ a+b,якщо b<=0 a=44h;b=11h}
  a-b, якщо b>0 x={ a+b,якщо b<=0 a=95h; b=0}
  a+b, якщо немає переповнення x=0,якщо є переповнення a=7777h; b=6777h}
  a+b, якщо немає переповнення x=0,якщо є переповнення a=7777h; b=1000h}
  a-b, якщо a>b x={ b-a,якщо a<=b a=26h;b=49h}
  a-b, якщо a>b x={ b-a,якщо a<=b a=63h;b=0Ah}
  a-b, якщо a>b x={ b-a,якщо a<=b a=78h;b=78h}
  a+b, якщо немає переносу x={ 0,якщо є перенос a=A000h;b=8001h}
  a+b, якщо немає переносу x={ 0,якщо є перенос a=7777h; b=1000h}

 

3.1. Лабораторна робота N5. Організація циклічних процесів

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

 

КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

При створенні Вашої програми може виникнути необходимость повторити деяку послідовність команд задана кількість разів. Такий процес називається ЦИКЛІЧНИМ процессом.

Для організації циклічних процесів в Ассемблере существует команда LOOP. Крім того, цикли можна створювати, використовуючи команди умовних переходів. У лабораторній роботі N6 при описі команди JMP був наведений приклад нескінченного циклічного процесу. Реально нескінченні цикли не искористаються. При використанні команди LOOP кількість циклів (кількість повторень ділянки Вашої програми) задається в регістрі CX. У кожнім циклі команда LOOP автоматично зменшує вміст CX на 1. Поки значення CX не дорівнює нулю, керування передається за адресою, зазначеному в операнде команди LOOP. Коли CX стане рівним нулю, керування передається на наступну за LOOP команду.

Приклад 1.

1 0000 CODESG SEGMENT PARA 'Code'

2 ASSUME CS:CODESG,SS:CODESG,DS:CODESG

3 ORG 100H

4 0100 BEGІ PROC NEAR

5 0100 B8 0001 MOV AX, 1

6 0103 BB 0001 MOV BX, 1

7 0106 B9 000A MOV CX, 10

8 0109 A20:

9 0109 40 ІNC AX; AX+1

10 010A 03 D8 ADD BX, AX

11 010C E2 FB LOOP A20

12 010E C3 RET

13 010F BEGІ ENDP

14 010F CODESG ENDS

15 END BEGІ

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

Відстань від команди LOOP до мітки, заданої в качестве її опреанда, не повинно перевищувати -128 - +127 байт (періхід типу SHORT).

Додатково існують два різновиди команди LOOP - LOOPE(LOOPZ) і LOPNE(LOOPNZ). Обидві команди також зменшують значення CX на 1. Команда LOOPE (LOOPZ) передає керування за адресою операнда, якщо регістр має ненульове значення і прапор нуля встановлений (ZF=1). Команда LOONP(LOOPNZ) передає керування за адресою операнда, якщо регістр CX має ненульові значення і прапор нуля скинутий (ZF=0).

У прикладі 2 показано як організувати циклічний процесс за допомогою команди умовного переходу.

Приклад 2.

1 0000 CODESG SEGMENT PARA 'Code'

2 ASSUME CS:CODESG,SS:CODESG,DS:CODESG

3 ORG 100H

4 0100 BEGІ PROC NEAR

5 0100 B8 0001 MOV AX, 1

6 0103 BB 0001 MOV BX, 1

7 0106 BA 000A MOV DX, 10

8 0109 A20:

9 0109 40 ІNC AX

10 010A 03 D8 ADD BX, AX

11 010C 4A DEC DX; AX - 1

12 010D 75 FA JNZ A20

13 010F C3 RET

14 0110 BEGІ ENDP

15 0110 CODESG ENDS

16 END BEGІ

Для реалізації завдання N 4 Вам необхідно навчитися множити і поділяти константу на ступінь числа 2. Виконувати такие операції дометано за допомогою команд зсув.

ЗСУВ І ЦИКЛІЧНИЙ ЗСУВ РОЗРЯДІВ

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

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

На наступному малюнку показана дія 8 команд зсув і циклічного зсув для 8-розрядних операндов.

SHL (логічне беззнакове зсув вліво)

7 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|- 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

 

SHR (логічне беззнакове зсув вправо)

7 0

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

0 -і->|->|->|->|->|->|->|->|->|--і>| CF |

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

 

SAL (арифметичне зсув вліво)

7 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|- 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

 

SAR (арифметичне зсув вправо)

7 0

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

-і->|->|->|->|->|->|->|->|->|--і>| CF |

| -і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

| |

-і-і-і

ROL (циклічне зсув вліво)

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

| 7 0 |

-і-і-і | -і-і-і-і-і-і-і-і-і-і-і-і- |

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|<-і|

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

 

ROR (циклічне зсув вправо)

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

| 7 0 |

| -і-і-і-і-і-і-і-і-і-і-і-і- | -і-і-і

-і->|->|->|->|->|->|->|->|->|--і>| CF |

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

 

RCL (циклічне зсув вліво через прапор CF чи з переносом)

7 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|<-і-

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і- |

| |

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

 

RCR (циклічне зсув вправо через прапор CF чи з переносом)

 

7 0

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

-і->|->|->|->|->|->|->|->|->|--і>| CF |

| -і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

| |

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

Команди SHL і SHR абсолютно однакові.

В операнде-приемнике команд зсув знаходиться значення, підмет зрушенню. Після виконання команди в ньому ж буде знаходитися результат. В операнде-источнике повинне знаходитися число, на яке потрібно зрушити розряди. Дане число може бути задане як безпосереднє значення "1" чи як содержимое регістра CL.

Команда SAR зберігає знак операнда, репродукуючи його при виконанні зсув. Команда SAL не зберігає знак, але заносить "1" у прапор переповнення OF у випадку зміни знака операнда.

Нехай AL містить 0B4h, а CF=1, AL=1011 0100b

SAL AL,1; AL=0110 1000 CF=1

SAR AL,1; AL=1101 1010 CF=0

SHL AL,1; AL=0110 1000 CF=1

SHR AL,1; AL=0101 1010 CF=0

ROL AL,1; AL=0110 1001 CF=1

ROR AL,1; AL=0101 1010 CF=0

RCL AL,1; AL=0110 1001 CF=1

RCR AL,1; AL=1101 1010 CF=0

Зсув вправо на 1 еквівалентний розподілу на 2, зсув вправо на 1 - множенню на 2. Дана особливість може бути использована для множення і розподілу на часто зустрічаються константи, наприклад, на 2**n. При подвійному зрушенні вліво происходить множення на 4, при потрійному - на 8 і т.д.

SHR використовується для розподілу беззнакових чисел, SAR -для знакових. Множення за допомогою зсув є однаковим для знакових і беззнакових чисел, тому можна використовувати як SAL, так і SHL.

MOV CL,2

SHL AX,CL;помножити число без знака на 4

SAL AX,CL;помножити число зі знаком на 4

SHR AX,CL;розділити число без знака на 4

SAR AX,CL;розділити число зі знаком на 4

Кожна з цих команд з урахуванням завантаження CL виконується в 6-8 разів швидше відповідної команди чи множення розподіли.

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

Наприклад:

SHL AX,1;32-розрядне число в регістрах AX і DX

RCL DX,1;множимо на 2

 

ПІДГОТОВКА ДО РОБОТИ

1. Вивчити короткі теоретичні відомості і рекомендованну літературу.

2. Написати текст програми, що відповідає вашому варіанту завдання.

 

РОБОЧЕ ЗАВДАННЯ

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

 

ВИМОГА ДО ЗВІТУ

У звіті зафіксувати листинг файлу з налагодженої программой.

 

КОНТРОЛЬНІ ПИТАННЯ

1. Який тип переходу допускає команда LOOP.

2. Як можна організувати вкладені цикли.

3. При використанні для організації циклів команд умовного переходу де буде знаходитися лічильник циклів умовного переходу, де буде знаходитися лічильник циклів.

 

ВАРІАНТИ ЗАВДАНЬ

Обчислити наступні вирази.

Обчислення пpоводити з пеpевіpкою пеpеповнення pозpядної сітки.

 

ВАРІАНТЫ ЗАВДАНЬ

Обчислити наступні вирази. Обчислення пpоводити з пеpевіpкою пеpеповнення pозpядної сітки.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных