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
Висновок: ознайомилися з принципом організації таблиці векторів переривань.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.