ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Організація виведення інформації

При виконанні будь-якої програми здійснюється зчитування даних з клавіатури, виведення інформації на екран дисплея й обмін даними між програмою й іншими периферійними пристроями, підключеними до персональної ЕОМ. Для взаємодії з цими пристроями прикладна програма передає керування і необхідні параметри операційній системі MS-DOS. Керування передається модулю обробки переривань DOS чи базовій системі введення-виведення BIOS. У випадку DOS це здійснюється при виконанні команди INT 21H, а в випадку BIOS це відбувається за командою INT 10H. Надалі будемо використовувати тільки введення-виведення даних за допомогою модуля DOS.

Виконання команди INT 21H призводить до переривання, що дозволяє звернутися до функцій DOS призначених для обслуговування периферійних пристроїв і файлів системи. Вибір функції в програмі здійснюється за допомогою запису в регістр AH потрібного значення перед виконанням переривання 21H. При введенні (виведенні) даних також використовуються додаткові регістри, куди записуються введені (виведені) дані.

При виведенні інформації на екран дисплея дані поміщають в регістр AH і використовують функцію 6. Наприклад, для виведення на екран символу 'F' необхідні такі команди:

MOV AH, 6

MOV DL, 'F'

INT 21H .

Після появи символу 'F' на екрані курсор переміщається на одну позицію вправо. Потім керування повертається прикладній програмі і починається виконання команди, яка є наступною за командою INT 21H.

Для виведення на екран потрібного символу, в регістр DL потрібно помістити ASCІІ-код (вітчизняний аналог – код КОИ-7) цього символу. Кожен символ має свій 8-бітовий ASCІІ-код, наприклад, букві F відповідає код 01000110 або 46.

ASCІІ-код (КОИ-7) зручний для зовнішнього представлення даних, однак при роботі програми всі числа, що розташовані в комірках оперативної пам'яті, представлені в двійковому коді. Тому для обміну з периферійними пристроями двійкову інформацію необхідно перекодувати, тобто перетворити в символьну (для здійснення операцій виведення або введення).

Розглянемо докладніше особливості виведення на екран цифр.

Оскільки в ASCІІ-коді (КОИ-7) символи цифр від 0 до 9 мають послідовні десяткові коди від 48 до 57 відповідно, тому найпростіший спосіб перекодування полягає в додаванні до кожної цифри числа константи 48. Наприклад, якщо в регістрі AL знаходиться число в діапазоні від 0 до 9, тоді фрагмент програми виведення на екран цього числа буде мати вигляд:

ADD AL, 48

MOV DL, AL

MOV AH, 6

INT 21H

Далі будуть розглянуті варіанти виведення на екран довільного числа.

 

Приклад завершеної програми

 

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

 

NAME PROG1

SSTACK SEGMENT

DB 128 DUP(?)

SSTACK ENDS

DATA SEGMENT

M DB 30

N DB -15

P DB 9

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA, SS: SSTACK

START PROС FAR

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, DATA

MOV DS, AX

CALL MAIN

CALL OUTPUT

RET

START ENDP

MAIN PROС

MOV AL, M

ADD AL, N

SUB AL, P

INC AL

RET

MAIN ENDP

OUTPUT PROС

ADD AL, 48

MOV DL, AL

MOV AH, 6

INT 21H

RET

OUTPUT ENDP

CODE ENDS

END START

 

Програма PROG1 складається з трьох різних логічних сегментів SSTACK, DATA і CODE. Кожен сегмент починається з директиви SEGMENT і закінчується директивою ENDS, причому обидві директиви для одного і того ж сегменту мають однакові імена.

В сегменті SSTACK зарезервовано 128 байт.

В сегменті DATA визначені три змінні, котрі будуть використані в обчисленні заданого арифметичного виразу.

Сегмент CODE починається з директиви ASSUME, який повідомляє транслятору, що регістр CS буде містити базову адресу сегмента CODE, регістр DS – базову адресу сегмента DATA, а регістр SS – базову адресу сегмента SSTACK.

Сегмент CODE складається з трьох процедур: START, MAIN і OUTPUT. У процедурі MAIN відбувається обчислення арифметичного виразу Y=M+N-P+1.

В процедурі OUTPUT значення виразу, розташованого в регістрі AL, виводиться на екран дисплея. При цьому передбачається, що результат обчислення арифметичного виразу міститься в проміжку 0-9. Процедура START – містить ряд стандартних команд для обнулення акумулятора AX і ініціалізації регістра DS. Потім викликаються процедури MAIN, OUTPUT і керування передається операційній системі. Можливий і більш короткий варіант процедури START, якщо використати спеціальну функцію завершення програми 4CH переривання INT 21H:

 

START PROС FAR

CALL MAIN

CALL OUTPUT

MOV AH,4CH

INT 21H

RET

START ENDP

 

Порядок виконання роботи

 

 

- вивчити теоретичну частину лабораторної роботи;

- для заданого прикладу скласти текст програми мовою Асемблера і за допомогою текстового редактора ввести її в файл;

- виконати трансляцію та редагування зв‘язків і здійснити виконання програми вEXE -форматі ;

- отримати лістинг програми і оформити звіт по лабораторній роботі.

 

 

ЛАБОРАТОРНА РОБОТА №2

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

 

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

Непряма регістрова адресація

 

При непрямій регістровій адресації виконавча адреса операнда міститься в базовому регістрі BX, в регістрі покажчика бази BP або індексному регістрі (SI або DI). Непрямі регістрові операнди поміщають у квадратні дужки, щоб відрізнити їх від регістрових операндів. Наприклад, команда

MOV AX, [BX]

завантажує в регістр AX вміст комірки пам'яті, адресованої значенням регістра BX.

Для завантаження адреси комірки, наприклад, OBL у регістр BX можна використати команду:

LEA BX, OBL

Якщо необхідний доступ до декількох підряд розташованих комірок, починаючи з комірки OBL, тоді краще використовувати команду:

MOV BX, OFFSET OBL

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

- непряму базову адресацію;

- непряму індексну адресацію;

- непряму базову індексну адресацію.

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

 

Команди множення

 

Існує дві форми команд множення. Командою MUL перемножуються два цілих числа без знака, при цьому утворюється число без знака. За допомогою команди ІMUL перемножуються цілі числа зі знаком. При множенні цілих чисел за командою ІMUL в якості операндів використовуються числа, представлені в доповняльному коді, і утворюється результат у доповняльному коді з відповідним знаком.

Обидві команди перемножують як байти, так і слова.

Ці команди мають формат:

MUL джерело даних

ІMUL джерело даних,

де “джерело даних” – регістр загального призначення або комірка пам'яті розміром у байт чи слово. Як другий операнд обидві команди використовують вміст регістра AL (в операціях над байтами) або регістра AX (в операціях над словами). Добуток має подвійний розмір і при операціях з байтами міститься в регістрі AX, а в операціях зі словами – у регістрі DX (старше слово) і AX (молодше слово).

На рис. 6 показані можливі варіанти команди множення. Варто звернути увагу на те, що не дозволяється множення безпосереднього операнда (тобто числа).

Після виконання команди MUL прапорець перенесення CF і прапорець переповнення OF дорівнюють 0, якщо старша половина добутку дорівнює 0; в противному разі обидва ці прапорці дорівнюють 1. Іншими словами, прапорці CF і OF встановлюються в 1, якщо при множенні двох байтів результат перевищує 255, або якщо при множенні двох слів результат більший 65535.

 

 

Після виконання команди ІMUL прапорці CF і OF встановлюються в 1, якщо старша частина результату, що знаходяться в регістрах AH або DX, не є розширенням знаку молодшої половини результату (не містить 00 (0000) чи FF (FFFF) при множенні байтів (слів)).

Приклади команд множення:

MUL BX ; помножити BX на AX без знака

IMUL DL ; помножити DL на AL зі знаком

IMUL ALPHA ; помножити вміст слова пам'яті на AX зі знаком.

 

Команди ділення

Існує дві форми команди ділення. Команда DIV виконує ділення чисел без знака, а команда IDIV виконує ділення чисел зі знаком. При використанні команди IDIV вхідні дані і результат представляються в доповняльному коді.

Обидві команди працюють з байтами та словами і мають такий формат:

DIV джерело даних;

IDIV джерело даних,

де “джерело даних” – дільник розміром у байт або слово, що знаходиться в регістрі загального призначення чи в комірці пам'яті.

Ділене повинно мати подвійний розмір: воно розташоване в регістрах AH і AL (при діленні на байт) чи в регістрах DX і AX (при діленні на слово).

В результаті ділення утворюються два числа: частка і остача, які містяться в таких регістрах:

- якщо операнд-джерело є байтом, то частка розташована в регістрі AL, а остача – в регістрі AH;

- якщо операнд-джерело є словом, то частка розташована в регістрі AX, а остача – в регістрі DX.

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

Наприклад, потрібно поділити два числа, одне з яких (ділене) знаходиться в комірці М розміром у байт, а інше (дільник) – в комірці N розміром у байт:

M DB M

N DB N

Спочатку потрібно занести ділене у регістр AL. Далі в регістр AH потрібно занести доповняльний код нуля, тобто заповнити нулями (одиницями) регістр AH, якщо число в комірці M додатнє (від’ємне). Цю операцію найкраще виконати за допомогою спеціальної команди CBW, яка

 

Рисунок 7 - Команди ділення: а) ділення слів, ділення байтів.

 

перетворює байт в слово та копіює знак вмісту регістра AL у регістр AH. Таким чином, для ділення двох вказаних чисел M та N потрібно виконати такі команди:

MOV AL, M

CBW

DIV N

Подібний підхід використовується при діленні двох чисел, одне з яких (ділене) знаходиться в комірці P розміром у слово, а інше (дільник) – в комірці Q розміром у слово:

P DW M

Q DW N

В цьому випадку потрібно перетворити слово в подвійне слово за допомогою команди CWD. Тому для ділення двох вказаних чисел P та Q потрібно виконати такі команди:

MOV AX, P

CWD

DIV Q

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

- дільник дорівнює 0;

- при діленні байтів без знака ділене щонайменше в 256 разів перевищує дільник (тобто частка не вміщується в регістрі AL);

- при діленні слів без знака ділене щонайменше в 65536 разів перевищує дільник (тобто частка не вміщується в регістрі AX);

- при діленні байтів зі знаком частка лежить поза діапазоном від –128 до +127 (тобто частка не вміщується в регістрі AL);

- при діленні слів зі знаком частка лежить поза діапазоном від –32768 до 32767 (тобто частка не вміщується в регістрі AH).

 

Команди передачі керування

 

Команди зберігаються в послідовно розташованих комірках пам'яті, що дуже зручно при виконанні лінійних програм. На практиці обійтися тільки лінійними програмами неможливо. У програмах з розгалуженням і циклами, а також при організації підпрограм доводиться виконувати не наступну команду, а команду, яка знаходиться в іншій комірці програмної пам'яті, яка обумовлена адресою переходу. Спеціальні команди, що модифікують вміст регістра покажчика команд IP і регістра сегмента команд CS, називаються командами передачі керування.

Сегментна організація пам'яті визначає два основні різновиди команд передачі керування. Передача керування в межах поточного сегмента коду (програми) називається внутрішньосегментною – при цьому модифікується тільки регістр IP і адреса переходу представляється одним словом. Така передача керування називається ще близькою (тип NEAR), а її варіант зі скороченим діапазоном адрес переходів – короткою.

Передача керування за межі поточного сегмента коду називається міжсегментною – при цьому необхідно модифікувати вміст регістрів IP і CS і адреса переходу представляється двома словами (сегмент: зміщення). Дана передача керування називається ще далекою (тип FAR), тому що вона дозволяє перейти до будь-якої комірки адресного простору пам'яті.

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

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

 

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти