Тестовий варіант програми складається з модуля-диспетчера і двох функціонально незалежних оверлейних модулів. Але врахована вимога, щоб використання директив опису сегментів було погодженим у всіх модулях програми. Пам'ять оверлею тут виділяється з використанням функцій 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.
#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;
}
Press any key..
Line arguments
arg[0]=D:\PROGRA~1\BORLANDC\ADMIN\POVER.EXE
Працює overlay ...
ВСЕ ГАРАЗД !
( Натисніть будь яку клавішу.. )
#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;
}
Press any key..
Line arguments
arg[0]=D:\PROGRA~1\BORLANDC\ADMIN\PWAIT.EXE
Працює overlay ...
ВСЕ ГАРАЗД !
( Натисніть будь яку клавішу..)
Отже я впевнився, що моя програма може передавати керування дочірньому процесу за допомогою функції Spawnl та її процесів P_WAIT, P_OVERLAY.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.