МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»
Лабораторна робота №11
з курсу «Системне програмне забезпечення»
на тему “Керування програмами”.
Виконав:
студент групи АП-30б
Попов О.С.
Перевірив:
Межерицький С.Г.
Тема: Керування програмами.
Мета: Вивчення принципів управління програми в MS – DOS та придбання практичних навиків роботи з префіксом програмного сегменту та його полями.
Постановка задачі: Розробити програму яка робить форматний вивід на друк свого префіксу програмного сегменту.
Структура програми: Програма складається з основної програми та 2 функцій - void get_dos_version_h (void) – функція, що повертає глобальній змінній dos_ver старше число номеру версії DOS. void addr_psp (void) – функція, що одержує сегментний адрес префіксу програмного сегменту програми і повертає його до глобальної змінної pid.
Опис змінних:
Змінні, глобальні для усієї програми
p_psp – покажчик на структуру struct Psp, що описує формат префіксу програмного сегменту (Psp);
pid – сегментна адреса Psp;
dos_ver – старше число номеру версії DOS;
i – допоміжна змінна, що використовується для перегляду таблиці файлів завдання (JFT);
l - допоміжна змінна, що використовується для висновку вмісту сегменту оточення Dos і визначення числа рядків виклику;
s – змінна, що спочатку використовується як покажчик на таблицю файлів завдання, а після цього як покажчик на рядки сегменту оточення і рядка виклику;
rr - змінна, що використовується для завдання значень регістру загального призначення за викликом переривання.
Префікс програмного сегменту у вигляді структури
struct psp
{ /* Формат PSP */
byte ret_op[2]; /*команда INT 20h*/
word end_of_mem; /*вершина доступної пам’яті*/
byte reserved1;
byte old_call_dos[5]; /*старий виклик DOS*/
void *term_ptr; /*адрес закінчення*/
void *ctrlbrk_ptr; /*адрес оброблювача Ctrl+Break*/
void *criterr_ptr; /*адрес оброблювача критичних помилок*/
word father_psp; /* PID батька*/
byte JFT[20]; /*таблиця файлів програми*/
word env_seg; /*адрес оточення*/
void *stack_ptr; /*адрес стеку*/
word JFT_size; /*розмір таблиці файлів*/
byte *JFT_ptr; /*адрес таблиці файлів*/
byte reserved2[24];
byte new_call_dos[3]; /*новий виклик DOS*/ } *p_psp;
Опис алгоритму програми.
Програма, здійснює форматний вивід свого префіксу програмного сегменту. Для початку необхідно визначити версію DOS (за допомогою функції get_DOS _version_h ( ) і одержати адресу Psp (за допомогою функції addr_psp ( ) ).
Функція get_DOS_version_h ( ) визначає старше число номеру версії DOS, використовуючи для цього функцію 30h DOS ( переривання 21h ), що повертає в регістр Al старше число номеру версії, а в регістр Ah - молодше число. Нас цікавить тільки значення регістру Al.
Функція addr_psp повертає сегментну адресу PSP шляхом використання функції DOS 62h :
Вхід : Ah = 62h
Вихід : Bx = сегментна адреса PSP поточного процесу
Результати виконання:
--------------- Лабораторна робота N11 ---------------
--------------- Керування програмами ---------------
Адрес PID = 0533
Команди:
--------
Закінчення - int 20h: CD 20 – командний код переривання Int 20h
Старий виклик DOS: 9A F0 FE 1D F0
Новий виклик DOS: CD 21 CB
Адреси:
-------
Кінець пам’яті: 9FFF:0000
Оброблювач закінчення: 0416:01DE
Оброблювач Ctrl+Break: 0416:014B
Оброблювач критичних помилок: 0416:0156
Стек: 0823:0FB2
Батько: 0416 – адреса породжуючої програми яка очікує код закінчення програми
Натисніть любу клавішу ...
OS2LIBPATH=C:\WINNT\system32\os2\dll;
PATH=C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 3 Stepping 1, AuthenticAMD
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0301
PROGRAMFILES=C:\PROGRA~1
PROMPT=$P$G
SYSTEMDRIVE=C:
SYSTEMROOT=C:\WINNT
TEMP=C:\WINNT\TEMP
TMP=C:\WINNT\TEMP
USERDOMAIN=SAIMON
USERNAME=Admin
USERPROFILE=C:\DOCUME~1\Admin
Число строк виклику: 1
C:\DOCUME~1\HAKERS\MAX\SPO\LABS\LAB_11.EXE
Для компіляції програми я використовую мову програмування Borland C++ 3.1 яка знаходиться у мене на диску С:\Program Files\Borlandc\Bin\bc.exe. Для виконання програми я повинен використовувати тип пам’яті Large , для чого я у опціях роблю такі настройки: Options\Compiler\Code generetion\ Large .
Батько: 0416 – адреса порождаючої програми яка очікує код закінчення програми, усі оброблювачі також знаходяться за тим же адресом, тому що вони повідомляють породжуваючу програму про не коректне закінчення програми, тому що нормальне закінчення програми відбувається за перериванням Int 20h. Батькою є Comand.com.
Поле ret_op використовується для можливого закінчення програми за командою Ret 0, поле old_call_dos містить команду виклику диспетчеру функцій DOS. Звертання до нього у програмі може використовуватися замість команди Int 21h.
При завантаженні програми – DOS, окрім програмного сегменту, створює для неї і сегмент оточення. Поле JFT представляє собою масив з 20 – ти однобайтних елементів.
У три поля: term_ptr, ctrbrk_ptr, criterr_ptr DOS завантажує зміст векторів преривання: 0х22, 0х23, 0х24, які представляють собою адрес оброблювачів закінчення програм, Ctrl+Break, критичної помилки.
Після всіх цих пунктів за допомогою описаних вище функцій ми отримуємо потрібні нам данні.
Висновок: в ході даної роботи я вивчив принципи керування програмами у MS-DOS і придбав практичні навики роботи з префіксом програмного сегменту і його полями.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.