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

                                                          PrintVec(intnum);

                                                          break;

                          }

  }

}

void PrintVec(int num)

{

int i,y;

  gotoxy(1,5);

  textattr(14);

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

  { y=wherey();

         printf("                                            \n");

         gotoxy(1,y);

         if ((num+i)<=0xff)

          {

                vect=readvect(num+i);

                printf("INT %02Xh - %Fp - ",num+i,vect);

                if (vect==NULL)

                 cprintf("%-16s","вўльний");

                else

                {intnum=num;

                 name_handler();}

                 printf("\n");

                }

          }

}

void name_handler(void)

{

int i;

char *s;

word tsegm;

  othersegm1=FP_SEG(vect);

  tsegm=memtop;

  do

  {

         csegm=tsegm;

         cMSB=(struct MSB *)MK_FP(csegm,0);

         tsegm=csegm+cMSB->size+1;

  }

  while((othersegm1>tsegm)&&(cMSB->type!='Z'));

  if ((cMSB->owner<memtop)||(cMSB->type=='Z'))

         printf("%-16s","Зайнятий BIOS/DOS ");

  else

          {  /* блок не належить DOS  */

                 othersegm=peek(cMSB->owner,0x2c);

                 fathersegm=peek(cMSB->owner,0x16);

                 /* /* якщо хозян сам собў   батько, то це   Command */

                 if (cMSB->owner==fathersegm)

                  printf("%-16s","COMMAND.COM");

                 else

                 { /* для ўншо програми дўзнаїмося  ўм'я  */

                  if (DOS >3)

                        {

                         eMSB=(struct MSB *)MK_FP(cMSB->owner-1,0);

                         for (i=0,s=eMSB->pgmname; i<8; i++)

                         {

                                if (*s>0)

                                 printf("%c",*(s++));

                                else

                                 printf(" ");

                         }

                         printf("%-8s"," ");

                        }

                  else

                         if (DOS >2)

                         { /* для DOS  3.0 й вище ўм`я - з рядка виклика */

                          eMSB=(struct MSB *)MK_FP(othersegm-1,0);

                          envsize=eMSB->size*16; /*розмўр оточення */

                          envstr=(char *)MK_FP(othersegm,0);

                          do

                                {

                                 envlen=strlen(envstr)+1;

                                 envstr+=envlen; envsize-=envlen;

                                }

                          while ((envlen>1)&&(envsize>0));

                          envstr+=2;

                          envsize-=2; /* 2 байта - кўльк.рядкўв */

                                if (envsize>0)

                                printf("%-16s",envstr);

                         }

                }

          }

}

void *readvect(int in) {

 union REGS rr; struct SREGS sr;

  rr.h.ah=0x35; rr.h.al=in; intDOS x(&rr,&rr,&sr);

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

}

void get_memtop(void){

  rr.h.ah=0x52;

  intDOS x(&rr,&rr,&sr);

  memtop=csegm=peek(sr.es,rr.x.bx-2);

}

Результат роботи

Номер  -   Адреса    -   Чим_занйятий

Int 00h - 0bb0 : 0125 - Tc_lab14

Int 01h - 0070 : 06f4 - Зайнятий BIOS/DOS

Int 02h - 03da : 0016 - Зайнятий BIOS/DOS

Int 03h - 0070 : 06f4 - Зайнятий BIOS/DOS

Int 04h - 0070 : 06f4 - Зайнятий BIOS/DOS

Int 05h - F000 : Ff54 - Зайнятий BIOS/DOS

Int 06h - F000 : Eb43 - Зайнятий BIOS/DOS

Int 07h - F000 : Eaeb - Зайнятий BIOS/DOS

Int 08h - 0acf : 013d - Copy_ecr

Int 09h - 0acf : 0117 - Copy_ecr

Int 0ah - 03da : 0057 - Зайнятий BIOS/DOS

Int 0bh - 03da : 006f - Зайнятий BIOS/DOS

Int 0ch - 03da : 0087 - Зайнятий BIOS/DOS

Int 0dh - 03da : 009f - Зайнятий BIOS/DOS

Int 0eh - 03da : 00b7 - Зайнятий BIOS/DOS

Int 0fh - 0070 : 06f4 - Зайнятий BIOS/DOS

Int 10h - 057a : 035b - Keyrus

Висновок: ознайомилися з принципом організації таблиці векторів переривань.