Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASS_1_ukr.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
385.54 Кб
Скачать

Очищення екрану.

Запити та команди залишаються на екрані дісплею до тієї пори, доки вони не будуть зміщенні у результататі прокрутки (“скролінгу”) або не будуть перписані на тому ж місті іншими викликами та командами. Коли програма починає своє виконання, екран повинен бути очищений. Ділянка екрана, що очищується, може починатись у будь якій позиціїї екрана і закінчуватись у будь якій інший позтції з більшим номером.

Початкове значення рядка та стовбчика заноситься у регістр CX, кінцеве – у DX, значення 07 – у регістр BH, 0600h - в AX.

В наступному прикладі виконується очищення усього екрану.

MOV AX, 0600H ;AH=06 (прокрутка) AL=00 (увесь экран)

MOV BH, 07 ;нормальний атрибут (чорно/білий)

MOV CX, 0000 ;верхня лівая позиція (CH=00 - номер рядку,

;CL=00 - номер стовбчика)

MOV DX, 184FH ;нижня права позиція (DH=18 - номер

;рядку, DL=4F - номер стовбчика)

INT 10H ;передача керування в BIOS

ВСТАНОВЛЕННЯ КУРСОРА.

Команда Int 10h включає до себе встановлення курсора у будь яку позицію екрана. Нижче наведен приклад встановлення курсора у 5-ий рядок та 12-ий стовбчик.

MOV AH, 02 ;підфункція встановлення курсору

MOV BH, 00 ;екранна сторінка 0

MOV DH, 05 ;рядок 05

MOV DL, 12 ;стовбчик 12

INT 10H ;передача керування в BIOS

ВИВІД НА ЕКРАН У БАЗОВІЙ ВЕРСІЇ DOS.

Вивід на екран у базовій версії DOS потребує визначення текстового повідомлення у сегменті даних, встановлення у регістрі AH значення 09 (виклик функції DOS) і виклику команди Int 21h. В процесі виконання операції кінець повідомлення визначається обмежувачем (символ ‘$’), як показано нижче:

NAMPRMP DB 'Це повідомлення','$'

........

MOV AH, 09 ;підфункція відображення рядку на екрані

LEA DX, NAMPRMP ;завантаження адреси (зміщення) повідомлення у

;регістр DX

INT 21H ;виклик функції DOS

Знак обмежувача '$' можно записувати безпосередньо після символьного рядку, як показано у прикладі, усередені рядку “Це повідомлення$' або у наступній директиві DB '$'. Використовуючи цю операцію немає можливості вивести на екран символ долару. Якщо символ долару буде відсутнім у кінці повідомлення, що виводиться, то на екран будуть виводитись усі послідовні символи, доки знак '$' не зустрінеться у пам’яті.

Команда LEA завантажує адресу (зміщення) ділянки пам’яті у регістр DX для передачі у DOS адреси інформації, що виводиться.

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

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

        2. Написати текст програми, яка б очистила екран та вивела у центрі екрану номер вашої групи та вашу фамілію, ім’я та по-батькові.

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

Набрати, странслювати,скомпонувати та налагодити вашу програму.

!!! Пам’ятайте, що при налагоджуванні програми налагоджувачем td.exe для виконання команди переривання необхідно викоритовувати команду групового проходження F8.

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

  1. Що таке переривання.

  2. Що таке вектор перериваня.

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

  4. Що таке таблиця векторів переривань.

  5. Яка послідовність обробки переривання.

  6. Яка команда повинна стояти у кінці обробника переривання.

  7. Який номер програмного переривання для виводу на екран засобами BIOS.

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

ПРОЦЕДУРИ ТА МАКРОКОМАНДИ

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

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

При створенні вашої програми може виникнути необхідність у різних місцях програми виконувати тіж самі дії, можливо з різними даними. Ділянки програми, що повторюються, можна оформити у вигляді ПРОЦЕДУРИ. У цьому випадку послідовність кодів, що повторюється, буде описана у програмі один раз, а в тих місцях, де повинен стояти код процедури, буде стояти команда виклику процедури CALL. При опису процедури їй присвоюється ім’я. Під час визову процедури оператором команди CALL буде це ім’я.

Для опису процедури використовується директива PROC. Формат цієї директиви наведен у лабораторній роботі № 1. Нагадаємо, що в цій лабораторній роботі програма містила одну процедуру, яка була оформлена у вигляді:

BEGIN PROC FAR

; команди, що виконуються

RET

BEGIN ENDP

Оператор FAR інформував систему про те, що ця процедура може викликатись з іншого сегменту. Директива ENDP визначала кінець процедури.

Кодовий сегмент може містити будь яку кількість процедур. Типова організація багатопроцедурної програми наведена на малюнку 1.

Директиви PROC, що використовуються для опису процедур з іменами В10 та С10, мають тип NEAR, що вказує на те, що ці процедури можуть викликатись тільки з того ж кодового сегменту, у якому вони описані. Далі тип NEAR може бути опущений, тому що це є тип, що приймається за умовчуванням.

Кожній процедурі повинне присвоюватись унікальне ім’я, яке знаходиться у полі імені процедури (BEGIN, B10, C10). Починається опис кожної процедури директивою PROC, закінчується директивою ENDP. У кінці кожної процедури повинна стояти команда RET. Вона необхідна для передачі керування (повернення) у процедуру, що викликала нашу процедуру. Якщо ви не поставите команди RET у кінці вашої процедури, то після її завершення будуть виконуватись команди, що стоять у тексті програми за процедурою.

Для передачі керування в основній програмі BEGIN використовуються команди CALL B10 та CALL C10. В результаті виконання команди CALL B10 керування буде передано процедурі B10, будуть виконані команди, що містяться у описі процедури, і за командою RET керування буде передане в основну програму BEGIN на команду, наступну за CALL B10. Команда CALL C10 працює аналогічно.

Команда CALL у своєму виконанні автоматично заносить до стеку адресу команди, наступної за CALL (адресу повернення), і потім передає керування процедурі, що викликається.. Для процедури типу NEAR у стек заноситься зміщення команди, наступної за CALL, яке береться з регістру IP. Для процедури типу FAR до стеку заноситься сегмент і зміщення, які беруться з регістрів CS и IP. Команда RET добуває адресу повернення зі стеку та розміщує її у регістр IP для процедури типу NEAR або в регістри IP та CS для процедури типу FAR, тим самим повертаючи керування у викликаючу програму. Для вірного повернення з процедури до часу виконання команди RET вказівник стека повинен знаходитись у такому ж стані, як і відразу після виконання команди CALL. Пам’ятайте, що команди PUSH, PUSHF, CALL, INT, INTO заносять інформацію до стеку, а значить і зменшують вказівник стеку. Команди POP, POPF, RET, IRET добувають інформацію зі стеку і тим самим збільшують вказівник стеку. Наприклад, якщо ви у процедурі використали декілька команд PUSH, бажано виконати такуж кількість команд POP для відновлення вказівника стеку або відновити вказівник стек яким небудь іншим засобом.

У прикладі 1 наведен текст програми, що ілюструє дію програми, що виконується, на стек.

Приклад 1.

1 0000 STACKSG SEGMENT PARA STACK 'Stack'

2 0000 20*(????) DW 32 DUP(?)

3 0040 STACKSG ENDS

4

5 0000 CODESG SEGMENT PARA 'Code'

6 0000 BEGIN PROC FAR

7 ASSUME CS:CODESG, SS:STACKSG

8 0000 1E PUSH DS

9 0001 2B C0 SUB AX,AX

10 0003 50 PUSH AX

11 0004 E8 0001 CALL B10 ;Викликати B10

12 ; .............

13 0007 CB RET ;Завеpшити пpогpаму

14 0008 BEGIN ENDP

15 ;------------------------------------

16 0008 B10 PROC

17 0008 E8 0001 CALL C10 ;Викликати С10

18 ; .............

19 000B C3 RET ;Повернутися в

20 000C B10 ENDP ;викликаючу програму

21 ;-------------------------------------

22 000C C10 PROC

23 ; .....

24 000C C3 RET ;Повернутись у викликаючу програму

25 000D C10 ENDP

26 ;-------------------------------------

27 000D CODESG ENDS

28 END BEGIN

Якщо ви виконаєте трасування цієї програми, то побачите наступне. Поточною чарункою стеку, що доступна для занесення або добування є вершина стеку. Перша команда PUSH зменшує SP на 2 і заносить вміст DS (наприклад, 049F) у вершину стеку, тобто за зміщенням 003E. Друга команда PUSH також зменшує SP на 2 і записує вміст регістру AX (0000) за адресою 003C. Команда CALL B10 зменшує SP і записує зміщення наступної команди (0007) в стек за адресою 003A. Команда CALL C10 зменшує значення SP ї записує зміщення наступної команди (000B) в стек за адресою 0038. Під час повернення з процедури C10 команда RET добуває 000B зі стеку (за адресою 0038), записує його до IP і збільшує SP на 2. При цьому виконується автоматичне повернення на зміщення у кодовому сегменті 000B, тобто повернення у процедуру B10. Команда RET у кінці процедури B10 добуває адресу 0007 зі стеку (003A), і розміщує її у регістрі IP, збільшуючи при цьому SP на 2. Виконується автоматичне повернення на зміщення 0007 у кодовому сегменті. Команда RET за адресою 0007 завершує виконання програми, виконуючи повернення типу FAR.

На малюнку 2 показана дія на стек кожної команди. Наведен тільки вміст стеку за адресами 0034 - 003F і вміст регістр SP.

Малюнок 2.

Команда Стек SP

Початкове значення: xxxx xxxx xxxx xxxx xxxx xxxx 0040

PUSH DS (запис 049F) xxxx xxxx xxxx xxxx xxxx 049F 003E

PUSH AX (запис 0000) xxxx xxxx xxxx xxxx 0000 049F 003C

CALL B10 (запис 0007) xxxx xxxx xxxx 0007 0000 049F 003A

CALL C10 (запис 000B) xxxx xxxx 000В 0007 0000 049F 0038

RET (добування 000B) xxxx xxxx xxxx 0007 0000 049F 003A

R ET (добування 0007) xxxx xxxx xxxx xxxx 0000 049F 003C

Зміщення у стеці 0034 0036 0038 003A 003C 003E

.

Значення сегментних регістрів (CS, DS, SS) встановлюється під час завантаження програми у оперативну пам’ять.

МАКРОКОМАНДИ у чомусь подібні до процедур і представляють собою “міні – програми”, яки можна вставляти у похідні програми, просто вказуючи їх імена.

Макрокоманди – це послідовніть операторів на мові Асемблер (команд та директив Асемблера), які можуть декілька разів зустрічатись у програмі.

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

Хоча і макрокоманди, і процедури дають можливість короткого посилання на послідовність команд, що часто використо вується, між ними існують і відмінності. Коди команд процедури входять у об’єктний код програми один раз і процесор в процесі виконання програми передає їм керування (тобто викликає їх командою CALL) у разі необхідності. Навпаки, коди команд макрокоманди будуть включатися у об’єктний код стільки разів, скільки ми вкажемо її ім’я. Транслятор заміняє кожне ім’я макрокоманди на ті команди, які вона представляє. Кажуть, що транслятор “розширяє” макрокоманду. Таким чином, при виконанні програми процесор виконує команди макрокоманди безпосередньо, не передаючи керування у інше місце пам’яті, як в процедурі. Таким чином ІМ’Я МАКРОКОМАНДИ Є ДИРЕКТИВОЮ ТРАНСЛЯТОРУ, воно служить командою транслятору, а не процесору.

Порівняно з процедурами макрокоманди мають три переваги:

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

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

  3. Макрокоманди вожна ввести до бібліотеки, з якої потім програміст може добувати їх для складання інших програм.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]