Керування програмами. Робота з префіксом програмного сегменту та його полями

Страницы работы

Содержание работы

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»

Кафедра “Обчислювальна техніка та програмування”

Лабораторна робота №11

з курсу «Системне програмне забезпечення»

на тему “Керування програмами”.

Виконав:             

                                 студент  групи АП-30б   

                                                 Попов О.С.

Перевірив:

       Межерицький С.Г.

Харків 2002

Тема: Керування програмами.

Мета: Вивчення принципів управління програми в 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 і придбав практичні навики роботи з префіксом програмного сегменту і його полями.

Похожие материалы

Информация о работе