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

  outportb(0x40,oldtic>>8);     /* Старший байт лiчильника */

  dd=3; /* EGA, 16 кольорiв */

  m=1;  /* Режим 640*350 */

  initgraph(&dd,&m,"f:\\my_work\\bc\\bgi");

  /* read result of initialization */

  errorcode = graphresult();

  if (errorcode != grOk)  /* помилка графiчного режиму */

  {

   printf("Graphics error: %s\n", grapherrormsg(errorcode));

   printf("Press any key to halt:");

   getch();

   exit(1);             /* аварiйне завершення */

  }

  setcolor(10);

  settextstyle(0,0,2);

  outtextxy(15,10,"RESULTS");

  setcolor(9);

  rectangle(15,40,624,330);

  setcolor(11);

  for(ny=0; ny<NN; ny++)

  {

   circle(22+ny*6,330-y[ny]*1,2);

   line(22+ny*6,330,22+ny*6,330-y[ny]*1);

  }

  setcolor(12);

  settextstyle(0,0,1);

  outtextxy(260,340,"Press Any Key For Exit ...");

  getch();

  closegraph();

}

void interrupt newtime()

{

  if (--kf<0) {

    /* Виклик oldtime - на 2-й раз */

    (*oldtime)();

    kf=3;

    }

  else /* iнакше - зкидання контролера */

    outportb(0x20,0x20);

  if ((ny>=0)      /* Якщо АЦП почалося, */

    &&(ny<NN))     /* та NN показань ще не набрано, */

      y[ny++]=yc;  /* запамятовування черегового показання */

}

void *readvect(int in)

{

  rr.h.ah=0x35; rr.h.al=in;

  intdosx(&rr,&rr,&sr);

  return(MK_FP(sr.es,rr.x.bx));

}

void writevect(int in, void *h)

{

  rr.h.ah=0x25;

  rr.h.al=in;

  sr.ds=FP_SEG(h);

  rr.x.dx=FP_OFF(h);

  intdosx(&rr,&rr,&sr);

}

Результат роботи програми:

Висновок: засвоїв функцiї системного таймера та закріпив  практичні навикі роботи з ним.


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

“Управління пам’яттю”

Мета роботи: вивчення розподiлу пам'ятi в операцiйнiй системi   MS DOS i отримання практичних навикiв роботи з блоками управлiння пам'яттю.

Постанова завдання: вивести на екран карту пам'ятi.

Опис змінних: змінні програми : p_MCB - адреса поточного керуючого блоку пам'ятi (MSB); p_EMCB - адреса керуючого блоку пам'ятi в якiй мiститься сегмент оточення програми; ui_Memtop -   сегментна адреса початку ланцюжка керуючих блокiв; ui_Seg -   сегментна адреса поточного керуючого блоку; ui_Other_Seg -   сегментна адреса блоку оточення хозяїна поточного блоку пам'ятi; ui_Father_Seg -   сегментна адреса батька для програми-хозяїна поточного блоку; uc_EnvStr - адреса рядка оточення для програми-хозяїна поточного блоку пам'ятi;i_EnvLen - довжина чергового рядка оточення; i -  допомїжна змiнна; n - число виведенних на екран рядкiв iнформацiї про блоки; s - покажчик на iм'я хозяїна блоку.

Опис алгоритму програми: за допомогою функцiї 52h DOS (переривання  21h) визначимо адресу системних керуючих блокiв :

Вхiд :   Ah   =   52h

Вихiд :   ES:BX - адреса 1-го блоку параметрiв диску.

Виконуючи віднімання з цiєї адреси 2, одержимо адресу того слова пам'ятi в якому DOS  зберiгає сегментну адресу першого керуючого блоку пам'ятi.

Кожен блок пам'ятi  контролюїться  Керуючим Блоком Пам'ятi (MSB - Memory   Control   Block ). MSB має фіксований pозміp 1 паpагpафа i фоpмат, який описуїться наступною   стpуктуpою :

struct MEMORY_CONTROL_BLOCK

{

                    char                c_Signature;

       unsigned     int                 ui_Owner_PID;

       unsigned     int                 ui_Size_Paras;

       unsigned     char                pc_Reserved[3];

                    char                str_Name_Of_Owner[8];

};

            Статтi c_Signature MSB мають у собі код, що показує, чи є цей MSB останнiм (код лiтери Z - 0x5a) чи  не останнiм (код лiтери M - 0x4d). Статтi   ui_Owner_PID мають у собі  Pid (сегментний адpес пpефікса пpогpамного сегменту)  пpогpамми, яким даний блок пам'ятi належить. Якщо значення цього поля нульове, то блок  вільний. Стаття ui_Size_Paras має pозміp блоку пам'ятi в паpагpафах (в це число не включений 1 паpагpаф, займаний самим   MSB ). Наступнi 3   байта (статтi pc_Reserved ) заpезеpвовані в усiх веpсiях. Статтi str_Name_Of_Owner заpезеpвipовано (не використовуїться ) в   веpсiях   DOS  нижче 4. 0. Починаючи iз   веpсiї 4. 0, в   MSB,тут записано iм'я (без pозшиpення) пpогpамми, що знаходиться в цьому сегментi (якщо довжина iм'я менше 8 символiв, воно закiнчується нульовим байтом ). Всi MSB ув'язані в ланцюжок. Одержавши за допомогою функцiї DOS 0x52 сегментну адресу початку ланцюжка  MSB   csegm, пересуваймося по ланцюжку. Перехiд до наступного блоку відбувається додаванням до адреси поточного MSB його поля ui_Size_Paras i ще 1. Перебір закiнчується при здобутку MSB зi значенням   'z' в статi   c_Signature.