DOS надає наступні способи виводу даних на екран:
- використання функцій Int 21h (02h, 06h, 09h), що забезпечують посимвольний ввід з клавіатури в різних режимах;
- звертання до екрана, як до файла, за допомогою функції 40h.
· Функція 02h. Виведення одиничного символа.
Виводить символ, що знаходиться в регістрі DL, на екран. Для виводу стрічки функцію потрібно використати в циклі. Допускає перенаправлення виводу. Виконує обробку < Ctrl/С > при введенні цієї комбінації з клавіатури перед виводом кожного 64-го символа. Ця функція виводить і керуючі ASCII - символи з кодами 7, 8, 9, 0Ah, 0Dh. Символ з кодом 7 (bell, дзвінок) викликає звуковий сигнал, з кодом 8 (backspace)- повертає курсор на одну позицію ліворуч, з кодом 9 (tab, табуляція) - зміщає курсор на одну позицію праворуч, кратну 8. Дії керуючих клавіш з кодами 0Ah і 0Dh розглядалися раніше.
Виклик:AH=02h, Int 21h
Ввід:DL= ASCII -код символа
Вивід: AL= код останнього записаного символа (крім випадку, коли DL=09, тоді повертається значення 20h)
Використання даної функції розглянемо на прикладі процедури переходу на нову стрічку.
|
|
PROC | NewLine | |
push ax | ||
push dx | ||
mov ah, 2 | ;Запит функції 02h | |
mov dl, 13 | ;Повернення каретки | |
int 21h | ;Виклик DOS | |
mov dl, 10 | ;перевід стрічки | |
int 21h | ;Другий виклик DOS | |
pop dx | ||
pop ax | ||
ret | ||
ENDP | NewLine |
· Функція 09h. Вивід стрічки.
Виводить рядок символів на пристрій стандартного виводу (використовується в системних програмах для виведення на екран інформаційних повідомлень). Рядок повинен закінчуватися символом $ (код 24h), який служить ознакою кінця рядка, і сам не виводиться. Допускає перенаправлення виводу. У повідомлення можуть бути включені і керуючі коди (7, 8, 9, 0Ah, 0Dh), які викликають відповідні їм дії (див. функцію 02h). Функція виконує обробку < Ctrl/С > при введенні цієї комбінації з клавіатури перед виводом кожного 64-го символа.
Приклад використання.
Promt | DB | 'Name? $' |
lea dx, [Promt] | ;Адреса рядка Promt: DS:DX | |
mov ah, 09h | ;Запит функції 09h | |
int 21h | ;Виклик DOS |
Функція 40h. Вивід даних в файл або в пристрій.
Універсальна функція виводу даних з буфера користувача в сегменті даних в файл або на пристрій, дескриптор якого вказується в регістрі BX. Дескриптор 1, закріплений за стандартним пристроєм виводу, забезпечує перенаправлення виводу. Значення регістра CX визначає число байтів, які повинні бути виведені, а пара регістрів DS:DX вказує адресу даних, що виводяться. Керуючі коди 08h, 0Ah, 0Dh і деякі інші приводять до виконання відповідних їм дій. Після завершення виводу при CF=0 регістр AX містить число дійсно виведених байтів, а при CF=1 -поворотний код помилки. Як і при використанні функції 3Fh, це коди помилок 5 або 6. Приклад використання.
|
|
Out_Area | DB | 20 DUP(?) |
mov ah, 40h | ;Запит функції 40h | |
mov bx, 01 | ;Дескриптор дисплея | |
mov cx, 20 | ;Число байт, що пересилаються | |
lea dx, [Out_Area] | ;Адреса буфера для повідомлення | |
int 21h | ;Виклик DOS | |
mov cx, ax | ||
sub cx, 2 |
ЛАБОРАТОРНЕ ЗАВДАННЯ
1. Ознайомитись із змістом матеріалу роботи і відповідними тематичними розділами в літературі, що рекомендується. Отримати виконуваний EXE файл програми Demon.asm (Додаток A) і виконати дії з операторами перенаправлення вводу-виводу, а саме:
o Demon1.exe > File1.txt
o Demon1.exe < File2.txt
Файл File2.txt, що включає рядок символів, заздалегідь створити за допомогою будь-якого редактора.
2. Введення з клавіатури на екран довільний тексту з одночасним записом в буфер. Реалізувати елементи редагування: стирання останніх символів клавішею" ", контроль над великою буквою першого слова нового речення. При помилці мала буква замінюється прописною. Перехід на новий рядок здійснюється кл <Enter>. Управління: <F1>- виведення відредагованого тексту з буфера, <F10>- вихід з програми.
3. Демонстрація основної програми з можливим використанням операторів пере направлення
Текст програми
7.1) Що таке тупиковий стан? Перерахуєте умови, при яких виникає тупик.
Тупиковий стан - в широкому розумінні, зависанням є такий стан системи, в якому вона не може продовжувати роботу далі. В системах без часу, зависанням є стан системи, в якому вона не може виконати жодну дію. Однак, в автоматах з часом, переходи відповідають як плину часу, так і виконанню дій.
Тупиковий стан (зависання) - причинами зависання є помилки в програмуванні, частіше всього неправильне завершення циклів чи, в багатозадачних ОС, взаємне блокування процесів або неправильне використання пам'яті програмами, а також помилки в драйверах. Крім того, зависання може виникнути в результаті апаратного збою технічних засобів комп'ютера (наприклад, перегрів, пошкоджена оперативна пам'ять).
8.3) Що робить системний виклик fork()? Яким чином здійснюється в UNIX запуск нової задачі?
У Unix-системах, fork () - системний виклик, що створює новий процес (нащадок), який є майже точною копією процесу-батька, що виконує цей виклик. Між процесом-нащадком і процесом-батьком існують відмінності:
· PID процесу-нащадка відмінний від PID процесу-батька;
· значенням PPID процесу-нащадка присвоюється значення PID процесу-батька;
· Процес-нащадок отримує власну таблицю файлових дескрипторів, що є копією таблиці процесу-батька на момент виклику fork (). Це означає, що відкриті файли успадковуються, але якщо процес-нащадок, наприклад, закриє якийсь файл, то це не вплине на таблицю дескрипторів процесу-батька.
· для процесу-нащадка очищаються вcе очікують доставки сигнали;
· тимчасова статистика виконання процесу-нащадка в таблицях ОС обнуляється;
· блокування пам'яті і запису, встановлені в процесі-батьку, не успадковуються.
Після виклику fork () алгоритм зазвичай розгалужується (у разі успішного виконання функції fork () вона повертає PID процесу-нащадка батьківському процесу і нуль процесу-нащадку. Якщо породження процесу-нащадка закінчилося невдачею, функція fork () повертає значення -1).
Після fork () процес-нащадок найчастіше виконує системний виклик exec (), що завантажує в простір процесу нову програму (саме так, і тільки так, в Unix-системі виконується запуск програми в окремому процесі). Так, перший (нульовий) процес Unix (ядро системи) створює свою копію, щоб запустити init (процес з PID = 1), який в свою чергу створює дочірні процеси для запуску ініціалізації системи та терміналів.
Деякі програми створюють дочірні процеси не для запуску іншої програми, а для виконання паралельної завдання. Так, наприклад, надходять прості мережеві сервери - при приєднанні клієнта, сервер створює свою копію (дочірній процес), яка обслуговує клієнтське з'єднання і завершується за його закриття. Батьківський же процес продовжує очікувати нових сполук.
|
|
Виклик fork () виконується досить довго, тому що вимагає копіювання великої кількості даних. Для того щоб це обійти, деякі мережеві сервери (наприклад, веб-сервери Apache і Lighttpd), створюють дочірні процеси заздалегідь, щоб зменшити час відгуку сервера. Також існують «полегшені» реалізації fork (), що відображають в новий процес сторінки пам'яті батьківського, замість того щоб їх копіювати (нова сторінка створюється тільки при зміні її вмісту одним з процесів), що істотно знижує час створення нового процесу (т. зв. Copy -on-write).