Списки в оперативній пам'яті, операції над списками. Керування програмами. Керування таймером. Системні керуючі блоки. Управління пам’яттю: таблиця векторів переривань, страница 15


Текст оверлейної частини:

           .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