Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКДО_СистПрог_2016.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.74 Mб
Скачать

5.2. Текст программы

/*----------------Лабораторная работа N12-----------------*/

/*------------------"Управление памятью"------------------*/

/* Типы данных */

#define byte unsigned char

#define word unsigned int

/* Подключение стандартных заголовков */

#include <dos.h>

#include <string.h>

void get_DOS_ver_h(void); /* получить номер версии DOS */

void print_head(void); /* вывод заголовка лаб. работы */

struct MCB { /* блок упpавления памятью */

char type; /* тип */

word owner,/* владелец */

size; /* размер */

byte reserved[3]; /* зарезервировано */

char pgmname[8]; /* имя программы, находящейся в данном блоке

( для DOS 4.0 и выше ) */

};

struct MCB *cmcb; /* адpес текущего MCB */

struct MCB *emcb; /* адpес MCB сpеды */

word memtop; /* сегм.адрес начала памяти */

word csegm; /* сегментный адpес текущего MCB */

word othersegm; /* сегм.адрес другого MCB */

word fathersegm; /* сегм.адрес родителя */

byte *envstr; /* адpес стpоки окружения */

int envlen; /* длина очередной строки окружения */

int envsize; /* размер блока окружения */

byte dos; /* номер версии DOS */

union REGS rr;

struct SREGS sr;

int i,n;

char *s;

void main()

{

print_head();

n=0; /* Число выведенных на экран блоков */

get_DOS_ver_h();

/* получить адрес системных блоков */

rr.h.ah=0x52;

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

/* получить адрес начала цепочки */

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

do {

cmcb=(struct MCB *)MK_FP(csegm,0);

textattr(14);

cprintf("Addr=%04X:0000 ",csegm);

textattr(13);

cprintf("PID=%04X ",cmcb->owner);

textattr(11);

cprintf("Size=%-6u ",cmcb->size*16);

n++;/* Счетчик выведенных блоков увеличить на 1 */

if (cmcb->owner==0)

{

textattr(15);

cprintf(" Free"); /* блок свободен */

}

else { /* блок занят */

/* блок принадлежит DOS ? */

if (cmcb->owner<memtop)

{

textattr(13);

cprintf(" Dos ");

}

else { /* блок не принадлежит DOS */

/* если PID хозяина указывает на текущий блок,

то это программный сегмент */

if (csegm==cmcb->owner-1)

{

textattr(10);

cprintf(" Pgm ");

}

else {

/* адpес блока сpеды для хозяина этого блока памя-

ти находится в PSP хозяина со смещением 0x2C */

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

/* адpес родителя для программы-хозяина этого бло-

ка находится в PSP хозяина со смещением 0x16 */

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

/* если на текущий блок указывает адрес окружения

хозяина, то это блок окружения */

if (csegm==othersegm-1)

{

textattr(11);

cprintf(" Env ");

}

/* иначе - это блок данных */

else

{

textattr(14);

cprintf(" Data ");

}

}

/* если хозяин сам себе родитель, то это COMMAND */

if (cmcb->owner==fathersegm)

{

textattr(13);

cprintf("COMMAND.COM");

}

else { /* для другой программы узнаем ее имя */

textattr(15);

if (dos>3) {

emcb=(struct MCB *)MK_FP(cmcb->owner-1,0);

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

{

if (*s>0)

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

else

printf(" ");

}

printf(" ");

}

if (dos>2)

{

/* для DOS 3.0 и выше имя - из строки вызова */

emcb=(struct MCB *)MK_FP(othersegm-1,0);

envsize=emcb->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 байта - кол.строк */

/* envstr - указатель на строку вызова */

if (envsize>0)

{

textattr(11);

cprintf("%s",envstr);

}

}

}

}

}

printf("\n");

csegm+=(cmcb->size+1); /* переход к следующему блоку */

if(n==20)

{ /* Весь экран занят информацией о блоках */

textattr(0x0a);

gotoxy(30,24);

cprintf("Нажмите любую клавишу");

getch();

n=0;

print_head();

}

}

while (cmcb->type!='Z'); /* выход по последн.блоку */

textattr(0x0a);

gotoxy(20,24);

cprintf("Нажмите любую клавишу для возврата в DOS.");

textattr(0x07);

getch();

clrscr();

}

/* получить номер версии DOS */

void get_DOS_ver_h(void)

{

rr.h.ah=0x30;

intdos(&rr,&rr);

dos=rr.h.al;

}

/* вывод заголовка лаб. работы */

void print_head(void)

{

textbackground(0);

clrscr();

textattr(0x0a);

cprintf("---------------");

cprintf(" Лабораторная работа N12 ");

cprintf("---------------");

cprintf("---------------");

cprintf(" Управление памятью ");

cprintf("---------------");

gotoxy(28,3);

textattr(13);

cprintf("Карта распределяемой памяти.\n\r");

}