Текст оверлейної частини:
.286
dosseg
model small
.data
text_ov db 'Working overlay ... ',10,13 ,'$'
.code
overlay proc far
push ds
mov ax,@data
mov ds,ax
mov ah,09h
lea dx,text_ov
int 21h
pop ds
ret
overlay endp
end
Результат виконання програми:
!!! Working overlay ...
ВСЕ В ПОРЯДКЕ !
( Нажмите любую клавишу )
Оверлійна програма на мові програмування С/С++.
Опис програми: Програма виконує завантаження оверлейної частини програми. Виділення пам’яті під оверлей відбувається за допомогою функції С/С++ _dos_allocmem, звілнення – _dos_freemem, завантаження лверлейної частини за допомогою функції DOS 4B03h. На всюму шляху виконання програми відбувається контроль за роботю функцій і в разі чого програма аварійно закінчує свою роботу, з кодом завершення –1.
Текст програми.
#include <dos.h>
#include <conio.h>
#include <errno.h>
#include <stdio.h>
struct Param
{
unsigned int Seg,
Reloc;
}param;
#pragma argsused
int main (int argc,char* argv[])
{
clrscr();
char *OverPrgm = {"d:\\over#1.exe"};
unsigned int SegMemAray(0);
if (_dos_allocmem (0x64,&SegMemAray))
return -1;
unsigned int OFFOverPrgm = FP_OFF (OverPrgm);
unsigned int SEGOverPrgm = FP_SEG (OverPrgm);
unsigned int uiCF(0);
void (far *over) ();
int Error(0);
param.Seg = SegMemAray;
param.Reloc = SegMemAray;
over = (void (far *) ()) MK_FP(SegMemAray,0x0);
asm {
mov dx, OFFOverPrgm
mov ax, seg param
mov es, ax
mov bx, offset param
mov ax, 0x4B03
int 0x21
mov Error, ax
pushf
pop uiCF
}
uiCF = uiCF&0x01;
if (uiCF)
{
printf ("Erorr %d",Error);
return -1;
}
over ();
printf ("\nNow Control In Main Module./Press Any Key./");
getch ();
_dos_freemem (SegMemAray);
return 0;
}
Оверлійна частина таж сама, що і в попередньому випадку.
Результат виконання програми:
!!! Working overlay ...
Now Control In Main Module./Press Any Key./
Висновки: Було ознайомлено з механізмами розробки програми для роботи з оверлейними частинами програми як на язиці назького рівня так і на язиці високого рівня С/С++.
Лабораторна робота № 7
«Розробка резедентних програм»
Мета роботи: оволодіти основними методами побудови TSR-программ (TSR-Terminate,but Stay Resident).
Індивідуальне завдання: розробити програму, яка б ящо при амерефметичних операціях відбувалося переповненя змінювала непреривно декілька раз бордюр монітора.
Опис програми: програма переадресує переривання 04h, зоставлєя себе в пам’я ті в якості резедентної за допомогою функції 27h, знищуємо за допомогою функції 49h, переадресування переривання за допомогою функції DOS 35h. Адрес рідного приривання зберігаємо у змінній в необхідності відновлює.
Текстпрограммы:
.286
title RESIDENT (файл - .com)
int_tab segment at 0h
org 4h*4
vect_4h label dword
int_tab ends
;----------------------------------------
code segment
assume cs:code
org 100h
nach:
jmp init
;----------------------------------------
adr_res dd ?
old_4h dd ?
color db 0
kb_flag equ [byte ptr es:0417h]
text_1 db 10,13
db ' Вы только что загрузили в память вашу'
db 10,13,'резидентную программу.',10,13,'$'
text_2 db 10,13,' Вы пытаетесь загрузить вашу '
db 'резидентную программу, ',10,13
db 'но она уже в памяти содержится.'
db ' Для ее удаления запустите ',10,13
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.