Оверлеї. Завантаження дочірньої програми, страница 2

 Тестовий варіант програми складається з  модуля-диспетчера і двох функціонально незалежних оверлейних  модулів.  Але врахована вимога, щоб використання директив опису  сегментів було погодженим у всіх модулях програми. Пам'ять оверлею тут виділяється з використанням функцій MS-DOS. Виникнення помилки при виконанні будь-якої  задіяної функції супроводжується видачею  того  самого повідомлення. Локалізувати місце появи  помилки  можна  за  допомогою відладчика, наприклад, debug.exe. Шлях до кожному оверлею заздалегідь відтворений  у  сегменті даних модуля-диспетчера, але без указівки  повного  маршруту. Для забезпечення почергового залучення  оверлеєв використана перемінна k. У тестовому варіанті програми  використані  спрощені директиви  опису  сегментів.  Тому  тут  з'явилися невизначені явно в тексті нашої програми такі імена,  як dgroup, @data, _text,  що Ассемблер використовує в  відповідності з їх призначенням  по умовчанню.

Тексти програми - діспетчеру на мові Асемблер змінений для індивідуального завдання:

; Текст программы оверлейного диспетчера

           .286

           title     Оверлеи

           dosseg

           model     small

kol_para   equ       100h            ; Количество параграфов

sts_size   equ       100h            ; Количество байтов

sts_para   =         sts_size/16     ; Количество параграфов

           .stack    sts_size

           .data

path_1     db     'over1.exe',0   ; Путь к оверлею #1

path_2     db     'over2.exe',0   ; Путь к оверлею #2

blk_parm   dd     ?                  ; Блок параметров

error      db     '            Ошибка',10,13,'$'

ovr_para   dw     ?                  ; Номер начального пара-

Результати:

Працює overlay

ВСЕ ГАРАЗД!

(Натисніть будь яку клавішу...)

А тепер текст програми, який написан на мові С++ з використанням функції spawnl , яка завантажує диспетчер over.exe., з використанням P_wait, P_overlay.

P_OVERLAY

#include <stdlib.h>

#include <process.h>

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

void suck(void)

{clrscr();

 int result=spawnl(P_OVERLAY,"D:\\Hakers\\Max\\Spo\\Suck\\12345.exe",NULL);

  if (result==-1)

   {perror("Bad comand or file name");

     exit(1);

    }

}

int main(int argc,char*argv[])

{clrscr();

 cout<<"Press any key.."<<endl;

  getch();

  int i;

   cout<<"Line arguments"<<endl;

    for (i=0;i<argc;++i)

     printf("arg[%d]=%s\n",i,argv[i]);

  getch();

execlp("over.exe","over.exe",NULL);

 perror("ERROR");

 cout<<"WRONG"<<endl;

  suck();

   getch();

 return 0;

}

Результати виконання  spawnl (P_OVERLAY)

Press any key..

Line arguments

arg[0]=D:\PROGRA~1\BORLANDC\ADMIN\POVER.EXE

       Працює overlay ...

        ВСЕ ГАРАЗД !

   ( Натисніть будь яку клавішу.. )

P_WAIT

#include <stdlib.h>

#include <process.h>

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

void suck(void)

{clrscr();

  int result=spawnl(P_WAIT,"D:\\Hakers\\Max\\Spo\\Suck\\12345.exe",NULL);

  if (result==-1)

   {perror("Bad comand or file name");

     exit(1);

    }

}

int main(int argc,char*argv[])

{clrscr();

cout<<"Press any key.."<<endl;

  getch();

  int i;

   cout<<"Line arguments"<<endl;

    for (i=0;i<argc;++i)

     printf("arg[%d]=%s\n",i,argv[i]);

  getch();

execlp("over.exe","over.exe",NULL);

 perror("ERROR");

 cout<<"WRONG"<<endl;

  suck();

   getch();

 return 0;

}

Результати виконання  spawnl (P_WAIT)

Press any key..

Line arguments

arg[0]=D:\PROGRA~1\BORLANDC\ADMIN\PWAIT.EXE

        Працює overlay ...

        ВСЕ ГАРАЗД !

   ( Натисніть будь яку клавішу..)

Отже я впевнився, що моя програма може передавати керування дочірньому процесу за допомогою функції Spawnl та її процесів P_WAIT, P_OVERLAY.

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